JUnit 4与TestNG - 2013年至2014年更新

88

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


如果您正在查看功能比较,mkyong有一篇关于jUnit 4与testNG的好文章。如果您想要参考使用比较,Kapil Hope有一篇不错的文章可以帮助您! - Anshu
71
我觉得这样的问题在 Stack Overflow 上非常有帮助...我想感谢你冒险提问,并祝贺你没有被关闭! - user1445967
2
再次看到这个问题,已经过去了这么多年。有趣的是 - 我闻到了阴谋的味道!我的问题完全集中在不同的功能上,然后有一个“社区”编辑将我的问题编辑为“利弊”,然后由于基于观点而关闭了问题。笑死我了。 - Arian
6个回答

29

我今天比较了TestNG和JUnit4,根据我有限的测试框架经验,我可以指出TestNG具有更优雅的处理参数化测试的方式,使用数据提供程序概念。

就我所知,在JUnit4中,您必须为要测试的每组参数创建单独的测试类(使用@RunWith(Parameterized.class)运行)。而在TestNG中,您可以在单个测试类中拥有多个数据提供程序,因此您也可以将单个类的所有测试保存在单个测试类中。

到目前为止,这是我能指出的关于TestNG优于JUnit4的唯一好处。

Intellij IDEA支持TestNG和JUnit的开箱即用。但是,Eclipse仅支持JUnit,并需要安装TestNG插件才能使其工作。

然而,我在使用PowerMock模拟测试中遇到的一个更烦人的问题是,如果您正在使用PowerMock模拟您的测试中的依赖项,则测试类需要扩展PowerMockTestCase。显然,当使用PowerMock时,可以通过特殊方法或testng.xml套件定义来配置测试框架所需的对象工厂,但这些方法似乎已经失效。我不喜欢将测试类扩展为测试框架类,这似乎是hackish。

如果您不使用PowerMock,这当然不是问题,但总体而言,我认为JUnit4得到了更好的支持。


5
并不是说没有参数化测试的其他实现,例如 https://code.google.com/p/junitparams/ 如果你不喜欢它们中的任何一个,你可以编写自己的 - 这就是我喜欢 JUnit 可扩展性的原因。;) - Esko Luontola

17

基于我对两个框架的经验,testng有一些方便的功能,而JUnit团队已经拒绝实现了几年。因此,我更喜欢testng。转换到testng很容易,因为它基本上支持JUnit中的所有内容(甚至在eclipse中有一个转换插件)。但由于缺少这些功能,转换回JUnit并不理想。

  • 在testng中,@BeforeClass 方法不是静态的,并且在该类中的测试运行之前执行,而不是在加载测试类时执行(JUnit的行为)。我曾经有一个JUnit项目,在这个项目中所有的数据库测试(几十个)都在开始时初始化了数据库,这是相当愚蠢的行为。在JUnit社区中进行了很多争论。其主要观点是每个测试方法应该有自己的测试夹具,因此您不应该有一个非静态的beforeAll样式方法,因为那样会允许您偷偷地设置一个实例变量,然后在所有测试中使用它。虽然有效,但对于集成测试来说真的很麻烦。TestNG在这里给用户提供了选择。JUnit没有,这很烦人。

  • Testng数据提供者比JUnit的等效物更灵活。您可以针对每个测试指定提供输入的数据提供程序方法,而不是像JUnit中一样为整个类使用通用方法。因此,您可以在一个类中为测试设置正向和负向案例的数据提供程序。非常好用。

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

这两者都有一个问题,就是hamcrest与JUnit捆绑在一起,JUnit与testng捆绑在一起的方式。 在maven中有一些备选的jar文件可以解决这个问题。

我对这两个框架的担忧在于它们似乎已经停止了发展。发布越来越不频繁,也越来越少有值得注意的功能。例如,整个BDD运动似乎对任何一个框架都没有产生影响。此外,JUnit本身也可以采用我列出的大部分内容。JUnit没有办法实现这些功能,其实并没有技术上的限制; 只是JUnit背后的人选择不去实现这些功能。这两个项目似乎也缺乏未来方向的愿景,为过去几年的微小调整感到满意。


9
我在寻找一个好的理由来选择TestNG而不是JUnit,然后我发现Tomek Kaczanowski的this幻灯片非常好地解答了这个问题。Tomek是Practical Unit Testing一书的作者,这本书似乎受到开发人员和测试人员的高度尊重。

1
如果您在Java/Scala项目上工作,并且Gradle是您选择的构建工具,请记住,ScalaTest框架只有JUnitRunner来运行您的scala测试。换句话说,您有一个选择:
  • Java JUnit测试+使用JUnitRunner运行Scala测试 => 更好的Gradle集成
  • Java testNG测试+使用Scala Runner运行Scala测试 => 较差的Gradle集成,因为从Gradle的角度来看,Scala测试运行器是单个批量任务。

0

你可以使用Mockito作为你的模拟框架。它与TestNG集成得非常好。你不需要扩展任何类来使用Mockito与TestNG。这样你的测试代码就不会紧密耦合,如果出于任何原因你需要使用其他模拟框架,也很容易实现。


7
这个回答与问题完全不相关。 - Adrian Shum
11
@AdrianShum,我认为Konrad试图对JeroenHoek提出的将PowerMock与TestNG集成的观点发表评论,因为他似乎没有“评论”特权,所以我猜他把评论放在了答案中。请您确认一下。 - Taoufik Mohdit
1
这个回答误解了PowerMock的作用。它不是Mockito的替代品,而是一种补充,允许Mockito模拟Mockito本身无法完成的某些事情(如静态方法、final类)。 - stickfigure

0
简而言之...
如果您的范围仅限于没有彼此依赖的精细详细单元测试,则可以使用JUnit。
如果您的范围需要功能测试,可能需要依赖项和在测试之间共享数据(参数),则选择TestNG。此外,TestNG可以像JUnit一样进行单元测试。因此,您可以拥有一套单元测试和一套功能测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接