JUnit与TestNG
在工作中,我们目前仍在使用JUnit 3来运行我们的testing。 我们一直在考虑切换到JUnit 4来编写新的testing,但是现在我一直在关注TestNG。 你们对JUnit 4或者TestNG有什么经验,而且对于大量的testing来说,它们似乎工作得更好? 编写testing的灵活性对于我们来说也很重要,因为我们的functiontesting涵盖了一个广泛的方面,需要用各种方式编写来获得结果。
旧的testing不会被重写,因为他们的工作很好。 我希望在新的testing中看到,testing的写法,自然断言,分组和易于分布的testing执行的灵活性。
我已经使用了两种,但我必须同意贾斯汀标准,你不应该真的考虑重写你现有的testing,以任何新的格式。 无论做出什么决定,运行两者都是非常简单的。 TestNG努力比JUnit更可configuration,但最终他们都工作得很好。
TestNG有一个很好的function,您可以将testing标记为特定的组,然后轻松地运行特定组的所有testing,或排除特定组的testing。 因此,您可以标记像“慢”组中那样缓慢运行的testing,然后在想要快速结果时忽略它们。 他们的文档中的build议是将一些子集标记为“签入”testing,无论您何时检查新文件,都应该运行。我从来没有在JUnit中看到过这样的function,但是如果没有,真的很想念它。
对于所有高configuration的要求,几周前我碰到了一个angular落案例,我不能做我想做的事情…我希望我能记得它是什么,但我想把它提出来所以你知道这不是完美的。
TestNG最大的优势就是JUnit在版本4中添加的注释。
首先我会说,不要重写所有的testing,以适应最新的时尚。 Junit3工作得很好,在4中引入注释并不会给你带来太大的帮助(在我看来)。 你们写testing更重要,听起来就像你一样。
使用任何看起来最自然的东西,并帮助您完成工作。
我不能评论TestNG B / C我没有使用它。 但是我会推荐单元,这是JUnit / TestNG / DBUnit / EasyMock的一个很好的包装,不pipe你采用哪条路线。 (它支持上面提到的所有口味)
大约一年前,我们遇到了同样的问题。 我花了一些时间考虑哪个更好,最终我们意识到TestNG没有“杀手级特性”。 这很好,并且具有JUnit 4没有的一些function,但是我们并不需要它们。
我们不希望人们在了解TestNG的时候感到不舒服,因为我们希望他们继续写很多testing。
另外,JUnit几乎是Java世界中的事实标准。 没有体面的工具不支持它,你可以在网上find很多帮助,并在过去的一年里增加了很多新function,这些function显示了它的活力。
我们决定坚持使用JUnit,永不回头。
TestNG对我最大的抽奖卡包括它的支持testing组,更重要的是testing组的依赖关系(将testing标记为依赖于组,导致testing在依赖组失败时简单地跳过运行)。
TestNG为我提供的其他大型抽奖卡包括testing参数,数据提供商,注释转换器,以及更多的东西 – 充满活力和敏感的用户群体。
虽然从表面上看,可能并不需要上面所有的TestNGfunction,但是一旦开始了解灵活性为您的testing带来了什么后,您就会想知道如何应对JUnit。
(免责声明 – 我还没有使用JUnit 4.x,所以我无法真正评论那里的进步或新function)。
欢呼所有以上。 我个人发现的其他一些我在TestNG中更喜欢的东西是:
-
TestNG的
@BeforeClass
是在创build类之后进行的,所以你不受限于只能调用你的类的静态方法。 -
并行和参数化testing,也许我只是没有足够的生命…但我只是写一套Seleniumtesting,接受驱动程序名称作为参数踢。 然后定义3个平行testing组,IE,FF和Chrome司机各1个,并观看比赛! 我原来做了4,但是我工作的页面太多,出于某种原因打破了
HtmlUnit
驱动程序。
是的,可能需要find那个生活。 ;)
我想分享一下我今天遇到的那个。 我发现内置的Parameterized runner在Junit4中相对于TestNG是相当粗糙的(我知道每个框架都有其优势,但是仍然存在)。 Junit4注解@parameters被限制为一组参数。 我在testing相同testing类中的function的有效和无效行为时遇到此问题。 所以它会find第一个公开的静态注释的方法,但是它可能会以任何顺序find它们。 这使我们不必要地编写不同的类。 但是TestNG提供了一种简洁的方法来为每种方法提供不同types的数据提供者。 所以我们可以在相同的testing类中分别使用有效和无效的方法来testing相同的代码单元。 我会和TestNG一起去的。
TestNG的另一个优势是支持并行testing。 在我们这个多核的时代,我认为这很重要。
我也使用了这两个框架。 但我使用hamcrest断言。 Hamcrest允许您轻松编写自己的断言方法。 所以,而不是
assertEquals(operation.getStatus(), Operation.Status.Active);
你可以写
assertThat(operation, isActive());
这使您有机会在testing中使用更高层次的抽象。 这使得你的testing更健壮。
迈克·斯通的回复是:
1)我使用TestNG组的最常见的事情是当我想在一个testing套件中运行一个testing方法的时候。 我只是将这个testing添加到“phil”组中,然后运行这个组。 当我使用JUnit 3时,我会注释掉所有方法的条目,但是我想用“suite”方法运行,但是通常会在签入前忘记取消注释。 与团体,我不再有这个问题。
2)根据testing的复杂性,将testing从JUnit3迁移到TestNG可以用sed自动完成,并创build一个基类来replaceTestCase,静态导入所有的TestNG断言方法。
我有我从JUnit迁移到TestNG 这里和这里的信息 。
JUnit 4 Vs TestNG – 由mkyong.com比较(2013年更新)。
结论:我build议使用TestNG作为Java项目的核心unit testing框架,因为TestNG在参数化testing,依赖性testing和套件testing(分组概念)方面更加先进。
TestNG旨在用于function性,高级testing和复杂集成testing。 它的灵活性对大型testing套件尤其有用。
另外, TestNG还涵盖了整个JUnit4的核心function 。 我没有理由再使用JUnit了。
In simple terms, TestNG = JUnit + lot more...So, Why debate ? go and grab TestNG :-)
你可以在这里find更详细的比较。
我喜欢TestNG和Guice的整合和简单的整合。
你的问题似乎有两个折叠给我。 一方面你想比较两个testing框架,另一方面你想轻松地实现testing,有自然的断言等等。
好的,首先JUnit已经在function方面与TestNG发生了冲突,他们已经把V4中的一些东西缩小了,但在我看来还不够好。 在TestNG中,注释和数据提供者等事情仍然好得多。 而且在testing执行方面它们更加灵活,因为TestNG具有testing依赖性,分组和sorting。
JUnit仍然要求某些前后方法是静态的,这限制了在testing运行之前你可以做的事情,TestNG从来没有这个问题。
TBH,除非您专注于集成/自动化testing,否则这两个框架之间的差异通常不会太大。 根据我的经验,JUnit是从unit testing的底层开始构build的,现在正朝着更高水平的testing迈进,而IMO使其成为工作的错误工具。 TestNG在unit testing方面做得很好,由于其强大的数据提供和强大的testing执行能力,在集成/自动化testing级别上工作得更好。
现在我认为是一个单独的问题,如何编写结构良好,可读性和可维护性的testing。 其中大部分我相信你知道,但像Factory Pattern , Command Pattern和PageObjects (如果你的testing网站)是至关重要的,在你的testing(SUT)和实际testing之间有一个抽象层是非常重要的是(商业逻辑的断言)。 为了有更好的断言,你可以使用Hamcrest 。 利用javasinheritance/接口来减less重复和强制通用性。
几乎忘记了,也使用Test Data Builder Pattern ,这与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.