Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing JUnit 4 vs TestNG-2013-2014年更新_Unit Testing_Junit_Testng - Fatal编程技术网

Unit testing JUnit 4 vs TestNG-2013-2014年更新

Unit testing JUnit 4 vs TestNG-2013-2014年更新,unit-testing,junit,testng,Unit Testing,Junit,Testng,JUnit4和TestNG过去是可比较的。这两个测试框架的优缺点是什么?我今天比较了TestNG和JUnit4,我在测试框架方面的有限经验可以指出的主要优势是TestNG有一种更优雅的方法,可以使用数据提供程序概念来处理参数化测试 就我所知,对于JUnit4,您必须为要测试的每一组参数创建一个单独的测试类(使用@RunWith(Parameterized.class))。使用TestNG,您可以在一个测试类中有多个数据提供程序,因此您也可以在一个测试类中保留单个类的所有测试 到目前为止,这是我唯

JUnit4和TestNG过去是可比较的。这两个测试框架的优缺点是什么?

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

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

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

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

然而,我在TestNG中遇到的一个更恼人的问题是,如果在测试中使用PowerMock来模拟依赖项,那么测试类需要扩展
PowerMockTestCase
。显然,在通过特殊方法或通过
testng.xml
suite定义使用PowerMock时,有一些方法可以配置您的测试框架需要知道的对象工厂,但目前这些方法似乎已被打破。我不喜欢让测试类扩展测试框架类,这似乎有点草率


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

您可以使用Mockito作为模拟框架。它与TestNG很好地集成。您不必扩展任何类就可以将Mockito与TestNG一起使用。这样,测试代码的耦合性会降低,如果出于任何原因需要使用其他模拟框架,那么这样做很容易。

我正在寻找将TestNG转换为JUnit的好理由,我在附近找到了幻灯片
托梅克·卡察诺夫斯基很好地解决了这个问题。Tomek是这本书的作者,这本书似乎深受开发人员和测试人员的尊敬。

根据我对这两个框架的经验,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中的alterate jar没有这个问题

我对这两个框架最大的担忧是它们似乎都停止了发展。发布的频率越来越低,并且往往具有越来越不值得注意的特性。例如,整个BDD运动似乎对这两个框架都没有什么影响。而且,JUnit完全可以采用我上面列出的大部分内容。JUnit不能实现这些东西,没有很好的技术原因;JUnit背后的人只是选择不实现这些东西。这两个项目似乎对未来的发展方向也缺乏远见,而且在过去几年中,他们似乎很乐意做一些小的调整。

简而言之

如果您的范围仅限于精细详细的单元测试,它们之间没有依赖关系,那么可以使用JUnit


如果您的范围需要功能测试,而这些测试可能/可能不需要依赖关系和测试之间的数据(参数)共享,那么选择TestNG。此外,TestNG可以进行与JUnit类似的单元测试。因此,您可以拥有一套单元测试和一套功能测试。

如果您从事Java/Scala项目,并且Gradle是您选择的构建工具,请记住,
ScalaTest
框架只有
JUnitRunner
来运行您的Scala测试。换句话说,您可以选择:

  • Java JUnit测试+Scala测试与JUnitRunner=>更好的Gradle集成一起运行
  • Java testNG tests+Scala测试使用Scala Runner=>较差的Gradle集成运行,因为从Gradle的角度来看,Scala test Runner是一个单一的批量任务

这个答案与问题完全无关。@AdrianShum我认为Konrad试图对JeroenHoek关于将PowerMock与TestNG集成的观点发表评论,因为他似乎没有“评论”特权,我想他把他的评论作为回答。这个回答误解了PowerMock是什么。它不是Mockito的替代品,而是t的补充