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

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

有帮助吗?

解决方案

我已经使用了两者,但我必须同意 Justin Standard 的观点,即您不应该真正考虑将现有测试重写为任何新格式。无论做出什么决定,运行两者都是相当简单的。TestNG 努力比 JUnit 更具可配置性,但最终它们都工作得同样好。

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

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

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

其他提示

首先我想说,不要仅仅为了适应最新的时尚而重写所有的测试。Junit3 工作得非常好,并且 4 中注释的引入并没有给你带来太多好处(在我看来)。更重要的是你们 测试,听起来就像你所做的那样。

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

我无法对 TestNG 发表评论,因为我没有使用过它。但我会推荐 单位, ,JUnit/TestNG/DBUnit/EasyMock 的一个很棒的包装器,无论您采用哪条路线。(支持上述所有口味)

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

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

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

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

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

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

为以上所有内容干杯。我个人发现我更喜欢 TestNG 的其他一些东西是:

  1. @BeforeClass 因为 TestNG 在类创建之后进行,因此您不会受到只能在其中调用类的静态方法的限制。

  2. 并行和参数化测试,也许我的生活还不够......但我只是喜欢编写一组 Selenium 测试,接受驱动程序名称作为参数。然后定义 3 个并行测试组,IE、FF 和 Chrome 车手各 1 个,然后观看比赛!我最初做了 4 个,但是我制作的太多页面都打破了 HtmlUnit 出于某种原因,司机。

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

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

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

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

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

你可以写

assertThat(operation, isActive());

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

对迈克斯通的回复进行了一些补充:

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

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

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

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

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

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

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

In simple terms, TestNG = JUnit + lot more...So, Why debate ? go and grab TestNG :-)

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

我喜欢 TestNG 与 Guice 简洁、简单的集成。

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

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

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

老实说,两个框架之间的差异基本上没有多大意义,除非您专注于集成/自动化测试。根据我的经验,JUnit 是从头开始构建的,用于单元测试,现在正被推向更高级别的测试,IMO 认为它是不适合这项工作的工具。TestNG 在单元测试方面表现出色,并且由于其强大的数据提供和强大的测试执行能力,在集成/自动化测试级别上表现得更好。

现在我认为这是一个单独的问题,如何编写结构良好、可读且可维护的测试。我确信您知道其中大部分内容,但诸如此类 工厂模式, 命令模式页面对象 (如果您的测试网站)至关重要,那么在您的测试 (SUT) 和实际测试(业务逻辑断言)之间建立一个抽象层非常重要。为了获得更好的断言,您可以使用 汉克雷斯特. 。利用 java 继承/接口来减少重复并增强通用性。

差点忘了,还用 测试数据生成器模式, ,这个加上TestNG的dataprovider注解是非常有用的。

我对 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.

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

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

  2. 在 TestNG 中,我们可以使用两种方式参数化测试. 。@Parameter 或 @DataProvider 注释。

    我) @范围 对于简单的情况,需要键值映射。(数据通过xml文件提供)

    二) @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 对比测试NG:您应该选择哪种测试框架?

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

两者几乎相同。TestNG 有一些额外的功能,例如测试套件和依赖性。请查看随附的屏幕截图以获得完整的比较。 Juni5 与 TestNG 的完整比较

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top