自动化测试:模拟与创建测试对象图(使用IoC容器),在什么条件下更好?

时间:2009-04-06 09:30:23

标签: unit-testing inversion-of-control mocking automated-tests

您如何决定选择什么:

  1. 使用模拟对象进行测试或
  2. 使用IoC框架创建测试对象/对象图并对该数据运行测试

4 个答案:

答案 0 :(得分:2)

这取决于您要测试的内容。与合作者嘲笑的单元测试非常好,因为

  • 他们真的非常非常快
  • 它们小而且易于理解
  • 他们没有依赖更广泛的世界,这使他们更容易运行
  • 它们提供了出色的缺陷定位

然而,纯单元测试无法告诉您是否已在IoC容器中正确配置对象,如果数据库连接字符串正常工作等。您需要一个测试来运行您的IoC容器并真正接触到Db来证明这些东西。

如果您尽可能多地编写测试作为纯粹的独立单元测试,那么您的构建将保持快速。这是至关重要的,因为缓慢的减少会减少。即便如此,也不要忘记添加一些有线测试来证明你的应用程序“在一起”。

例如,我们对容器中的每个服务都进行了(单个)测试,证明我们可以从IoC容器中请求它。这证明我们已经接通了,从那时起它就是单元测试。我们有很多纯粹的单元测试。

然后将整个批次包含在一些应用程序级别的功能测试中,以证明应用程序本身可以满足用户的需求。

要记住的是每种测试类型的时间成本。从纯单位移动 - >有线 - >功能测试在中断时会花费一个数量级的执行时间和复杂性。

答案 1 :(得分:1)

我很高兴在我的应用程序中使用IoC,特别是我感谢可以注入测试数据源进行测试。

对于更有问题的后端连接(当前是单个ESB调用)或需要复杂状态的函数,我会模拟。

答案 2 :(得分:1)

对于单元测试:如果对象不是测试对象,则模拟或存根。 这样,您可以直接控制它,以便返回您想要的数据。

如果您创建测试对象/对象图,则必须将其设置,以便它提供您想要的数据。这可能比你想要的工作多得多。

对于集成测试,您当然要一次测试整个对象图。

答案 3 :(得分:0)

如果你需要编写很多初始化代码 - 一个模拟框架可能会帮助你编写更好,更易于理解的单元测试。

无需重新编写模拟框架可以为您节省的代码。

相关问题