命名规范 JUnit 后缀或前缀测试

65

被测试的类为MyClass.java JUnit测试用例的名称替代方案:

TestMyClass.java
MyClassTest.java
http://moreunit.sourceforge.net 似乎使用 "Test" 作为默认前缀,但我见过两种用法。在 Eclipse 中将整个项目作为单元测试运行时,这两种用法都似乎被识别,因为类内的注解 @Test 被解析了。我猜 Maven 做同样的事情。

哪个更受推荐?


1
对于Maven而言,测试类的名称很重要,它不仅依赖于@Test注释。请参见https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html。 - Pino
9个回答

106

在英语中,另一个使用后缀的理由是:

类通常代表名词,它是一个概念的模型。你的测试实例之一将会是'MyClass test'。相比之下,方法会模拟某种行为,例如'test [the] calculate [method]'。

因此,我总是使用测试类的后缀和测试方法的前缀:

the MyClass test          --> MyClassTest
test the calculate method --> testCalculate()

从设计角度来看如何做到这一点是我所寻找的。 - aron
虽然现在已经有些过时了,但是在每个测试方法的顶部添加注释测试,从jUnit 4开始就不需要使用test前缀了。 - Shilan

56

我更喜欢使用后缀“-test”,这样在查看目录中的文件列表时会更简单:您不必心理上忽略前四个字母以找到有意义的内容。(假设您已经将测试文件放在与生产代码不同的目录中。)

这还意味着,当您在Eclipse中使用Open Type(Ctrl-T)时,您将同时看到生产代码及其测试...如果您没有看到测试类,这也是一个提醒 :)


11
在JUnit 4之前,通常将测试类命名为SomethingTest,并在所有匹配*Test.java的类上运行JUnit。现在,在基于注释的JUnit 4中,您只需使用@Test注释标记测试方法即可完成。您的测试类可能位于与实际源代码不同的目录结构下(源代码位于src/,测试类位于test/),因此这些前缀/后缀现在基本无关紧要。

13
他们不是。假设我们有一个连接器模型,这个类被命名为 Connector,那么用于测试连接器实例的模型将是一个 ConnectorTest。对我来说,这很显然。从纯技术角度看,你是正确的,但命名应该与设计相关。 - Andreas Dolk
3
了解历史很有启迪性。+1 - aron
1
@Andreas_D,没错。通常一个单元测试类会集中测试一个Java类,所以Connector的单元测试将在ConnectorTest中进行,因此从我的回答来看,前缀/后缀仍然有一定的价值。 - krock

6
不是要冒犯任何人,但我认为可以公正地说,“moreunit”比普遍存在并且已经确立了将测试类后缀命名为“Test”的JUnit要不知名得多。
尽管JUnit4取消了遵循类和方法命名约定(分别为“后缀Test”和“前缀test”)的必要性,但我认为这两者仍然对于清晰度很有用。
想象一下,如果src/test/java/.../MyClass.myMethod()被src/main/java/.../MyClass.myMethod()测试,会有多可怕...
有时,从JUnit3的惯例中偏离是有用的 - 我发现按其功能命名设置方法(“createTestFactory()”)并在其上注释“@Before”比通用的“setUp()”更清晰。
当需要执行几个不相关的设置操作时,这特别有用 - 它们可以在单独的方法中完成,每个方法都标记为@Before。这样很好地传达了各个操作之间的独立性。

2
BDD(http://blog.dannorth.net/introducing-bdd)提出了一个好主意:不要在测试方法中使用“@Test testFailOnNull() {...}”这样的命名方式,而是使用动词“should”:“@Test shouldFailOnNull() {...}”。我认为这种命名方式能够简明地传达大量信息。它避免了重复使用“test”,比“@Test failOnNull() {...}”更易读。 - Morten Lauritsen Khodabocus

5
我更喜欢使用TestClassName语法。使用另一种语法时,当我同时打开测试和实际编辑器时,我很难确定哪个是测试类和哪个是实际类。需要查找名称中的后四个字母是很繁琐的,而且这些字母并不总是显示。对我来说,另一种语法导致每天发生数次错误的文件交换,这浪费了时间。

2

如果你是独自工作,那么你需要对自己的测试感到舒适很重要。但是如果你在一个团队中,最好坐下来解决一些问题。我个人倾向于对类使用后缀,对方法使用前缀,并尝试让我的团队遵循这种约定。


1

当我想将我的测试分成多个类时,我也会使用 MyClassTest_XXX。这在测试一个大类并且我希望逻辑上分组的情况下非常有用。(无法控制遗留代码,因此这种情况确实会出现。)然后我会有像 KitchenSinkTest_ForArray、KitchSinkTest_ForCollection 等类似的东西。


0

我建议使用MyClassTests

类应该是名词短语,所以常用的有MyClassTest,较少用的有MyClassTestsMyClassTestCaseMyClassTestFixture都可以。从技术上讲,JUnit测试类的实例表示test fixture,但TestFixture对我来说有点太冗长了。

我认为MyClassTests传达了最好的意图,因为一个类中通常有多个测试方法,每个方法代表一个单独的测试(测试用例)。


-2

先生,您似乎对术语感到困惑... - GabrielOshiro

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