【发布时间】:2012-06-21 21:48:49
【问题描述】:
假设我正在使用现有代码库中的一些代码开发新功能。 我正在测试我的设计,所以我对我的功能部件进行了独立的测试,使用 stubbed/mocked 的合作者。现在我想测试一下他们是否一起玩得很好。
我是否应该编写一个大型测试,将所有真正的依赖关系连接在一起(除了一些外部系统等)?换句话说,我应该为整个故事编写集成测试,还是将它分成几个较小的部分,测试让我们说 3-4 个对象一起玩只是这个故事的一部分?然后我最终会从头到尾为整个功能编写测试。但是我应该在一个测试用例中执行多少个对象的协作?
如果是后者,我需要准备设置(连接依赖关系,其中一些存根),为每个测试准备测试数据和预期条件。现在往上走(在更高层次上对越来越多的模块进行分组)我仍然需要以某种方式“复制”这个准备步骤。 这种“重复”不好吗?
我说的是“测试级别”,如下所示:
---------------------------------------------------------------
| ------------------------------------
|| ------ ------ |
|| |unit| |unit| units integration |
|| ------ ------ |
|------------------------------------- integration of some
| already integrated
|------------------------------------- units, etc
|| ------ ------ |
|| |unit| |unit| units integration |
|| ------ ------ |
|-------------------------------------
|---------------------------------------------------------------
正如“经典”(而不是“嘲笑者”)TDD 从业者所说,我应该尽可能多地使用真正的实现。但是然后测试具有 3 级依赖关系并最终具有数据库或外部系统的对象意味着我仍然必须存根/模拟某些东西。那么我应该在最后只模拟这个繁重的/外部服务吗?
提出这个问题的触发因素是,保持我所有的测试得到维护变得越来越困难,我认为我在某个地方失败了。代码中的每一次中等更改都会导致大量测试失败。我想知道我做错了什么。
提前感谢所有提示和答案。
【问题讨论】:
-
如果你在做 TDD,你的测试应该会失败。您先更改测试,然后更改代码直到通过。
标签: mocking tdd integration-testing