【发布时间】:2011-01-05 19:08:41
【问题描述】:
单元测试的优势对我来说是显而易见的,它们由开发人员自己完成(测试或代码优先)并且是自动化的。
我有点不确定的是,当团队已经由一名专门的测试人员组成时,开发人员是否也应该进行集成测试,他们尽可能地自动化并对整个系统进行黑盒测试(端到端测试或更常见的术语验收测试)。
有关简短背景的更多详细信息:
示例集成测试(MVC webapp)
- 设置:只有控制器本身和控制器下面的层在测试设置期间被引导。没有任何东西被嘲笑或存根。
- 测试入口:裸控制器,通常控制器入口点是带参数的方法(例如 Spring MVC),可以本地执行。测试夹具期间不涉及浏览器
- 断言目标:模型数据和视图名称被断言为直接输出。也可以断言间接输出(例如写入数据库的数据)。渲染的有效负载(通常是 HTML)被完全忽略。
示例验收测试(MVC webapp)
- 设置:整个 web 应用程序都是自举的(就像从最终用户看到的那样)。
- 测试条目:HTTP 调用本身。浏览器可以作为测试执行者参与(例如Selenium)
- 断言目标:测试输出是完整呈现的响应(HTML 和其他工件,如 javascript)。也可以包括数据库上的断言(例如插入的数据)。
双重测试的陷阱(集成 + 验收)
当同时包含这两种测试样式时,我发现了主要问题:
- 控制器测试接近一般系统行为(例如提交登录表单、密码验证、成功登录)。这与验收测试所做的非常接近。最终可能会发生“双重测试”,这是非常低效的。
- 控制器是更多的白盒测试并且往往很脆弱,因为它们依赖于较低层的许多依赖项(与非常细粒度的单元测试不同)。由于这种设置维护控制器测试的工作量很大,整个应用程序作为黑盒启动的验收测试更简单,并且更接近生产。
以上两点使我得出结论,如果您的测试人员有良好的自动化策略,您应该跳过开发人员完成的集成测试。他们应该更多地关注单元测试。
你怎么看?你能解释一下你的测试策略吗?您是否有包括两种测试方式在内的好/坏经历?
感谢您阅读我的长问题;)
编辑:验收测试似乎更常见的术语是端到端,所以我改变了术语。
【问题讨论】:
-
“集成测试”一词可以涵盖多种不同类型的测试。这可能有助于澄清你在这种情况下所说的“集成测试”是什么意思。
-
嗯,虽然我在上面举了一个例子(webapp控制器测试)...
-
在我的示例中,我的集成测试正在接触一个将参数传递给控制器的测试。下面的所有服务都没有被嘲笑或存根。
标签: unit-testing testing tdd integration-testing