Unit testing 集成和验收测试的效率陷阱(自动化)
单元测试的优点对我来说是显而易见的,它们是由开发人员自己完成的(测试或代码优先),并且是自动化的 我有点不确定的是,当团队已经由一个专门的测试人员组成时,开发人员是否也应该进行集成测试,这个测试人员会尽可能地自动化整个系统并进行黑盒测试(端到端测试或更常见的验收测试) 有关简短的背景信息和更多详细信息: 集成测试示例(MVC webapp)Unit testing 集成和验收测试的效率陷阱(自动化),unit-testing,testing,tdd,integration-testing,Unit Testing,Testing,Tdd,Integration Testing,单元测试的优点对我来说是显而易见的,它们是由开发人员自己完成的(测试或代码优先),并且是自动化的 我有点不确定的是,当团队已经由一个专门的测试人员组成时,开发人员是否也应该进行集成测试,这个测试人员会尽可能地自动化整个系统并进行黑盒测试(端到端测试或更常见的验收测试) 有关简短的背景信息和更多详细信息: 集成测试示例(MVC webapp) 设置:在测试设置期间,仅引导控制器本身和控制器下面的层。没有任何东西是被嘲弄或存根的 测试入口:裸控制器,大多数情况下控制器入口点是带有参数的方法(例如S
- 设置:在测试设置期间,仅引导控制器本身和控制器下面的层。没有任何东西是被嘲弄或存根的
- 测试入口:裸控制器,大多数情况下控制器入口点是带有参数的方法(例如Spring MVC),可以在本地执行。测试夹具期间不涉及浏览器
- 断言目标:模型数据和视图名称被断言为直接输出。也可以断言间接输出(例如写入数据库的数据)。呈现的负载(通常是HTML)被完全忽略李>
- 设置:整个webapp都是引导的(就像从最终用户那里看到的一样)
- 测试条目:HTTP调用本身。浏览器可以作为测试执行者参与(例如)
- 断言目标:测试输出是完整的呈现响应(HTML和其他工件,如javascript)。还可以包括数据库上的断言(例如插入的数据)
- 控制器测试接近一般系统行为(例如提交登录表单、密码验证、成功登录)。这与验收测试非常接近。最终可能会发生“双重测试”,这是非常低效的李>
- 控制器是更多的白盒测试,并且往往很脆弱,因为它们依赖于较低层的许多依赖关系(与非常细粒度的单元测试不同)。由于这种设置维护控制器测试的工作量很大,所以在整个应用程序作为黑盒启动的情况下进行验收测试更简单,并且更接近生产
编辑:验收测试似乎是端到端更常见的术语,因此我切换了术语。集成测试(以及,实际上,单元测试)也通过系统测试测试,通过缩小缺陷的位置,有助于调试。如果您的系统有组件A-B-C且未通过系统测试用例,但组件A-B通过了类似的集成测试用例,则缺陷可能在组件C中,我们在我的工作中接受TDD 当我刚开始工作时,有人告诉我,只要工作能够及时、可预测地完成,我就可以实施我想要的任何政策。在过去做过单元测试之后,我意识到我们经常遇到的问题之一是集成bug。有些可能需要相当长的时间来修复,而且往往是一个惊喜。在扩展应用程序的功能时,我们会遇到我们引入的一些微妙的错误 我决定通过更多地关注我们应该提供的最终结果特性来避免我在过去遇到的那些问题。我们将编写测试验收行为的测试,不仅在单元级别,而且在整个系统级别。我之所以想这样做,是因为在一天结束时,我不关心设备是否正常工作,而是关心整个系统是否正常工作。我们发现进行自动化验收测试有以下好处
- 我们从不回归最终用户功能,因为它是经过明确测试的
- 重构更容易,因为我们不必更新大量的单元测试。我们只需要确保我们的验收测试仍然通过李>
- 隐含地涵盖了“单元”的集成
- 测试成为所需最终用户功能的非常明确的定义
- 集成问题在更早的时候就暴露出来了,因此也就不那么令人惊讶了
- 就模拟、存根、固定装置等的使用而言,测试可能更加复杂
- 测试对于缩小哪个“单元”存在缺陷的范围来说用处不大