将JUnit类分离成特殊的测试包?

Ric*_*ket 113 java junit unit-testing

我正在学习测试驱动开发的概念,通过阅读我之前的问题"用于学习JUnit和适当的软件工程的示例项目"的回答中推荐的Craftsman文章(单击By Topic下的Craftsman).到目前为止我喜欢它!

但现在我想坐下来亲自尝试一下.我有一个问题,我希望只需要一个简单的答案.

您如何组织JUnit测试类和实际代码?我主要谈论的是包结构,但任何其他注意事项也都会有所帮助.

您是否将测试类放在org.myname.project.test.*和org.myname.project中的普通代码中.*?您是否将测试类与正常类一起放在一起?您更喜欢使用Test而不是后缀来为类名添加前缀吗?

我知道这似乎是我不应该这么快就担心的事情,但我是一个非常以组织为中心的人.我几乎是那种花费更多时间找出方法来跟踪要做什么的人,而不是实际完成任务.

我有一个项目,目前整齐划分为包,但项目变得一团糟.我没有尝试重构所有内容并编写测试,而是首先尝试新的测试.但首先我需要知道我的测试在哪里.


编辑:我完全忘记了Maven,但似乎大多数人都在使用它!在过去,我有一个特定的用例,Maven完全打破了我,但Ant给了我所需的灵活性,所以我最终依附于Ant,但我想也许我只是采取了错误的方法.我想我会再给Maven一个尝试,因为听起来它会很好地适应测试驱动的开发.

Pét*_*rök 148

我更喜欢将测试类放在与他们测试的项目类相同的包中,但是在不同的物理目录中,例如:

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java
Run Code Online (Sandbox Code Playgroud)

在Maven项目中,它看起来像这样:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java
Run Code Online (Sandbox Code Playgroud)

这里的要点是我的测试类可以访问(并测试!)包范围类和成员.

如上例所示,我的测试类具有测试类的名称加上Test后缀.这有助于快速找到它们 - 尝试在几百个测试类中搜索并不是很有趣,每个测试类的名称都以Test... 开头.

受@ Ricket评论启发的更新:这种方式测试类(通常)在他们的测试伙伴之后立即显示在项目名称的类名列表中.(有趣的是,我从一天中受益,没有有意识地意识到......)

Update2:很多开发人员(包括我自己)都喜欢Maven,但似乎至少有很多人没有.恕我直言,它对"主流"Java项目非常有用(我会将约90%的项目纳入此类别......但其他10%仍然是相当大的少数项目).如果可以接受Maven惯例,它很容易使用; 但如果没有,它会让生活变得悲惨.对于许多在Ant上社交的人来说,Maven似乎很难理解,因为它显然需要一种非常不同的思维方式.(我自己,从未使用过Ant,无法比较两者.)有一件事是肯定的:它使单元(和集成)测试成为流程中自然的,一流的步骤,这有助于开发人员采用这种基本实践.

  • 我同意后缀说明.此外,由于测试类被分成不同的物理文件夹,因此在尝试将字母顺序排序分组到分组时,不需要尝试使用Test作为前缀,我认为SomeClassTest读取更好. (6认同)

Chr*_*isH 15

我将测试类放在与测试相同的包中,但是放在不同的源文件夹或项目中.以这种方式组织我的测试代码允许我轻松地单独编译和打包它,以便生产jar文件不包含测试代码.它还允许测试代码访问包私有字段和方法.


Mar*_*tin 12

我用Maven.Maven推出的结构是: -

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java
Run Code Online (Sandbox Code Playgroud)

即,测试类的名称前面的Test测试类与主测试的并行目录结构.

将测试类放在同一个包中(不一定是目录)的一个优点是,您可以利用包范围方法来检查或注入模拟测试对象.

  • 我虽然是`<class> Test.java`,而不是`Test <class> .java` (17认同)
  • 根据 [Maven Surefire 插件文档](http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html),Maven 将接受任一模式。 (2认同)
  • 我认为`<class> Test.java`命名方案在使用IDE搜索功能时会使主类和测试类显示出来,这使得它比`Test <class> .java`好一点. (2认同)