我正在通过阅读我上一个问题 "Sample project for learning JUnit and proper software engineering" 的答案中推荐的 Craftsman articles(点击 By Topic 下的 Craftsman)来学习测试驱动开发的概念。到目前为止我喜欢它!
但现在我想自己坐下来试试。我有一个问题,我希望只需要一个简单的答案。
你如何组织你的 JUnit 测试类和你的实际代码?我主要在谈论包结构,但任何其他注意概念也会有所帮助。
您是否将测试类放在 org.myname.project.test.* 中,将普通代码放在 org.myname.project.* 中?您是否将测试课程与普通课程放在一起?你喜欢在类名前加上 Test 而不是后缀吗?
我知道这似乎是我不应该这么快担心的事情,但我是一个非常以组织为中心的人。我几乎是那种花更多时间找出方法来跟踪要完成的事情的人,而不是真正完成事情的人。
我有一个项目,目前被整齐地分成包,但项目变得一团糟。我不想尝试重构所有内容并编写测试,而是想重新开始,首先是测试。但首先我需要知道我的测试在哪里。
编辑:我完全忘记了 Maven,但似乎你们中的大多数人都在使用它!过去,我有一个特定的用例,Maven 完全崩溃了,但 Ant 给了我所需的灵活性,所以我最终依附于 Ant,但我想也许我只是采取了错误的方法。我想我会再试一次 Maven,因为听起来它会很适合测试驱动的开发。
我更喜欢将测试类与他们测试的项目类放在同一个包中,但放在不同的物理目录中,例如:
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 评论启发的更新:这种方式测试类(通常)在他们的测试伙伴之后立即显示在按项目排序的类名字母列表中。 (有趣的是,我每天都在受益于这一点,却没有有意识地意识到如何......)
更新 2:很多开发人员(包括我自己)喜欢 Maven,但似乎至少有同样多的人不喜欢。恕我直言,它对于“主流”Java 项目非常有用(我会将大约 90% 的项目归入此类......但其他 10% 仍然是相当大的少数)。如果可以接受 Maven 约定,它就很容易使用;但是,如果没有,它会使生活成为一场悲惨的斗争。对于在 Ant 上进行社交的许多人来说,Maven 似乎很难理解,因为它显然需要一种非常不同的思维方式。 (我自己从未使用过 Ant,因此无法将两者进行比较。)有一点是肯定的:它使单元(和集成)测试成为流程中自然的、一流的步骤,这有助于开发人员采用这一基本实践。
我将我的测试类放在与他们正在测试的包相同的包中,但放在不同的源文件夹或项目中。以这种方式组织我的测试代码使我可以轻松地单独编译和打包它,以便生产 jar 文件不包含测试代码。它还允许测试代码访问包私有字段和方法。
我使用 Maven。 Maven 提倡的结构是:-
src/main/java/org/myname/project/MyClass.java
src/test/java/org/myname/project/TestMyClass.java
即,在被测类名称前附加了Test 的测试类与主测试处于并行目录结构中。
将测试类放在同一个包(不一定是目录)中的一个优点是您可以利用包范围的方法来检查或注入模拟测试对象。
<class>Test.java
,而不是 Test<class>.java
<class>Test.java
命名方案使得在使用 IDE 搜索功能时主类和测试类都显示得很近,这使它比 Test<class>.java
好一点。
不定期副业成功案例分享