JUnit 4和TestNG曾经具有可比性。两个测试框架的优缺点是什么?
答案 0 :(得分:29)
我今天正在比较TestNG和JUnit4,我可以用我在测试框架方面的有限经验指出的主要优点是TestNG有一种更优雅的方式来处理使用数据提供者概念的参数化测试。
据我所知,JUnit4必须为要测试的每组参数创建一个单独的测试类(使用@RunWith(Parameterized.class)
运行)。使用TestNG,您可以在一个测试类中拥有多个数据提供程序,因此您可以在单个测试类中保留单个类的所有测试。
到目前为止,我唯一可以指出的是TestNG优于JUnit4的好处。
Intellij IDEA包含对TestNG和JUnit的支持。但是,Eclipse仅支持开箱即用的JUnit,并且需要安装TestNG插件才能使其正常工作。
然而,我遇到的一个更烦人的问题是,如果你使用PowerMock模拟测试中的依赖项,你的测试类需要扩展PowerMockTestCase
。显然,有一些方法可以配置您的测试框架在通过特殊方法或通过testng.xml
套件定义使用PowerMock时需要了解的对象 - 工厂,但这些似乎现在已被打破。我不喜欢测试类扩展测试框架类,它似乎是hackish。
如果您不使用PowerMock,这当然不是问题,但总而言之,我得到的印象是JUnit4得到更好的支持。
答案 1 :(得分:17)
根据我对这两个框架的经验,testng有一些方便的功能,JUnit团队已经拒绝实施多年。出于这个原因,我更喜欢JUnit。转换为testng非常简单,因为它基本上支持JUnit中的所有内容(甚至还有eclipse的转换器插件),由于缺少这些功能,转换回JUnit并不是那么好。
在testng @BeforeClass
中,方法不是静态的,而是在该类运行的测试之前执行,而不是在加载测试类时(JUnit行为)。我曾经有一个JUnit项目,所有的数据库测试(几十个)都在一开始就初始化了数据库,这是非常愚蠢的行为。在JUnit社区中存在很多支持和反对的争论。它的要点是每个测试方法都应该有自己的测试夹具,因此你不应该有一个非静态的beforeAll样式方法,因为这样可以让你偷偷设置一次实例变量,然后在你的所有测试中使用它。有效,但对集成测试非常烦人。 TestNG为用户提供了选择。根据设计,Junit没有令人讨厌的东西。
Testng数据提供程序比JUnit等效程序更灵活。您可以为每个测试指定哪个数据提供者方法应该提供输入,而不是像JUnit那样为整个类提供一个适合所有方法。因此,您可以在一个类中为您的测试提供正面和负面案例数据提供程序。非常高兴。
您可以在testng中使用@Test
标记一个类,这意味着:每个公共方法都是一个测试。在Junit中,您需要在每个方法上复制/粘贴@Test
。
对两者的烦恼是将hamcrest与JUnit捆绑在一起的方式以及JUnit与testng捆绑在一起的方式。 maven中有一些改装的罐子没有这个问题。
我对这两个框架的担忧是它们似乎都停止了发展。发布越来越少,并且往往具有越来越不值得注意的功能。例如,整个BDD运动似乎对这两个框架都没有什么影响。此外,JUnit可以简单地采用我上面列出的大部分内容。没有好的技术理由可以解释为什么JUnit不能实现这些任何东西; JUnit背后的人只是选择不实现这些东西。这两个项目似乎都缺乏对未来发展方向的看法,他们似乎很乐意在过去几年中做一些小调整。
答案 2 :(得分:8)
我正在寻找一个很好的理由将TestNG切换到JUnit,我找到了this幻灯片 Tomek Kaczanowski很好地解决了这个问题。 Tomek是Practical Unit Testing书的作者,它似乎受到开发人员和测试人员的极大尊重。
答案 3 :(得分:1)
如果您使用Java / Scala项目并且Gradle是您选择的构建工具,请记住ScalaTest
框架只有JUnitRunner
来运行您的scala测试。换句话说,您可以选择:
答案 4 :(得分:0)
您可以使用Mockito作为模拟框架。它与TestNG很好地集成。您不必扩展任何类以使用Mockito和TestNG。您测试代码的方式较少,如果出于任何原因需要使用其他模拟框架,则很容易这样做。
答案 5 :(得分:0)
简而言之......
如果您的范围仅限于精细的详细单元测试,并且它们之间没有依赖关系,则可以使用JUnit。
如果您的范围需要功能测试,可能需要/可能不需要依赖关系并在测试之间共享数据(参数),那么选择TestNG。此外,TestNG可以进行类似于JUnit的单元测试。因此,您可以拥有一套单元测试和一套功能测试。