ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在通过阅读我上一个问题 "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,因为听起来它会很适合测试驱动的开发。


B
Bruno Reis

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

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


我也同意后缀说明。此外,由于测试类被分隔到不同的物理文件夹中,因此无需尝试使用 Test 前缀来尝试将字母顺序排序分组,我认为 SomeClassTest 读起来更好。
将测试类放在同一个包中的一件事:虽然它允许使用包私有成员(这也是我使用这个方案的原因),但它也不允许自动测试可见性,尤其是。如果您使用 TDD 并让您的 IDE 生成所需的方法存根。它可能会以包私有可见性(NetBeans,我在看你)生成它们,这会使你的测试完美通过(在你实际将实现放入该存根之后),但在实际使用中可能会失败(如果你忘记添加 { 1})。
虽然这个约定很有趣,但当测试套件增长时你会怎么做?例如,假设您在类中有 6 个方法,每个方法有 10 个测试。你的班级有 60 次测试吗?我通常细分测试类(每个方法一个测试类)。这样做的问题是您可能会在测试包中找到很多类。
如何在 Eclipse 中做到这一点?我似乎只能完成两个不同的包,myproject\src... 和 myproject\test... 如何将多个目录中的内容添加到单个包中?
Eclipse 中的@Thick_propheT:右键单击项目名称,单击新建 - 其他...,然后在 Java 文件夹中选择源文件夹。将其命名为“测试”。然后,如果您要遵循上述约定,请在此测试文件夹中添加一个与您要为其编写测试用例的类的包同名的新包,然后在包中添加一个新的 JUnit 测试用例(位于执行 New-Other... 时的 Java/Junit 文件夹)。在该新向导中,您可以指定正在测试的类并将您的测试用例命名为具有“Test”后缀的相同名称
C
ChrisH

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


M
Martin

我使用 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
根据 the Maven Surefire Plugin documentation,Maven 将接受任一模式。
我认为 <class>Test.java 命名方案使得在使用 IDE 搜索功能时主类和测试类都显示得很近,这使它比 Test<class>.java 好一点。
@christopheml 我同意,这就是我现在所做的。
这适用于 Intellij。 MyClassTest.java 没有工作。