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


118

我通过阅读学习测试驱动开发的概念工匠的文章(点击工匠按主题)在回答中建议我刚才的问题,“学习JUnit和适当的软件工程样品工程”。到目前为止,我喜欢它!

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

您如何组织JUnit测试类和实际代码?我主要是在谈论包的结构,但是注释的任何其他概念也将有所帮助。

您是否将测试类放在org.myname.project.test。*中,将普通代码放在org.myname.project。*中?您是否将测试课程放在普通课程的旁边?您是否愿意在类名前面加上Test而不是给它们加上后缀?

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

我有一个项目,目前已将其整齐地分为多个软件包,但该项目变得一团糟。我不想尝试重构所有内容并编写测试,而是想重新开始,首先进行所有测试。但是首先我需要知道我的测试要去哪里。


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


Answers:


154

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

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

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

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

这样做的主要目的是我的测试类可以访问(和测试!)包作用域类和成员。

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

更新来自@Ricket的评论:这种方式(通常)将测试类显示在其测试伙伴之后,即按项目的字母顺序列出类名称。(有趣的是,我每天都从中受益,而没有自觉地意识到如何……)

Update2:许多开发人员(包括我自己)都喜欢Maven,但似乎至少有很多不这样做的人。恕我直言,这对于“主流” Java项目非常有用(我会将大约90%的项目归入此类……但是其他10%仍然是一个相当大的少数)。如果可以接受Maven约定,则使用起来很容易;但是,如果没有的话,它会使生活陷入痛苦的挣扎。对于许多在Ant上社交的人来说,Maven似乎很难理解,因为它显然需要非常不同的思维方式。(我自己从未使用过Ant,所以无法将两者进行比较。)可以肯定的是,它使单元(和集成)测试成为过程中自然而一流的步骤,这有助于开发人员采用这种基本做法。


6
我也同意后缀说明。另外,由于测试类被分隔到一个不同的物理文件夹中,因此无需尝试以Test为前缀,而是可以尝试将字母顺序排序成组,并且我认为SomeClassTest读起来更好。
Ricket 2010年

出色的会议+1
威士忌酒2010年

1
关于将测试类放在同一包中的一件事:尽管它允许使用包私有成员(这也是为什么我也使用此方案),但它也不允许自动测试可见性,尤其是。如果使用TDD并让IDE生成所需的方法存根。它可能生成具有程序包专用可见性的文件(NetBeans,我在看您),这使您的测试完美通过(在您将实现实际放入该存根中之后),但是可能无法实际使用(如果您忘记添加public) 。
谢尔盖·塔切诺夫

尽管这个约定很有趣,但是当测试套件扩展时您会怎么做?例如,假设您在该类中有6个方法,每个方法有10个测试。您的课程中有60项测试吗?我通常细分测试类(每个方法一个测试类)。问题在于,您可能在测试包中找到很多类。
mmalmeida

1
Eclipse中的@Thick_propheT:右键单击项目名称,单击“新建-其他...”,然后在Java文件夹内选择“源文件夹”。将其命名为“测试”。然后,如果您遵循上述约定,则向该测试文件夹添加一个新包,其名称与您要为其编写测试用例的类的包名称相同,然后在该包中添加一个新的JUnit测试用例(位于Java / Junit文件夹,当您执行New-Other ...)时。在该新向导中,您可以指定要测试的类,并用“ Test”后缀将测试用例命名为相同的名称
inor

15

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


12

我使用Maven。Maven促进的结构是:

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

src/test/java/org/myname/project/TestMyClass.java

即,带有Test的测试类在被测试类的名称之前,位于主测试的并行目录结构中。

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


18
我虽然不是<class>Test.java,但不是Test<class>.java
Mike Rylander

2
根据Maven Surefire插件文档,Maven将接受任何一种模式。
伊利亚·伍德沃德

3
我认为<class>Test.java命名方案使使用IDE搜索功能时主类和测试类都显示得很近,这使其比更好Test<class>.java
christopheml

1
@christopheml我同意,这就是我现在要做的。
马丁

这适用于Intellij。MyClassTest.java无法正常工作。
user2761431
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.