JUnit与TestNG

Sam*_*ell 120 java testing junit testng

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

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

Mik*_*one 66

我已经使用了两者,但我不得不同意Justin Standard,你不应该考虑将现有测试重写为任何新格式.无论做出何种决定,都可以轻而易举地完成这两项任务.TestNG比JUnit更加可配置,但最终它们同样运行良好.

TestNG具有一个简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或排除特定组的测试.因此,您可以标记在"慢"组中运行缓慢的测试,然后在需要快速结果时忽略它们.他们的文档中的一个建议是将一些子集标记为"checkin"测试,每当你检查新文件时都应该运行.我从来没有在JUnit中看到过这样的功能,但是如果你没有它,你再也不会看到真的很想念它.

对于高配置的所有声明,几周前我碰到了一个角落的情况,我不能做我想做的事情...我希望我能记住它是什么,但我想提起它所以你知道它并不完美.

TestNG的最大优势是注释......无论如何,JUnit在版本4中添加了注释.

  • JUnit可以通过定义测试套件然后将所需组中的测试添加到该套件来完成您正在讨论的分组事务.然后,您可以在ant脚本中设置仅运行该套件的目标,并设置源控件以在签入时运行该目标. (13认同)
  • TestNG组可以在JUnit 4.8中使用以下类别完成:http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html. (8认同)
  • TestNG优于JUnit的最大优势是能够为参数化测试动态生成测试数据.每个测试数据元素都是一个不同的"测试",因此它可以很容易地创建数据驱动的测试http://testng.org/doc/documentation-main.html#parameters (7认同)
  • 使用Theories可以轻松完成参数化测试,这些测试集成在较新版本的Junit中(但目前尚未实验). (6认同)

Jus*_*ard 20

首先我要说的是,不要为了适应最新的时尚而重写所有测试.Junit3运行得非常好,并且在4中引入注释并不会对你产生很大的影响(在我看来).你们编写测试更重要,听起来就像你一样.

使用看起来最自然的东西,帮助您完成工作.

我不能评论TestNG b/c我还没用过它.但我建议使用unitils,这是JUnit/TestNG/DBUnit/EasyMock的绝佳包装器,无论你选择哪条路线.(它支持上面提到的所有口味)


aby*_*byx 19

大约一年前,我们遇到了同样的问题.我花了一些时间考虑哪一步更好,最终我们意识到TestNG没有'杀手级功能'.这很好,并且具有JUnit 4没有的一些功能,但我们不需要它们.
我们不希望人们在了解TestNG时感到不舒服,因为我们希望他们继续编写大量测试.
此外,JUnit几乎是Java世界中事实上的标准.没有合适的工具不支持它,你可以在网上找到很多帮助,他们在过去一年中添加了许多新功能,这表明它还活着.

我们决定坚持使用JUnit,从不回头.


Mar*_*utt 17

TestNG对我来说最大的抽奖卡包括其支持测试组,更重要的是 - 测试组依赖性(将测试标记为依赖于组导致测试在依赖组失败时简单地跳过运行).

TestNG的其他大抽奖卡包括测试参数,数据提供商,注释变换器,以及最重要的 - 充满活力和响应迅速的用户社区.

虽然从表面上看,可能并不认为上面的所有TestNG功能都不需要,一旦你开始了解测试的灵活性,你就会想知道你是如何应对JUnit的.

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

  • 我正在使用JUnit4和TestNG,TestNG更好地支持spring spring-test集成.使基于测试弹簧的应用程序变得更加容易. (3认同)

mez*_*zmo 15

干杯以上所有.我个人发现我在TestNG中更喜欢的其他一些东西是:

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

  2. 并行和参数化测试,也许我只是没有足够的生命...但我只是写了一组Selenium测试,接受驱动程序名称作为参数.然后定义3个并行测试组,每个为IE,FF和Chrome驱动程序1,并观看比赛!我最初做了4次,但是HtmlUnit由于这个或那个原因,我工作过的页面太多了.

是的,可能需要找到生命.;)


rav*_*kam 10

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


Den*_*nov 7

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

我也使用了两个框架.但我使用hamcrest进行断言.Hamcrest允许您轻松编写自己的断言方法.而不是

assertEquals(operation.getStatus(), Operation.Status.Active);
Run Code Online (Sandbox Code Playgroud)

你可以写

assertThat(operation, isActive());
Run Code Online (Sandbox Code Playgroud)

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


Sun*_*amy 6

JUnit 4 Vs TestNG - mkyong.com的比较(2013年更新).

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

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

此外,TestNG还涵盖了整个核心JUnit4功能.我再没有理由再使用JUnit了.

__PRE__

你可以在这里找到更详细的比较.


Sky*_*ker 6

为什么我们使用 TestNG 而不是 JUnit?

  1. @BeforeClass@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 报告生成到一个测试输出文件夹,其中包含 HTML 报告,其中包含所有测试数据、通过/失败/跳过、它们运行了多长时间、使用了哪些输入以及完整的测试日志。此外,它还可以将所有内容导出到一个 XML 文件中,该文件可用于构建您自己的报告模板。

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

资源链接:

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

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


小智 5

Mike Stone回复的几个补充:

1)我使用TestNG组的最常见的事情是当我想在测试套件中运行单个测试方法时.我只是将此测试添加到"phil"组中,然后运行该组.当我使用JUnit 3时,我会注释掉所有方法的条目,但是我想在"套件"方法中运行,但是通常会忘记在签入之前取消注释.随着小组,我不再有这个问题.

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

我在这里这里有关于从JUnit到TestNG的迁移的信息.