单元测试和验收测试是否足够?

时间:2009-05-18 13:46:15

标签: unit-testing automated-tests integration-testing acceptance-testing

如果我对每个类和/或成员函数进行单元测试以及每个用户故事的验收测试,我是否有足够的测试来确保项目按预期运行?

例如,如果我有功能的单元测试和验收测试,我还需要集成测试,还是单元和验收测试应该覆盖相同的地面?测试类型之间是否有重叠?

我在这里谈论自动化测试。我知道仍然需要手动测试,比如易用性等等。

12 个答案:

答案 0 :(得分:13)

  

如果我对每个类和/或成员函数进行单元测试以及每个用户故事的验收测试,我是否有足够的测试来确保项目按预期运行?

没有。测试只能验证您的想法。不是你没有想到的。

答案 1 :(得分:8)

多个测试周期的想法是在事情发生变化时尽早发现问题。

开发人员应进行单元测试,以确保单元孤立地工作

验收测试应由客户进行,以确保系统符合要求。

然而,在应该测试的两点之间发生了一些变化。这是在将产品交付给客户之前将单元集成到产品中。

这应该首先由产品创建者而不是客户端进行测试。你赢得客户端的那一刻,事情就会变慢,所以你可以做更多的修复工作,然后再把它们拿到肮脏的小手上,就越好。

在大型商店(如我们的商店)中,在可交付产品发生变化的每个点都有单元测试,集成测试,全球化测试,主构建测试等。只有修复了所有高严重性错误(以及修复低优先级错误的计划),我们才会将产品释放给我们的测试版客户端。

我们想要给他们一个狡猾的产品只是因为在那个阶段修复一个错误比我们在内部做的任何事情都要昂贵得多(特别是在管理方面)。

答案 2 :(得分:8)

我建议阅读2nd edition of Code Complete中的第20 - 22章。它很好地涵盖了软件质量。

以下是一些关键点的快速细分(所有信用都归功于McConnell,2004)

Chapter 20 - 软件质量格局:

  • 单一的缺陷检测技术本身并不完全有效
  • 越早发现缺陷,代码的其余部分就会越少交织,造成的损害就越少

Chapter 21 - 协作建设:

  • 协作开发实践往往会发现比测试更高的缺陷百分比并更有效地找到它们
  • 协作开发实践往往会发现不同于测试的错误,这意味着您需要同时使用评论和测试来确保软件的质量。
  • 结对编程的成本通常与检查大致相同,并产生类似的质量代码

Chapter 22 - 开发人员测试:

  • 自动化测试通常很有用,对于回归测试至关重要
  • 改善测试过程的最佳方法是使其经常化,测量并使用您学到的知识来改进测试过程
  • 在代码之前编写测试用例需要花费相同的时间和精力,但是它会缩短缺陷检测 - 调试 - 修正 - 循环(测试驱动开发)

就您如何制定单元测试而言,您应该考虑基础测试,数据流分析,边界分析等。所有这些都在本书中详细解释(其中还包括许多其他参考资料以供进一步阅读)。

也许这不是你所要求的,但我会说自动化测试绝对不足以成为一种策略。您还应该考虑结对编程,正式评审(或非正式评审,取决于项目规模)和测试脚手架以及自动测试(单元测试,回归测试等)。

答案 3 :(得分:3)

根据您是否对每种方法和功能进行测试,真的不可能知道您是否有足够的测试。通常,我会将测试与覆盖率分析结合起来,以确保在我的单元测试中运行所有代码路径。即使这还不够,但它可以作为您可能引入未经测试运行的代码的指南。这应该表明需要编写更多的测试,或者如果你正在进行TDD,你需要放慢脚步并加强自律。 : - )

测试应涵盖好的和坏的路径,特别是在单元测试中。您的验收测试可能或多或少地关注不良路径行为,但至少应该解决可能出现的常见错误。根据您的故事的完整程度,验收测试可能也可能不够。通常在验收测试和故事之间存在多对一的关系。如果您对每个故事只有一个自动验收测试,除非您有其他故事的不同故事,否则您可能没有足够的。

答案 4 :(得分:2)

多层测试非常有用。单元测试以确保碎片表现;整合表明合作单位的集群按预期合作,“接受”测试表明该计划按预期运作。每个人都可以在开发期间发现问重叠本身并不是一件坏事,尽管它太多都会浪费。

那就是说,可悲的事实是,你永远无法确保产品的行为“按预期”,因为期望是一种变幻无常,人性化的东西,很难被翻译成纸。良好的测试覆盖率不会阻止客户说“这不是我想到的......”。频繁的反馈循环有助于此。考虑将频繁演示作为“健全性测试”添加到您的手动混音中。

答案 5 :(得分:1)

可能不是,除非你的软件非常简单并且只有一个组件。

单元测试非常具体,你应该用它们完全覆盖所有内容。在这里寻求高代码覆盖率。但是,它们一次只涵盖一个功能,而不是如何协同工作。验收测试应该只涵盖客户在高层次上真正关心的内容,虽然它会在一起工作的过程中发现一些错误,但是由于编写此类测试的人不会深入了解系统,因此无法捕获所有内容。

最重要的是,这些测试可能不是由测试人员编写的。单元测试应由开发人员编写并由开发人员(最好是每隔几分钟,具体取决于编码风格)运行(理想情况下也由构建系统)。验收测试通常由客户或代表客户的人编写,考虑对客户有何影响。但是,您还需要由测试人员编写的测试,像测试人员一样思考(而不是像开发人员或客户)。

您还应该考虑以下类型的测试,这些测试通常由测试人员编写:

  • 功能测试,涵盖功能部分。这可能包括API测试和组件级测试。您通常也希望在此处获得良好的代码覆盖率。
  • 集成测试,将两个或多个组件放在一起以确保它们一起工作。例如,当另一个组件需要对象的计数(“第n个对象”,即从1开始)时,您不希望一个组件在对象所在的数组中放置位置(从0开始)。在这里,重点不在于代码覆盖,而在于组件之间接口(通用接口,而不是代码接口)的覆盖范围。
  • 系统级测试,您可以将所有内容放在一起,并确保它能够端到端地工作。
  • 测试非功能性功能,如性能,可靠性,可伸缩性,安全性和用户友好性(还有其他功能;并非所有功能都与每个项目相关)。

答案 6 :(得分:0)

集成测试适用于您的代码与其他系统(如第三方应用程序)或其他内部系统(如环境,数据库等)集成的情况。使用集成测试来确保代码的行为仍然符合预期。 / p>

答案 7 :(得分:0)

简而言之

首先,您的故事卡应该有验收标准。也就是说,产品所有者指定的验收标准与分析员一起指定所需的行为,如果符合,则会接受故事卡。

验收标准应该推动自动化单元测试(通过TDD完成)和应该每天运行的自动化回归/功能测试。请记住,我们希望将缺陷移到左侧,也就是说,我们越早发现它们的价格越低越好。此外,连续测试使我们能够充满信心地进行重构。这是保持可持续发展步伐所必需的。

此外,您还需要自动化性能测试。每天或隔夜运行一个分析器可以深入了解CPU和内存的消耗以及是否存在任何内存泄漏。此外,像loadrunner这样的工具将使您能够在系统上放置反映实际使用情况的负载。您将能够测量生产中的响应时间和CPU和内存消耗,例如运行loadrunner的机器。

自动化性能测试应反映应用的实际使用情况。您可以测量业务事务的数量(即,如果Web应用程序单击页面以及对用户的响应或往返服务器)。并确定这种交易的混合以及它们每秒到达的数量。这些信息将使您能够正确设计性能测试应用程序所需的自动loadrunner测试。通常情况下,一些性能问题将追溯到应用程序的实现,而其他性能问题将由服务器环境的配置决定。

请记住,您的应用程序将进行性能测试。问题是,第一次性能测试是在您发布软件之前或之后发生的。相信我,产生性能问题的最糟糕的地方就是生产。性能问题可能是最难修复的,并且可能导致部署到所有用户失败,从而取消项目。

最后,还有用户验收测试(UAT)。这些是由生产所有者/业务合作伙伴设计的测试,用于在发布之前测试整个系统。通常,由于所有其他测试,应用程序在UAT期间返回零缺陷并不罕见。

答案 8 :(得分:0)

这取决于您的系统有多复杂。如果您的验收测试(满足客户要求)从前到后锻炼您的系统,那么您不需要。

但是,如果您的产品依赖于其他层(如后端中间件/数据库),那么您确实需要一个测试来证明您的产品可以愉快地端到端地连接。

正如其他人所评论的那样,测试并不一定能证明项目的功能符合预期,只是证明了它的工作方式。

频繁的反馈循环给客户和/或以客户理解的方式编写/解析的测试(例如在BDD style中)可以提供帮助。

答案 9 :(得分:0)

从技术上讲,完整的验收测试应涵盖所有内容。话虽如此,对于大多数足够的定义,它们并不“足够”。通过单元测试和集成测试,您可以更早地以更本地化的方式捕获错误/问题,从而更容易分析和修复。

考虑一整套手动执行的测试,并在纸上写下指示,足以验证一切都按预期工作。但是,如果您可以自动化测试,那么您会更好,因为它使测试变得更加容易。纸质版本是“完整的”,但不是“足够”。同样,每一层测试都会增加“足够”的值。

值得注意的是,不同的测试集合倾向于从不同的“观点”测试产品/代码。 QA可能会采用与从未想过要测试的错误相同的方式,一组测试可能会找到另一组测试中没有的错误。

答案 10 :(得分:0)

  

如果我对每个班级进行单元测试   和/或成员功能和接受   我有每个用户故事的测试   足够的测试来确保项目   按预期运作?

这足以证明您的软件功能正确,至少与您的测试覆盖率足够相同。现在,根据您正在开发的内容,确实存在重要的非功能性需求,请考虑可靠性,性能和可扩展性。

答案 11 :(得分:0)

如果手头的系统很小,客户甚至可以手动进行验收测试。

单元和小型集成测试(包括类似测试的单元)可供您构建可持续系统。

不要尝试为系统的每个部分编写测试。那是脆弱的(容易破碎)和压倒性的。

决定系统的关键部分需要花费太多时间来手动测试和编写仅针对这些部分的验收测试,以便让每个人都能轻松完成。