JUnit 4与TestNG-更新2013-2014 [关闭]


88

JUnit 4和TestNG曾经具有可比性。这两个测试框架的优缺点是什么?


如果您正在查看功能比较,那么mkyong 有一篇关于jUnit 4 vs testNG 的不错的文章。如果您想参考用法比较。卡皮尔·霍普(Kapil Hope)有一篇不错的文章对您有所帮助!
Anshu 2013年

71
我发现类似这样的问题对SO极为有用。我想说谢谢您冒着询问的风险,并祝贺您没有关闭它!
user1445967 2014年

与您的观众相对立的方式:D
ctekk 2015年

2
这么多年后再次看到这个问题。有趣的是-我闻到阴谋!我的问题完全集中在不同的功能上,然后进行了“社区”编辑,将我的问题编辑为“利弊”,然后由于基于意见的原因而关闭了该问题。ma
ctekk

Answers:


29

我今天比较了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的印象。


5
并不是说有参数化测试的替代实现,例如code.google.com/p/junitparams。如果您不喜欢其中的任何一种,都可以编写自己的测试-这就是我喜欢JUnit的可扩展性。;)
Esko Luontola 2013年

17

根据我对这两种框架的经验,testng具有一些方便的功能,而JUnit团队多年来一直拒绝实现这些功能。由于这个原因,我比JUnit更喜欢它。转换为testng很容易,因为它基本上支持JUnit中的几乎所有内容(甚至有一个eclipse的转换器插件),由于这些缺少的功能,转换回JUnit并不是很好。

  • 在testng中,@BeforeClass方法不是静态的,并且在该类中的测试运行之前而不是在加载测试类时(JUnit行为)执行。我曾经有一个JUnit项目,所有数据库测试(几十个)从一开始就初始化了数据库,这是很愚蠢的行为。在JUnit社区中,对此有很多争论。其要点是,每个测试方法都应具有自己的测试装置,因此,您不应具有非静态的beforeAll样式方法,因为这将使您可以轻松地一次设置实例变量,然后在所有测试中使用它。有效,但对于集成测试确实很烦人。TestNG在这里为用户提供了选择。按设计,Junit不会令人讨厌。

  • Testng数据提供程序比JUnit等效项更具灵活性。您可以为每个测试指定应该由哪个数据提供程序方法提供输入,而不是像JUnit中那样为整个类提供一个适合所有方法的大小。这样一来,您就可以为测试提供正面和负面的案例数据提供者。非常高兴。

  • 您可以@Test在testng中标记一个类,这意味着:每个公共方法都是一个测试。在Junit中,您需要@Test在每种方法上复制/粘贴。

两者的烦恼是hamcrest与JUnit捆绑在一起的方式以及JUnit与testng捆绑在一起的方式。在行家中有其他罐子没有这个问题。

我对这两个框架的最大担心是,它们似乎都已停止发展。发布的频率越来越低,并且具有越来越少的值得注意的功能。例如,整个BDD运动似乎对这两个框架都几乎没有影响。同样,JUnit可以简单地采用我上面列出的大部分内容。没有充分的技术理由可以使JUnit无法实现任何这些东西;JUnit背后的人们只是选择不实现这些东西。这两个项目似乎也都缺乏对未来方向的愿景,并且他们似乎很高兴在过去几年中做了一些小的调整。


9

我一直在寻找将TestNG切换到JUnit的充分理由,并且我发现Tomek Kaczanowski的这张幻灯片很好地解决了这个问题。Tomek是《实用单元测试》一书的作者,该书似乎受到开发人员和测试人员的尊重。


1

如果您从事Java / Scala项目,并且Gradle是您选择的构建工具,请记住,ScalaTest框架只JUnitRunner需要运行scala测试即可。换句话说,您可以选择:

  • Java JUnit测试+ Scala测试与JUnitRunner一起运行=>更好的Gradle集成
  • Java testNG测试+ Scala测试使用Scala Runner => Gradle Integration不佳运行,因为从Gradle的角度来看,scala测试运行程序是单个批量任务。

0

您可以使用Mockito作为模拟框架。它与TestNG很好地集成。您无需扩展任何类即可将Mockito与TestNG一起使用。测试代码的这种方式耦合性较低,并且如果出于任何原因需要使用其他模拟框架,则很容易做到。


7
这个答案很简单完全无关的问题....
阿德里安深

11
@AdrianShum我认为Konrad试图就JeroenHoek关于将PowerMock与TestNG集成的观点发表评论,因为他似乎没有“评论”特权,我认为他将他的评论作为答案
Taoufik Mohdit 2013年

1
这个答案误解了PowerMock是什么。它不是Mockito的替代品,而是一种允许Mockito模拟Mockito本身无法完成的某些事情的补充(静态方法,最终类)。
stickfigure

0

简而言之..

如果您的范围仅限于精细的详细单元测试,而它们之间没有依赖关系,则可以使用JUnit。

如果您的示波器需要功能测试,测试之间可能需要/不需要测试依赖和共享数据(参数),请选择TestNG。而且,TestNG可以进行类似于JUnit的单元测试。因此,您可以拥有一套单元测试和一套功能测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.