JUnit vs TestNG [关闭]
Posted
技术标签:
【中文标题】JUnit vs TestNG [关闭]【英文标题】:JUnit vs TestNG [closed] 【发布时间】:2010-09-05 14:52:44 【问题描述】:在工作中,我们目前仍在使用 JUnit 3 来运行我们的测试。我们一直在考虑切换到 JUnit 4 来编写新测试,但我已经关注 TestNG 有一段时间了。你们在使用 JUnit 4 或 TestNG 时都有哪些经验,并且似乎对于大量测试更有效?编写测试的灵活性对我们来说也很重要,因为我们的功能测试涵盖了广泛的方面,需要以多种方式编写才能获得结果。
旧的测试不会被重写,因为它们可以很好地完成工作。不过,我希望在新测试中看到的是编写测试方式的灵活性、自然断言、分组以及易于分布的测试执行。
【问题讨论】:
08到现在有什么变化吗??? 只需使用TestNG
,它拥有 Junit 所拥有的一切,还有更多!
【参考方案1】:
我都使用过,但我必须同意 Justin Standard 的观点,即您不应该真正考虑将现有测试重写为任何新格式。不管决定如何,运行两者都非常简单。 TestNG 力求比 JUnit 更具可配置性,但最终它们都运行良好。
TestNG 有一个简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或排除特定组的测试。因此,您可以将运行缓慢的测试标记为“慢”组,然后在您想要快速结果时忽略它们。他们文档中的一个建议是将某些子集标记为“签入”测试,每当您签入新文件时都应运行该测试。我从未在 JUnit 中看到过这样的功能,但话又说回来,如果你没有它,你就没有真的很想念它。
尽管它声称拥有高配置,但几周前我确实遇到了一个极端情况,我无法做我想做的事......我希望我能记住它是什么,但我想提出来,让你知道它并不完美。
TestNG 的最大优势是注解......无论如何,JUnit 在版本 4 中添加了这些注解。
【讨论】:
JUnit 可以通过定义一个测试套件然后将所需组中的测试添加到该套件来完成您所说的分组事情。然后,您可以在您的 ant 脚本中设置一个仅运行该套件的目标,并设置您的源代码管理以在签入时运行该目标。 TestNG 相对于 JUnit 的最大优势是能够为参数化测试动态生成测试数据。每个测试数据元素都是不同的“测试”,因此创建数据驱动测试非常容易testng.org/doc/documentation-main.html#parameters 使用理论很容易完成参数化测试,这些理论集成在较新版本的 Junit 中(但目前是实验性的)。 TestNG 组可以在 JUnit 4.8 中完成,类别:kentbeck.github.com/junit/doc/ReleaseNotes4.8.html。 一些未提及的事情:我认为 TestNG 的最大优势是能够将相同的参数传递给每个测试方法,也可以传递给测试之前/之后的配置方法:这对设置很有帮助和拆解,恕我直言,非常强大。如果你不明白这一点,你可能会认为你不需要它。另外,我喜欢你如何在代码中定义测试套件。【参考方案2】:首先我要说的是,不要为了迎合最新潮流而重写所有测试。 Junit3 工作得非常好,并且在 4 中引入注解并没有给你带来很多好处(在我看来)。更重要的是你们编写测试,听起来像你做的那样。
使用任何看起来最自然的东西,并帮助您完成工作。
我无法评论 TestNG b/c 我没有使用它。但我会推荐unitils,它是 JUnit/TestNG/DBUnit/EasyMock 的出色包装器,无论您采用哪种方式。 (它支持上面提到的所有口味)
【讨论】:
Unitils 好像有一段时间没有更新了;它可以与较新版本的 JUnit/TestNG 一起使用吗? 对于任何在 2011 年找到此答案的人,我检查过,最新的 unitils 版本(3.2)的发布日期为:2011-09-29。所以它正在被积极维护。【参考方案3】:TestNG 对我来说最大的吸引力包括它的支持测试组,更重要的是 - 测试组依赖项(将测试标记为依赖于组会导致测试在依赖组失败时简单地跳过运行)。
TestNG 对我来说的其他重要吸引力包括测试参数、数据提供者、注释转换器,以及最重要的——充满活力和响应迅速的用户社区。p>
虽然从表面上看,您可能并不认为上面的所有 TestNGs 功能都可能不需要,但一旦您开始了解为您的测试带来的灵活性,您就会想知道您是如何应对 JUnit 的。
(免责声明 - 我根本没有使用过 JUnit 4.x,因此无法真正评论那里的进步或新功能)。
【讨论】:
我同时使用 JUnit4 和 TestNG,TestNG 对 spring spring-test 集成有更好的支持。使测试基于 Spring 的应用程序变得更加容易。【参考方案4】:大约一年前,我们遇到了同样的问题。我花了一些时间考虑哪个动作更好,最终我们意识到 TestNG 没有“杀手级功能”。它很好,并且有一些 JUnit 4 没有的功能,但我们不需要它们。 我们不希望人们在了解 TestNG 时对编写测试感到不舒服,因为我们希望他们继续编写大量测试。 此外,JUnit 几乎是 Java 世界中事实上的标准。没有一个像样的工具不支持它,你可以在网上找到很多帮助,他们在过去一年中添加了很多新功能,这表明它还活着。
我们决定坚持使用 JUnit,并且从未回头。
【讨论】:
恕我直言,TestNG 的杀手级功能是能够通过 Before 和 After 设置方法传递上下文参数。你可以在那里做很多 Junit 做不到的巧妙的魔术。 95% 的人懒得好好学习 TestNG 并且对它一无所知。此外,TestNG 有一种通过 DataProvider 进行线程化的简洁方式,但前提是您要利用它。此外,testng.xml 可以包含 Beanshell。【参考方案5】:为以上所有干杯。我个人发现我更喜欢 TestNG 的其他一些东西是:
TestNG 的@BeforeClass
发生在类创建之后,因此您不会受限于只能在其中调用类的静态方法。
并行和参数化测试,也许我只是没有足够的生活......但我只是在编写一组 Selenium 测试,接受驱动程序名称作为参数。然后定义 3 个并行测试组,IE、FF 和 Chrome 驱动程序各 1 个,并观看比赛!我最初做了 4 个,但由于某种原因,我处理过的太多页面破坏了HtmlUnit
驱动程序。
是的,可能需要找到那种生活。 ;)
【讨论】:
在所有的 ummm 之后,终于有一些肉味的评论,它们都是平等的 ..and awwing 是的,TestNG 规则:我也通过 TestNG DataProvider 中的测试参数加载驱动程序实例。我是这样做的:github.com/djangofan/yet-another-selenium-framework/blob/master/…【参考方案6】:我想分享我今天遇到的一个。与 TestNG 相比,我发现 Junit4 中的内置参数化运行器相当粗糙(我知道每个框架都有其优势,但仍然如此)。 Junit4 注释 @parameters 仅限于一组参数。我在测试同一测试类中功能的有效和无效行为时遇到了这个问题。因此,它将使用它找到的第一个公共的、静态注释的方法,但它可以以任何顺序找到它们。这导致我们不必要地编写不同的类。然而,TestNG 提供了干净的方式来为每种方法提供不同类型的数据提供者。所以我们可以在同一个测试类中以有效和无效的方式测试相同的代码单元,分别放置有效/无效数据。我会选择 TestNG。
【讨论】:
【参考方案7】:TestNG 的另一个优点是支持并行测试。我认为,在我们的多核时代,这很重要。
我也使用了这两个框架。但我使用 hamcrest 进行断言。 Hamcrest 允许您轻松编写自己的断言方法。所以不是
assertEquals(operation.getStatus(), Operation.Status.Active);
你可以写
assertThat(operation, isActive());
这使您有机会在测试中使用更高级别的抽象。这使您的测试更加健壮。
【讨论】:
【参考方案8】:JUnit 4 与 TestNG - mkyong.com 的比较(2013 年更新)。
结论:我建议使用TestNG作为Java项目的核心单元测试框架,因为TestNG在参数化测试、依赖测试和套件测试(分组概念)方面是更多的进步。
TestNG 用于功能性、高级别的测试和复杂的集成测试。它的灵活性对于大型测试套件特别有用。
此外,TestNG 还涵盖了整个 JUnit4 核心功能。我没有理由再使用 JUnit。
简单来说,TestNG = JUnit + 更多。 那么,为什么要争论呢?去和 抓取 TestNG :-)
您可以找到更详细的比较here。
【讨论】:
【参考方案9】:为什么我们使用 TestNG 而不是 JUnit?
@BeforeClass
和 @AfterClass
方法的声明在 JUnit 中必须是静态的,而 TestNG 在方法声明中具有更大的灵活性,它没有这些限制。
在 TestNG 中,我们可以使用 2 种方式参数化测试。 @Parameter 或 @DataProvider 注解。
i) @Parameter 适用于需要键值映射的简单情况。(数据通过xml文件提供)
ii) @DataProvider 用于复杂情况。使用二维数组,可以提供数据。
在TestNG中,由于@DataProvider方法不需要是静态的,我们可以在同一个测试类中使用多个数据提供者方法。
依赖测试:在TestNG中,如果初始测试失败,那么所有后续的依赖测试都会被跳过,不会被标记为失败。但是 JUnit 将其标记为失败。
分组:单个测试可以属于多个组,然后在不同的上下文中运行(例如慢速或快速测试)。 JUnit 类别中存在类似的功能,但缺少允许初始化测试/拆除测试的 @BeforeGroups / @AfterGroups TestNG 注释。
并行性:如果您想在多个线程上并行运行相同的测试,TestNG 为您提供了一个简单易用的注解,而 JUnit 没有提供简单的方法开箱即用。
TestNG @DataProvider 还可以支持 XML 以输入数据、CSV 甚至纯文本文件。
TestNG 允许您声明测试之间的依赖关系,如果依赖关系测试未通过,则跳过它们。
@Test(dependsOnMethods = "dependOnSomething" )
JUnit 中不存在此功能
-
报告:
TestNG 报告默认生成到测试输出文件夹,其中包含 HTML 报告,其中包含所有测试数据、通过/失败/跳过、运行多长时间、使用了哪个输入以及完整的测试日志。此外,它还将所有内容导出为 XML 文件,可用于构建您自己的报告模板。
在 JUnit 方面,所有这些数据也可以通过 XML 获得,但没有开箱即用的报告,您需要依赖插件。
资源链接:
-
A Quick JUnit vs TestNG Comparison
JUnit vs. TestNG: Which Testing Framework Should You Choose?
本教程并列给出了一个很好的区别:TestNG Vs JUnit: What's the Difference?
【讨论】:
您没有列出 TestNG 最独特的功能,IHMO:将上下文参数传递给 Before 和 After 方法的能力,这使您可以做一些魔术。作为示例,DataProvider 以这种方式工作。【参考方案10】:Mike Stone 的回复中的一些补充:
1) 我最常使用 TestNG 组的情况是当我想在测试套件中运行单个测试方法时。我只需将此测试添加到组“phil”,然后运行该组。当我使用 JUnit 3 时,我会注释掉所有方法的条目,但我想在“套件”方法中运行的方法除外,但随后通常会忘记在签入之前取消注释它们。有了群组,我就不再有这个问题了。
2) 根据测试的复杂性,可以使用 sed 自动将测试从 JUnit3 迁移到 TestNG,并创建一个基类来替换静态导入所有 TestNG 断言方法的 TestCase。
我有关于我从 JUnit 迁移到 TestNG here 和 here 的信息。
【讨论】:
签入你不想要的更改的问题实际上是因为你必须检查你正在签入的内容。如果你有一个很大的签入,那不是借口,那是另一个问题:您应该有许多较小的签到。【参考方案11】:我对 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.
【讨论】:
【参考方案12】:你的问题对我来说似乎是两个折叠。一方面您想比较两个测试框架,另一方面您想轻松实现测试,拥有自然断言等......
好的,首先 JUnit 在功能方面一直在追赶 TestNG,他们已经在 v4 中弥补了一些差距,但在我看来还不够好。在 TestNG 中,注释和数据提供者之类的东西仍然要好得多。此外,它们在测试执行方面更加灵活,因为 TestNG 具有测试依赖、分组和排序。
JUnit 仍然要求某些 before/after 方法是静态的,这限制了您在运行测试之前可以做的事情,TestNG 从来没有这个问题。
TBH,除非您专注于集成/自动化测试,否则这两个框架之间的差异并不大。根据我的经验,JUnit 是从一开始就为单元测试而构建的,现在正被推向更高级别的测试,而 IMO 使它成为这项工作的错误工具。 TestNG 在单元测试方面表现出色,并且由于其强大的数据提供和出色的测试执行能力,在集成/自动化测试级别上表现更好。
现在我认为是一个单独的问题,如何编写结构良好、可读和可维护的测试。我相信您知道其中的大部分内容,但是像 Factory Pattern、Command Pattern 和 PageObjects(如果您的测试网站)是至关重要的,它在您的测试(SUT)和实际测试(业务逻辑的断言)之间有一个抽象层是非常重要的。为了有更好的断言,你可以使用Hamcrest。利用 javas 继承/接口来减少重复和强制通用性。
差点忘了,也用Test Data Builder Pattern,这个加上TestNG的dataprovider注解很有用。
【讨论】:
以上是关于JUnit vs TestNG [关闭]的主要内容,如果未能解决你的问题,请参考以下文章