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

问题

我正在通过阅读上一个问题"Sample project for learning JUnit and proper software engineering"中回答的Craftsman articles(clickCraftsmanunderBy Topic)来学习测试驱动开发的概念。到目前为止我喜欢它!

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

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

你是否将测试类放在org.myname.project.test。和org.myname.project中的普通代码中。?你是否把测试类放在正常的课程旁边?你更喜欢使用Test而不是后缀来为类名添加前缀吗?

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

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

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


#1 热门回答(141 赞)

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

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,无法比较两者。)有一点是肯定的:它使单元(和集成)测试成为流程中自然的,一流的步骤,这有助于开发人员采用这种基本实践。


#2 热门回答(15 赞)

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


#3 热门回答(10 赞)

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

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

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

即,在测试类的名称前面加上Test的测试类与主测试的并行目录结构。

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