在工作中,我们目前仍在使用JUnit 3来运行我们的测试。我们一直在考虑切换到JUnit 4来编写新测试,但我现在已经关注TestNG了一段时间。您对JUnit 4或TestNG有什么经验,对于大量的测试似乎更好?编写测试的灵活性对我们来说也很重要,因为我们的功能测试涵盖了广泛的方面,需要以各种方式编写才能获得结果。
旧的测试不会被重写,因为他们的工作做得很好。我希望在新测试中看到的是测试编写方式的灵活性,自然断言,分组以及易于分布的测试执行。
答案 0 :(得分:62)
我已经使用过两者,但我必须同意Justin Standard,你不应该考虑将现有测试改写为任何新格式。无论做出何种决定,都可以轻而易举地完成这两项任务。 TestNG比JUnit更容易配置,但最终它们都能很好地工作。
TestNG有一个简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或排除特定组的测试。因此,您可以标记在“慢”组中运行缓慢的测试,然后在需要快速结果时忽略它们。他们的文档中的一个建议是将一些子集标记为“checkin”测试,每当你检查新文件时都应该运行。我从来没有在JUnit中看到过这样的功能,但是如果你没有它,你再也不会看到真的很想念它。
对于高配置的所有声明,几周前我碰到了一个角落的情况,我不能做我想做的事情...我希望我能记住它是什么,但我想提起它让你知道它并不完美。
TestNG的最大优势是注释......无论如何,JUnit在版本4中添加了注释。
答案 1 :(得分:20)
首先我要说的是,不要为了适应最新的时尚而重写所有测试。 Junit3运行得非常好,并且在4中引入注释并不会对你产生很大的影响(在我看来)。你们编写测试更重要,听起来就像你一样。
使用看起来最自然的东西,帮助你完成工作。
我无法评论TestNG b / c我没有使用过它。但我会推荐unitils,它是JUnit / TestNG / DBUnit / EasyMock的绝佳包装器,无论你选择哪条路线。 (它支持上面提到的所有口味)
答案 2 :(得分:19)
大约一年前,我们遇到了同样的问题。我花了一些时间考虑哪一步更好,最终我们意识到TestNG没有'杀手级功能'。这很好,并且具有JUnit 4没有的一些功能,但我们不需要它们
我们不希望人们在了解TestNG时感到不舒服,因为我们希望他们继续编写大量测试。
此外,JUnit几乎是Java世界中事实上的标准。没有合适的工具不支持它,你可以在网上找到很多帮助,他们在过去一年中添加了许多新功能,这表明它还活着。
我们决定坚持使用JUnit,从不回头。
答案 3 :(得分:17)
TestNG对我来说最大的抽奖卡包括其支持测试组,更重要的是 - 测试组依赖关系(将测试标记为依赖于组导致测试在依赖组失败时简单地跳过运行)。
TestNG的其他大抽奖卡包括测试参数,数据提供商,注释变换器,以及最重要的用户社区。 p>
虽然从表面上看,可能并不认为上面的所有TestNG功能都不需要,一旦你开始了解测试的灵活性,你就会想知道你是如何应对JUnit的。
(免责声明 - 我根本没有使用过JUnit 4.x,所以我无法真正评论那里的进展或新功能。)
答案 4 :(得分:15)
为上述所有人干杯。我个人发现我在TestNG中更喜欢的其他一些事情是:
TestNG的@BeforeClass
发生在创建类之后,因此您不会仅仅能够调用类中的静态方法。
并行和参数化测试,也许我只是没有足够的生命...但我只是写了一组Selenium测试,接受驱动程序名称作为参数。然后定义3个并行测试组,每个为IE,FF和Chrome驱动程序1,并观看比赛!我最初做了4次,但是由于某种原因,我曾经工作过多的页面打破了HtmlUnit
驱动程序。
答案 5 :(得分:10)
我想分享我今天遇到的那个。我发现内置的参数化跑步者在Junit4中与TestNG比较粗糙(我知道每个框架都有其优势但仍然如此)。 Junit4注释@parameters仅限于一组参数。我在测试同一测试类中的功能的有效和无效行为时遇到此问题。因此,将使用它找到的第一个公共静态注释方法,但它可以按任何顺序找到它们。这导致我们不必要地编写不同的类。但是,TestNG提供了为每种方法提供不同类型的数据提供者的简洁方法。因此,我们可以在同一测试类中以有效和无效的方式测试相同的代码单元,分别放置有效/无效数据。我会选择TestNG。
答案 6 :(得分:7)
TestNG的另一个优点是支持并行测试。在我们的多核时代,我认为这很重要。
我也使用了两个框架。但我使用hamcrest进行断言。 Hamcrest允许您轻松编写自己的断言方法。而不是
assertEquals(operation.getStatus(), Operation.Status.Active);
你可以写
assertThat(operation, isActive());
这使您有机会在测试中使用更高级别的抽象。这使您的测试更加强大。
答案 7 :(得分:5)
Mike Stone回复的几个补充:
1)我使用TestNG组的最常见的事情是当我想在测试套件中运行单个测试方法时。我只是将此测试添加到“phil”组中,然后运行该组。当我使用JUnit 3时,我会注释掉所有方法的条目,但是我想在“套件”方法中运行,但是通常会忘记在签入之前取消注释。对于小组,我不再有这个问题。
2)根据测试的复杂性,可以使用sed自动完成从JUnit3到TestNG的迁移测试,并创建一个基类来替换静态导入所有TestNG断言方法的TestCase。
答案 8 :(得分:5)
JUnit 4 Vs 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 :-)
您可以找到更详细的比较here。
答案 9 :(得分:3)
我喜欢将TestNG与Guice完美而简单地集成。
答案 10 :(得分:3)
你的问题对我来说似乎有两个问题。有一个你想要比较两个测试框架,另一方面你想要轻松实现测试,有自然的断言等...
好的,首先JUnit在功能方面一直在追赶TestNG,他们已经与v4弥合了一些差距,但在我看来还不够好。 TestNG中的注释和数据提供器等功能仍然要好得多。此外,它们在测试执行方面更加灵活,因为TestNG具有测试依赖性,分组和排序。
JUnit仍然需要某些前/后方法是静态的,这限制了在运行测试之前你可以做的事情,TestNG从来没有这个问题。
TBH,主要是两个框架之间的差异并不大,除非您专注于集成/自动化测试。根据我的经验,JUnit是从头开始构建的,用于单元测试,现在正被推向更高级别的测试,IMO使其成为错误的工具。 TestNG在单元测试方面做得很好,并且由于其强大的数据提供和出色的测试执行能力,在集成/自动化测试级别上工作得更好。现在我认为这是一个单独的问题,如何编写结构良好,可读性和可维护性的测试。大多数情况我相信你知道,但工厂模式,命令模式和 PageObjects (如果你的测试网站)是至关重要的,它在测试(SUT)和实际测试之间(业务逻辑的断言)之间有一层抽象是非常重要的。为了获得更好的断言,您可以使用Hamcrest。利用javas继承/接口来减少重复并强制实现通用性。
几乎忘了,也使用测试数据生成器模式,这加上TestNG的dataprovider注释非常有用。
答案 11 :(得分: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.
答案 12 :(得分:3)
{J}中@BeforeClass
和@AfterClass
方法的声明必须是静态的,而在方法声明中,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获得,但是没有开箱即用的报告,你需要依赖插件。
答案 13 :(得分:1)