JUnit 4 vs TestNG - 更新2013 - 2014

cte*_*ekk 87 junit testng unit-testing

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

Jer*_*oek 29

我今天正在比较TestNG和JUnit4,我可以用我在测试框架方面的有限经验指出的主要优点是TestNG有一种更优雅的方式来处理使用数据提供者概念的参数化测试.

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

到目前为止,我唯一可以指出的是TestNG优于JUnit4.

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

但是,我遇到的一个更烦人的问题是,PowerMockTestCase如果你使用PowerMock模拟测试中的依赖项,你的测试类需要扩展.显然,有一些方法可以配置您的测试框架在通过特殊方法或通过testng.xml套件定义使用PowerMock时需要了解的对象 - 工厂,但这些似乎在目前被打破.我不喜欢测试类扩展测试框架类,它似乎是hackish.

如果您不使用PowerMock,这当然不是问题,但总而言之,我得到的印象是JUnit4得到更好的支持.

  • 并不是有参数化测试的替代实现,例如https://code.google.com/p/junitparams/如果您不喜欢它们中的任何一个,您可以编写自己的 - 这就是我喜欢JUnit的可扩展性.;) (5认同)

Jil*_*urp 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捆绑在一起的方式.maven中有更改的罐子,没有这个问题.

我对这两个框架的担心是它们似乎都停止了发展.发布越来越少,并且往往具有越来越不值得注意的功能.例如,整个BDD运动似乎对这两个框架都没有什么影响.此外,JUnit可以简单地采用我上面列出的大部分内容.没有好的技术理由为什么JUnit不能实现任何这些东西; JUnit背后的人只是选择不实现这些东西.这两个项目似乎也缺乏对未来发展方向的看法,他们似乎很乐意在过去的几年里做一些小调整.


Maj*_*jiK 8

我正在寻找一个很好的理由将TestNG切换到JUnit,我发现Tomek Kaczanowski的这张幻灯片很好地解决了这个问题.Tomek是实用单元测试书的作者,它似乎受到开发人员和测试人员的极大尊重.