126

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

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

4

12 回答 12

66

我都使用过,但我必须同意 Justin Standard 的观点,即您不应该真正考虑将现有测试重写为任何新格式。不管决定如何,运行两者都是微不足道的。TestNG 力求比 JUnit 更具可配置性,但最终它们都工作得一样好。

TestNG 有一个简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或排除特定组的测试。因此,您可以将运行缓慢的测试标记为“慢”组,然后在需要快速结果时忽略它们。他们文档中的一个建议是将某些子集标记为“签入”测试,每当您签入新文件时都应运行该测试。我从未在 JUnit 中看到过这样的功能,但话又说回来,如果你没有它,你就没有真的很想念它。

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

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

于 2008-08-09T07:00:34.087 回答
20

首先我要说的是,不要为了迎合最新潮流而重写所有的测试。Junit3 工作得非常好,并且在 4 中引入注解并没有给你带来很多好处(在我看来)。更重要的是你们编写测试,听起来像你做的那样。

使用任何看起来最自然的东西,并帮助您完成工作。

我无法评论 TestNG b/c 我没有使用它。但我会推荐unitils,它是 JUnit/TestNG/DBUnit/EasyMock 的一个很好的包装器,不管你走哪条路。(它支持上面提到的所有口味)

于 2008-08-09T06:33:50.787 回答
18

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

我们决定坚持使用 JUnit,并且永不回头。

于 2008-08-09T09:33:28.257 回答
18

TestNG 对我来说最大的吸引力包括它的支持测试组,更重要的是 - 测试组依赖关系(将测试标记为依赖于组会导致测试在依赖组失败时简单地跳过运行)。

TestNG 对我来说其他重要的吸引力包括测试参数、数据提供者、注释转换器,以及最重要的——充满活力和响应迅速的用户社区。

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

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

于 2008-08-18T10:09:42.563 回答
18

为以上所有人喝彩。我个人发现我更喜欢 TestNG 的其他一些事情是:

  1. for TestNG 发生在@BeforeClass类创建之后,因此您不受只能在其中调用类的静态方法的限制。

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

是啊,可能需要找到那种生活。;)

于 2010-08-19T13:52:21.260 回答
11

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

于 2009-08-05T12:24:34.000 回答
8

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

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

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

你可以写

assertThat(operation, isActive());

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

于 2009-01-10T12:10:43.623 回答
7

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

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

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

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

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

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

于 2016-06-29T22:38:50.827 回答
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 Vs JUnit:有什么区别?

于 2017-12-12T05:02:09.917 回答
5

Mike Stone 的回复中添加了一些内容:

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

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

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

于 2008-09-05T19:44:40.967 回答
4

我对 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.
于 2014-04-06T16:56:18.493 回答
3

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

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

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

TBH,除非您专注于集成/自动化测试,否则这两个框架之间的差异并不大。根据我的经验,JUnit 是从一开始就为单元测试而构建的,现在正被推向更高级别的测试,而 IMO 使它成为该工作的错误工具。TestNG 在单元测试方面表现出色,并且由于其强大的数据提供和强大的测试执行能力,在集成/自动化测试级别上工作得更好。

现在我认为是一个单独的问题,如何编写结构良好、可读性和可维护性好的测试。我相信您知道其中的大部分内容,但是诸如工厂模式命令模式PageObjects(如果您的测试网站)之类的东西是至关重要的,在您的测试 (SUT) 和实际测试之间有一个抽象层是非常重要的是(业务逻辑的断言)。为了获得更好的断言,您可以使用Hamcrest。利用 javas 继承/接口来减少重复并加强通用性。

差点忘了,还用了Test Data Builder Pattern,这个加上TestNG的dataprovider注解非常有用。

于 2013-06-12T09:50:46.390 回答