JUnit 4和TestNG曾经具有可比性。这两个测试框架的优缺点是什么?
JUnit 4和TestNG曾经具有可比性。这两个测试框架的优缺点是什么?
Answers:
我今天比较了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
在testng中标记一个类,这意味着:每个公共方法都是一个测试。在Junit中,您需要@Test
在每种方法上复制/粘贴。
两者的烦恼是hamcrest与JUnit捆绑在一起的方式以及JUnit与testng捆绑在一起的方式。在行家中有其他罐子没有这个问题。
我对这两个框架的最大担心是,它们似乎都已停止发展。发布的频率越来越低,并且具有越来越少的值得注意的功能。例如,整个BDD运动似乎对这两个框架都几乎没有影响。同样,JUnit可以简单地采用我上面列出的大部分内容。没有充分的技术理由可以使JUnit无法实现任何这些东西;JUnit背后的人们只是选择不实现这些东西。这两个项目似乎也都缺乏对未来方向的愿景,并且他们似乎很高兴在过去几年中做了一些小的调整。
如果您从事Java / Scala项目,并且Gradle是您选择的构建工具,请记住,ScalaTest
框架只JUnitRunner
需要运行scala测试即可。换句话说,您可以选择:
您可以使用Mockito作为模拟框架。它与TestNG很好地集成。您无需扩展任何类即可将Mockito与TestNG一起使用。测试代码的这种方式耦合性较低,并且如果出于任何原因需要使用其他模拟框架,则很容易做到。