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

JUnit 4和TestNG曾经是可比的。 这两个testing框架的优缺点是什么?

我今天正在比较TestNG和JUnit4,而且我可以用我在testing框架方面有限的经验指出的主要优点是TestNG有一个更好的方式来处理参数化testing和数据提供者的概念。

就我可以告诉JUnit4你必须创build一个单独的testing类,你想要testing每个参数集(运行@RunWith(Parameterized.class) )。 使用TestNG,您可以在一个testing类中拥有多个数据提供者,因此您也可以在一个testing类中保留一个类的所有testing。

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

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

然而,与TestNG碰到的一个更令人讨厌的问题是,如果您使用PowerMock来模拟testing中的依赖项,那么您的testing类需要扩展PowerMockTestCase 。 显然,有些方法可以configurationtesting框架需要通过特殊方法或者通过testng.xml套件定义来使用PowerMock时需要了解的对象工厂,但是目前似乎已经被打破。 我不喜欢有testing类扩展testing框架类,它似乎hackish。

如果你不使用PowerMock,这当然不是问题,但总的来说,我觉得JUnit4更好的支持。

基于我在两个框架方面的经验,testng具有JUnit团队多年来拒绝实施的一些便利function。 由于这个原因,我更喜欢JUnit。 转换到testng很容易,因为它基本上支持JUnit中的所有东西(甚至有一个用于eclipse的转换器插件),因为这些缺less的function,转换回JUnit并不是那么好。

  • testng @BeforeClass方法不是静态的,在该类中的testing运行之前执行,而不是在加载testing类(JUnit行为)时执行。 我曾经有一个JUnit项目,其中所有的数据库testing(几十个)都在开始时对数据库进行了初始化,这是非常愚蠢的行为。 在JUnit社区有很多争论和反对。 其要点是,每个testing方法应该有自己的testing夹具,因此你不应该有一个非静态的beforeAll样式的方法,因为这将允许你偷偷地设置一个实例variables,然后在所有的testing中使用它。 有效的,但真正烦人的集成testing。 TestNG为用户提供了select。 Junit没有,在devise上,这是烦人的。

  • Testng数据提供者比JUnit等价物更加灵活。 您可以指定每个testing哪个数据提供者方法应该提供input,而不是像JUnit那样对整个类使用一种适合所有方法。 因此,您可以在一个class级中为您的testing提供正面和负面的案例数据提供者。 很高兴有。

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

两者都有一个问题,就是Hamcrest与JUnit捆绑在一起,JUnit与testng捆绑在一起。 有没有这个问题的maven改变jar子。

我对这两个框架的担心是他们似乎都停止了发展。 发行越来越less,往往越来越less有值得注意的function。 整个BDD运动似乎对任何一个框架都没有什么影响。 此外,JUnit可以简单地采用上面列出的大部分内容。 没有很好的技术原因,为什么JUnit不能实现任何这些东西; JUnit背后的人只是select不实施这些东西。 这两个项目似乎都缺乏对未来方向的设想,过去几年他们似乎很乐意做些微小的调整。

我正在寻找一个很好的理由把TestNG转换成JUnit,我发现这个 Tomek Kaczanowski的幻灯片很好的解决了这个问题。 Tomek是“ 实用unit testing”一书的作者,这本书似乎受到了开发人员和testing人员的高度重视。

如果您使用Java / Scala项目,而Gradle是您select的构build工具,请记住, ScalaTest框架只有JUnitRunner才能运行您的Scalatesting。 换句话说,你有一个select:

  • Java JUnittesting+ Scalatesting运行JUnitRunner =>更好的Gradle集成
  • Java testNG tests + Scalatesting运行于Scala Runner =>糟糕的Gradle Integration,因为Scalatesting运行器是Gradle的一个单一的批量任务。

你可以使用Mockito作为你的模拟框架。 它与TestNG很好地集成在一起。 您不必扩展任何类,以使用TestNG Mockito。 您testing代码的方式较less,如果出于某种原因您需要使用其他模拟框架,则很容易。

简而言之..

如果你的作用域限于精细的unit testing,它们之间没有依赖关系,那么可以使用JUnit。

如果你的范围需要functiontesting,可能/可能不需要依赖性和testing之间的数据(参数)共享,然后selectTestNG。 另外,TestNG可以做类似于JUnit的unit testing。 所以你可以有一套unit testing和一套functiontesting。