关于单元测试中的依赖关系

时间:2011-10-12 11:17:20

标签: unit-testing testing dependencies

我是单元测试的新手,但往往认为我相信编写精美的代码和设计合理的架构。

我的问题是。单元测试是不是过多地关注对象之间的依赖关系?当你的单元测试失败时你会怎么做因为你的方法用来调用befor的依赖关系不再被调用(设计决定)或者你的方法调用另一个方法或依赖项(再次是一个设计决策)你重新设计测试了吗?如果是这种情况,那么单元测试对于减少耦合并提高组件之间的内聚力几乎没有帮助。

也许我的观点过于宽泛,但一般来说,人们如何在适当的单元测试中处理依赖关系。我想最好的方法是根本没有依赖关系,并且每个方法都依赖于给它的参数,但实际情况并非如此。此外,为每个可能的调用伪造每个依赖方法也有点主观和时间浪费,因为在未来的时间点,被测试的类可能根本不再需要依赖。

3 个答案:

答案 0 :(得分:2)

我建议你看一下测试驱动开发(TDD),因为我相信这种技术将帮助您设计问题。通过在编写生产代码之前编写单元测试,您需要考虑如何使您的生产代码可测试。这是更好的那么测试后一种方法,你先写产品代码,然后尝试鞋拔测试他们身边。

要处理依赖关系,请考虑哪些依赖关系会导致问题。

外部依赖

如果您的测试使用外部资源(例如文件),那么您正在编写集成测试,而不是单元测试。我写了很多使用外部文件的测试,我只是在我的测试项目中创建了该文件的副本。此文件副本将包含我的测试所需的虚拟数据。

如果您的测试需要数据库,那么再次编写集成测试。我个人在PC上创建了一个数据库的本地副本,然后对它进行测试。

对象依赖

如果你担心代码依赖性(例如,如果私有方法的签名改变您的测试将失败),那么你在错误的抽象水平测试。我的意思是确保你的测试是调用公共API而不是私有API。为了巩固这一点,使用interfaces作为对象,以确保实现它的对象的预期契约。

我也建议您尝试使用一个模拟框架诸如RhinoMocksMoqTypeMock

模拟框架将帮助您消除对例如可用于测试的数据库的依赖性。我个人使用TypeMock,它并不便宜,但它是迄今为止最强大的工具。

答案 1 :(得分:0)

如果您正在谈论单元测试,您没有依赖关系,导致单元测试只测试单个类(Java,C ++,Ruby,Python)。你所说的听起来更像是不同的集成测试。此外,如果你有很多依赖关系你的耦合是高的,这不是很好,但当然并不总是可以避免。

答案 2 :(得分:0)

单元测试应测试行为,而不是实现。这样,在更改实现或重构代码时,可以依赖单元测试。删除依赖项(例如通过内联类)不会破坏测试。

测试实现会导致脆弱的测试,这会在重构时受到阻碍。