JUnit 4 和 TestNG 曾经具有可比性。两种测试框架的优缺点是什么?
6 回答
我今天比较了 TestNG 和 JUnit4,我可以指出我在测试框架方面的有限经验的主要优势是,TestNG 有一种更优雅的方式来处理带有数据提供者概念的参数化测试。
据我所知,使用 JUnit4,您必须为要测试的每组参数创建一个单独的测试类(使用 运行@RunWith(Parameterized.class)
)。使用 TestNG,您可以在单个测试类中拥有多个数据提供者,因此您也可以将单个类的所有测试保存在单个测试类中。
到目前为止,这是我唯一可以指出 TestNG 优于 JUnit4 的地方。
Intellij IDEA 包括对 TestNG 和 JUnit 的开箱即用支持。但是,Eclipse 仅支持开箱即用的 JUnit,并且需要安装一个 TestNG 插件才能使其工作。
但是,我在使用 TestNG 时遇到的一个更烦人的问题是,PowerMockTestCase
如果您使用 PowerMock 来模拟测试中的依赖项,那么您的测试类需要扩展。显然,有一些方法可以配置您的测试框架在通过特殊方法或testng.xml
套件定义使用 PowerMock 时需要了解的对象工厂,但目前这些方法似乎被破坏了。我不喜欢让测试类扩展测试框架类,这似乎很老套。
如果您不使用 PowerMock,这当然不是问题,但总而言之,我觉得 JUnit4 得到了更好的支持。
根据我对这两个框架的经验,testng 有一些方便的功能,JUnit 团队多年来一直拒绝实施。出于这个原因,我更喜欢它而不是 JUnit。转换为 testng 很容易,因为它基本上支持 JUnit 中的几乎所有内容(甚至还有一个用于 eclipse 的转换器插件),由于缺少这些功能,转换回 JUnit 并不是那么好。
在 testng
@BeforeClass
中,方法不是静态的,而是在该类中的测试运行之前执行,而不是在加载测试类时执行(JUnit 行为)。我曾经有一个 JUnit 项目,其中所有的数据库测试(几十个)一开始就初始化了数据库,这是非常愚蠢的行为。在 JUnit 社区中,对此有很多支持和反对的争论。它的要点是每个测试方法都应该有自己的测试夹具,因此你不应该有一个非静态的 beforeAll 样式方法,因为这将允许你偷偷地设置一个实例变量,然后在你的所有测试中使用它。有效,但对于集成测试来说真的很烦人。TestNG 在这里为用户提供了选择。根据设计,Junit 没有,这很烦人。Testng 数据提供者比等效的 JUnit 更灵活一些。您可以为每个测试指定哪个数据提供者方法应该提供输入,而不是像在 JUnit 中那样为整个类采用一种适合所有方法的方法。因此,您可以在一类中为您的测试提供正面和负面案例数据提供者。很高兴拥有。
你可以用
@Test
in testng 标记一个类,这意味着:每个公共方法都是一个测试。在 Junit 中,您需要@Test
在每个方法上复制/粘贴。
hamcrest 与 JUnit 捆绑的方式以及 JUnit 与 testng 捆绑的方式都令人烦恼。maven 中有没有这个问题的替代罐子。
我对这两个框架的最大担忧是它们似乎都停止了发展。发布的频率越来越低,并且往往具有越来越少的值得注意的功能。例如,整个 BDD 运动似乎对这两个框架都没有什么影响。此外,JUnit 可以简单地采用我上面列出的大部分内容。JUnit 不能实现这些东西并没有很好的技术原因;JUnit 背后的人只是选择不实现这些东西。这两个项目似乎也缺乏对未来方向的愿景,而且他们似乎很高兴在过去几年里只做一些小的调整。
如果您从事 Java/Scala 项目并且 Gradle 是您选择的构建工具,请记住ScalaTest
框架只JUnitRunner
需要运行您的 scala 测试。换句话说,您可以选择:
- Java JUnit 测试 + Scala 测试与 JUnitRunner 一起运行 => 更好的 Gradle 集成
- Java testNG 测试 + Scala 测试使用 Scala Runner 运行 => 差的 Gradle 集成,因为从 Gradle 的角度来看,scala 测试运行器是单个批量任务。
您可以使用 Mockito 作为您的模拟框架。它与 TestNG 很好地集成。您无需扩展任何类即可将 Mockito 与 TestNG 一起使用。通过这种方式,您测试代码的耦合度较低,如果出于任何原因需要使用其他模拟框架,这样做很容易。
简而言之..
如果您的范围仅限于精细的单元测试,它们之间没有依赖关系,那么可以使用 JUnit。
如果您的范围需要功能测试,可能/可能不需要测试之间的依赖关系和数据(参数)共享,那么选择 TestNG。此外,TestNG 可以进行类似于 JUnit 的单元测试。所以你可以有一套单元测试和一套功能测试。