在与测试方法相同的类中编写单元测试或在另一个类(相同包或外部包)中编写单元测试有什么区别?这些测试地点的优点或缺点是什么?
6 回答
如果您在单独的课程中进行测试,您可以
- 使用一个众所周知的单元测试框架,让你的生活更轻松——我所知道的所有这些都假设你将测试与测试代码分开
- 拥有尽可能多的测试用例(不会使您的生产类变得庞大且难以管理 - 请注意,在管理良好的项目中,单元测试代码与生产代码一样多,并且可能比生产更多的公共测试方法API 方法,最终可能会驱动你的 IDE 的 API 索引器,然后你自己,疯狂......)
- 在没有测试的情况下发布您的生产代码- 包括您的测试依赖项(没有人喜欢将大量仅用于测试的 3rd 方东西捆绑到产品部署包中,对吗?)
- 在不接触生产代码本身的情况下更改测试(这将使 SCM 中的审计和更改控制变得更加容易,因为将生产代码/数据中的更改与测试中的更改分开总是很简单的)
最佳实践是将测试与它们正在验证的代码分开。原因很简单:您不想将测试与您的应用程序打包在一起。应用程序应该是干净的。测试应该从外部验证功能。
测试通常有额外的依赖项(例如测试框架、模型库等)。
常见的做法是将源代码src/main/java
放在src/tests/java
.
在分离的类中编写的优点是您可以将测试与代码分开。例如使用 maven:
1. 构建一切
2. 执行包括**/*Test*.java pattern
我什至不知道如何在与代码相同的类中进行单元测试...
测试方法可以测试您的代码。将它们放在被测试的类中会使类的 API 变得混乱,并使类的字节码和依赖项变得比必要的大。
如果我想使用你的 Calculator 类,我不需要testPlusWorks()
andtestMinusWorks()
测试方法。我只需要plus()
和minus()
。如果testPlusWorks
依赖于 JUnit 或 Mockito 库中的某个类,我不希望在生产环境中使用这些依赖项:它们仅在测试类时有用。
这个问题没有“正确”的答案。
在同一个类中编写:允许您测试私有方法,但会弄乱代码。
在同一个项目中编写:允许您测试内部方法/逻辑,但会弄乱项目并延长编译时间。
外部编写:阻止您测试项目内部方法/类,但保持测试干净并在您的“生产”编码器外部。
我发现最好将单元测试完全写在不同的源文件夹中,但将它们保存在同一个包中,因为您仍然可以访问打包(默认)范围的方法和变量。
- 这使您的测试保持在一起,以便于导航和健全
- 当您进行构建时,您可以排除 jar/war/ear 中的测试类。