JUnit与TestNG [关闭]


125

在工作中,我们目前仍在使用JUnit 3运行测试。我们一直在考虑切换到JUnit 4来编写新的测试,但是一段时间以来我一直在关注TestNG。你们都对JUnit 4或TestNG有什么经验,对于大量测试似乎更有效?灵活地编写测试对我们也很重要,因为我们的功能测试涵盖了广泛的方面,需要以多种方式编写才能获得结果。

旧测试不会被重写,因为它们做得很好。我希望在新的测试中看到的是,可以灵活地编写测试,自然断言,分组和易于分布的测试执行方式。


10
从08到现在有没有变化???
some_other_guy 2012年

只需使用TestNG它,它就能获得Junit所拥有的一切,还有更多!
Eric Wang

Answers:


67

我都使用过,但是我必须同意Justin Standard的观点,即您不应该真正考虑将现有测试重写为任何新格式。无论决定如何,同时运行这两个都是很简单的。TestNG努力比JUnit更具可配置性,但最终它们两者都可以很好地工作。

TestNG具有一项简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或者排除特定组的测试。因此,您可以将运行缓慢的测试标记为“慢速”组,然后在需要快速结果时将其忽略。他们的文档中的建议是将某些子集标记为“签入”测试,每当您检入新文件时都应运行这些测试。我在JUnit中从未见过这样的功能,但是如果您没有它,那么再说一次,您不会t真的很想念它。

尽管声称它具有高配置,但在几周前,我确实遇到了一个极端案例,在那里我无法做我想做的事...我希望我能记住它是什么,但我想提出来所以你知道这并不完美。

TestNG具有的最大优势是注释……JUnit还是在版本4中添加了注释。


14
JUnit可以通过定义测试套件,然后将所需组中的测试添加到该套件中来完成您正在谈论的分组工作。然后,您可以在仅运行该套件的ant脚本中设置目标,并设置源代码控制以在签入时运行该目标。
贾斯汀标准时间

8
与JUnit相比,TestNG的最大优点是能够动态生成用于参数化测试的测试数据。每个测试数据元素都是一个不同的“测试”,因此创建数据驱动测试testng.org/doc/documentation-main.html#parameters
davetron5000

6
使用Theories可以轻松完成参数化测试,这些理论已集成在Junit的较新版本中(但目前仍处于试验阶段)。
Mnementh,2009年

9
可以在JUnit 4.8中使用以下类别完成TestNG组:kentbeck.github.com/junit/doc/ReleaseNotes4.8.html
Kaitsu

一些未提及的事情:我认为TestNG的最大优点是能够传递与每个测试方法相同的参数,也可以传递给之前/之后的测试配置方法:这对设置和拆卸很有帮助,恕我直言,功能非常强大。如果您不了解,可能会认为您不需要它。另外,我喜欢如何在代码中定义测试套件。
djangofan

20

首先,我要说的是,不要仅仅为了适应最新的流行而重写所有测试。Junit3可以很好地工作,并且在4中引入注解并不会给您带来多少好处(我认为)。你们编写测试更重要,这听起来像您一样。

使用最自然的方法,可以帮助您完成工作。

我没用过TestNG b / c,所以无法发表评论。但是我建议使用unitils,它是JUnit / TestNG / DBUnit / EasyMock的出色包装,无论您采用哪种路线。(它支持上述所有口味)


1
Unitils好像没有一段时间更新过;它可以与新版本的JUnit / TestNG一起使用吗?
Chinasaur'2

我检查了哪些在2011年找到此答案的用户,最新的unitils版本(3.2)的发布日期为:2011-09-29。因此,它正在被积极维护。
Ogre Psalm33,2011年

18

对我来说,TestNG最大的吸引人之处包括其支持的测试组,更重要的是-测试组依赖关系(将测试标记为依赖于某个组会导致在依赖组失败时,测试仅跳过运行)。

对我来说,TestNG的其他吸引人的东西包括测试参数,数据提供程序,注释转换器,以及其他-充满活力且反应迅速的用户社区。

从表面上看,人们可能并不认为上面的TestNGs功能并不需要,但是一旦您开始理解测试带来的灵活性,您会想知道如何应对JUnit。

(免责声明-我根本没有使用过JUnit 4.x,因此无法真正评论那里的改进或新功能)。


3
我同时使用JUnit4和TestNG,TestNG更好地支持spring-spring-test集成。使基于Spring的应用程序的测试变得更加容易。
hidralisk 2012年

18

大约一年前,我们遇到了同样的问题。我花了一些时间考虑哪个动作更好,最终我们意识到TestNG没有“杀手级功能”。很好,并且具有JUnit 4不具备的某些功能,但我们不需要它们。
我们不希望人们在了解TestNG的同时感到不舒服,因为我们希望他们继续编写很多测试。
而且,JUnit几乎是Java世界中的事实上的标准。盒子里没有不支持它的体面工具,您可以在网络上找到很多帮助,并且他们在过去的一年中增加了很多新功能,表明它仍然有效。

我们决定坚持使用JUnit,再也没有回头。


恕我直言,TestNG的杀手级功能是能够通过“之前”和“之后”设置方法传递上下文参数。您可以在那里进行许多Junit无法做到的整洁魔术。95%的人不太愿意学习TestNG,并且对此一无所知。而且,TestNG具有通过DataProvider进行线程化的一种巧妙方法,但前提是您要利用它。另外,testng.xml可以包含Beanshell。
djangofan

17

为以上所有加油。我个人在TestNG中发现自己更喜欢的其他一些东西是:

  1. @BeforeClass创建类之后TestNG的发生,这样你就不会只能够打电话给你的类的静态方法,它的约束。

  2. 并行和参数化测试,也许我只是没有足够的生命...但是我得到了编写一组Selenium测试的机会,接受了驱动程序名称作为参数。然后定义3个并行测试组,每个1个用于IE,FF和Chrome驱动程序,并观看比赛!我本来是4,但是HtmlUnit由于某种原因,我处理的太多页面破坏了驱动程序。

是的,可能需要找到生活。;)


终于在他们都相等之后终于发表了一些有肉味的评论..并且awwhing
user2412398

是的,TestNG规则:我也通过TestNG DataProvider的测试参数加载驱动程序实例。这里是我是如何做到的: github.com/djangofan/yet-another-selenium-framework/blob/master/...
djangofan

10

我想分享我今天遇到的那个。与TestNG相比,我发现Junit4中内置的参数化运行程序非常粗糙(我知道每个框架都有其优势,但仍然可以)。Junit4注释@parameters仅限于一组参数。我在同一测试类中测试功能的有效和无效行为时遇到了此问题。因此,将使用它找到的第一个公共的,带静态注释的方法,但是它可以以任何顺序找到它们。这导致我们不必要地编写不同的类。但是,TestNG提供了一种干净的方法来为每种方法提供不同类型的数据提供程序。因此,我们可以在同一测试类中以有效和无效的方式测试相同的代码单元,分别将有效/无效数据分开。我将使用TestNG。


7

TestNG的另一个优点是支持并行测试。我认为,在我们的多核时代,这很重要。

我还使用了两个框架。但是我使用hamcrest进行断言。Hamcrest允许您轻松编写自己的assert方法。所以代替

assertEquals(operation.getStatus(), Operation.Status.Active);

你可以写

assertThat(operation, isActive());

这使您有机会在测试中使用更高级别的抽象。这使您的测试更加强大。


7

JUnit 4与TestNG – mkyong.com的比较(2013年更新)。

结论:我建议使用TestNG作为Java项目的核心单元测试框架,因为TestNG 在参数化测试,依赖性测试和套件测试(分组概念)方面先进。

TestNG用于功能性,高级测试和复杂的集成测试。它的灵活性对于大型测试套件特别有用。

另外,TestNG还涵盖了整个JUnit4核心功能。我完全没有理由再使用JUnit。

简单来说,TestNG = JUnit +更多。那么,为什么要辩论呢?去抢TestNG :-)

您可以在此处找到更详细的比较。


5

迈克·斯通的回复有几处补充:

1)我最常使用TestNG的组的是当我想在测试套件中运行单个测试方法时。我只是将此测试添加到“ phil”组中,然后运行该组。当我使用JUnit 3时,我会注释掉所有方法的条目,但我想在“ suite”方法中运行的方法除外,但是通常会忘记在签入之前取消注释它们。与小组一起,我不再有这个问题。

2)根据测试的复杂性,可以使用sed并自动创建从JUnit3到TestNG的测试迁移,并创建一个基类来代替TestCase,该类静态导入所有TestNG assert方法。

我在这里这里都有从JUnit迁移到TestNG的信息


签入您原本不想要的更改的问题实际上是因为您必须查看所签入的内容。而且,如果签入量很大,这不是借口,这是另一个问题:您应该有许多较小的签到。
hidralisk 2012年

5

为什么我们使用TestNG代替JUnit?

  1. @BeforeClassand @AfterClass方法的声明在JUnit中必须是静态的,而TestNG在方法声明中具有更大的灵活性,它没有这些约束。

  2. 在TestNG中,我们可以使用2种方法对测试进行参数化。@Parameter或@DataProvider批注。

    i)@Parameter,用于需要键值映射的简单情况。(数据通过xml文件提供)

    ii)@DataProvider用于复杂情况。使用二维数组,它可以提供数据。

  3. 在TestNG中,由于@DataProvider方法不必是静态的,因此我们可以在同一测试类中使用多个数据提供程序方法。

  4. 依赖测试:在TestNG中,如果初始测试失败,则将跳过所有后续的依赖测试,而不标记为失败。但是JUnit标记为失败。

  5. 分组:单个测试可以属于多个组,然后在不同的上下文中运行(例如慢速或快速测试)。JUnit类别中存在类似的功能,但是缺少@BeforeGroups / @AfterGroups TestNG批注,该批注允许初始化测试/将其拆解。

  6. 并行性:如果您想在多个线程上并行运行相同的测试,TestNG会为您提供一个易于使用的注释,而JUnit并没有提供一种简单的方法来立即执行此操作。

  7. TestNG @DataProvider还可以支持XML,用于输入数据,CSV甚至纯文本文件。

  8. TestNG允许您声明测试之间的依赖关系,如果未通过依赖项测试,则跳过它们。

@Test(dependsOnMethods = {“ dependOnSomething”})

JUnit中不存在此功能

  1. 报告:

默认情况下,TestNG报告生成到一个test-output文件夹,该文件夹包含HTML报告,其中包含所有测试数据,通过/失败/跳过,运行了多长时间,使用了哪些输入以及完整的测试日志。此外,它还将所有内容导出到XML文件,该文件可用于构建您自己的报告模板。

在JUnit方面,所有这些数据也可以通过XML获得,但是没有开箱即用的报告,您需要依赖插件。

资源链接:

  1. JUnit与TestNG的快速比较
  2. JUnit与TestNG:您应该选择哪种测试框架?

本教程并排给出了一个很好的区别:TestNG与JUnit:有什么区别?


您没有列出TestNG最明显的功能,即IHMO:将上下文args传递到Before和After方法的功能,这使您可以做一些魔术。作为示例,DataProvider以这种方式工作。
djangofan

3

您的问题对我来说似乎是两个问题。一方面,您想比较两个测试框架,另一方面,您想轻松地实现测试,拥有自然的断言等。

好的,首先,JUnit在功能方面一直在赶上TestNG,他们在v4方面弥补了差距,但我认为还不够好。注释和数据提供程序之类的东西在TestNG中仍然要好得多。此外,由于TestNG具有测试依赖性,分组和排序,因此它们在测试执行方面更加灵活。

JUnit仍然需要某些before / after方法是静态的,这限制了您在运行测试之前可以执行的操作,而TestNG从来没有这个问题。

TBH,大多数情况下,这两个框架之间的差异并不大,除非您专注于集成/自动化测试。根据我的经验,JUnit是从头开始为单元测试而构建的,现在正朝着更高水平的测试方向发展,这使IMO成为执行该任务的错误工具。TestNG在单元测试中表现出色,并且由于其强大的数据提供能力和强大的测试执行能力,因此在集成/自动化测试级别上表现更好。

现在,对于我认为是一个单独的问题,如何编写结构良好,可读性和可维护性的测试。我敢肯定,其中大多数都知道,但是诸如Factory PatternCommand PatternPageObjects(如果是测试网站)之类的东西至关重要,在您的测试(SUT)和实际测试之间建立一层抽象非常重要。是(业务逻辑断言)。为了拥有更好的断言,可以使用Hamcrest。利用javas继承/接口来减少重复并强制通用性。

几乎忘记了,还使用了Test Data Builder Pattern,这与TestNG的dataprovider注释一起非常有用。


3

我对让TestNG真正强大得多的看法:

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.