测试实用方法的测试应该放在哪里?

4
我一直在阅读Gerard Meszaros的著作《xUnit Patterns: Refactoring Test Code》,想为我的单元测试编写更多经过测试的实用方法。据我所知,有三个地方可以放置这样的实用程序:
  1. 如果实用程序仅在单个测试用例类中使用,请将其放在那里。
  2. 如果它在单个项目中的几个测试用例类中使用,请将其放入单独的测试帮助器类中。
  3. 如果它在一个以上的项目中使用,请将其放入单独的测试实用工具库中。
问题是,如果我要有经过测试的实用程序,那么我应该在哪里放置它们的测试?
对于情况(3),没有问题。测试实用工具库只是一个常规项目,拥有自己的测试套件。
情况(1)有点复杂:唯一合适的地方是将测试放在同一测试用例类中,但如何确保“正常”测试在实用程序测试失败时被跳过?我可以在测试之间引入依赖关系(例如,使用TestNG的属性dependsOnGroups = "utilities"),但这看起来有点丑陋:例如,我需要在每个测试上重复该属性或将它们分组到相互依赖的嵌套测试用例类中。
情况(2)非常混乱。将测试放入帮助器类中看起来很丑陋,如果某些东西(Maven、IDE)期望测试用例类以Test结尾,而我的帮助器类没有,则可能会破坏测试发现。将测试放入单独的HelperTest测试用例类中听起来更好,但这样我又有了另一个依赖问题:如果我让一些测试依赖于那个HelperTest类,那么当我仅运行单个测试文件时,它们都会失败,因为在运行期间这些实用程序测试甚至不存在(至少在TestNG中是这样)。
我是否遗漏了什么?是否有行业惯例来处理这个问题?还是我应该忘记依赖关系,只需在一堆测试同时失败时查看红色列表中的实用程序测试?

如何确保“正常”的测试被跳过:不要跳过。测试失败了,那又怎样。你找到失败的原因,修复有问题的代码,然后重新运行测试。我认为你在想得太多了。 - JB Nizet
@JBNizet,可能是这样。但我在文章和书籍中多次阅读到,许多测试一次失败是不好的,因为很难确定原因。我个人从未遇到过任何问题,但尝试听起来足够合理。也许这个想法很好,但我们还没有正确的工具来跟进它。 - Sergei Tachenov
3
想象一下,你的生产代码中有一个实用方法,许多生产类都在使用它。如果你在这个实用方法中引入了一个 bug,那么许多这些类的测试应该会失败。但是,你不想在类的测试和实用方法的测试之间引入依赖关系,因为类使用这个实用方法是一个实现细节,测试不应该关心它。对于测试源集中的实用方法,情况也不应有所不同。 - JB Nizet
@JBNizet,现在这就很有道理了。这真的应该是一个答案。 - Sergei Tachenov
1个回答

2
假设您的生产代码中有一个实用方法,许多生产类使用它。如果您在此实用方法中引入错误,则这些类的许多测试应该失败。然而,您不希望在类的测试和实用方法的测试之间引入依赖关系,因为类使用此实用方法是实现细节,您的测试不应关心此细节。
对于测试源集中的实用程序方法,情况不应有任何不同。测试应假定此测试实用程序方法正常工作。如果不正常,那么找到故障测试的根本原因就不应该有问题,特别是如果您还有一个针对此实用程序方法的测试也失败了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接