JUnit与TestNG
在工作中,我们目前仍在使用JUnit 3来运行我们的测试。我们一直在考虑切换到JUnit 4来编写新的测试,但是一段时间以来我一直在关注TestNG。大家对JUnit 4或者TestNG都有什么经验,对于大量测试似乎更有效?灵活地编写测试对我们也很重要,因为我们的功能测试涵盖了广泛的方面,需要以多种方式编写才能获得结果。
旧测试不会被重写,因为它们做得很好。我希望在新的测试中看到的是,可以灵活地编写测试,自然断言,分组和易于分布的测试执行方式。
解决方案
回答
首先,我要说的是,不要仅仅为了适应最新的流行而重写所有测试。 Junit3可以很好地工作,并且在4中引入注解并不会给我们带来多少好处(我认为)。你们编写测试更重要,这听起来像我们一样。
使用最自然的方法,可以完成工作。
我没用过TestNG b / c,所以无法发表评论。但是我建议使用unitils,它是JUnit / TestNG / DBUnit / EasyMock的绝佳包装,无论我们采用哪种路线。 (它支持上述所有口味)
回答
我都用过,但是我必须同意Justin Standard的观点,即我们不应该真正考虑将现有测试重写为任何新格式。无论决定如何,同时运行这两个都是很简单的。 TestNG努力比JUnit更具可配置性,但最终它们两者都可以很好地工作。
TestNG具有一项简洁的功能,我们可以将测试标记为特定组,然后轻松运行特定组的所有测试,或者排除特定组的测试。因此,我们可以将运行缓慢的测试标记为"慢速"组,然后在需要快速结果时将其忽略。他们的文档中的建议是将某些子集标记为"签入"测试,每当我们签入新文件时都应运行这些测试。我在JUnit中从未见过这样的功能,但是如果我们没有它,那么再说一遍,我们不会t真的很想念它。
尽管声称它具有高配置,但在几周前,我确实遇到了一个极端案例,在那里我无法做我想做的事情……我希望我能记住它是什么,但我想提出来所以我们知道这并不完美。
TestNG最大的优点是注释... JUnit还是在第4版中添加了注释。
回答
大约一年前,我们遇到了同样的问题。我花了一些时间考虑哪个动作更好,最终我们意识到TestNG没有"杀手级功能"。很好,并且具有JUnit 4不具备的某些功能,但我们不需要它们。
我们不希望人们在了解TestNG的同时感到不舒服,因为我们希望他们继续编写大量测试。
而且,JUnit几乎是Java世界中的事实上的标准。盒子里没有不支持它的体面工具,我们可以在网络上找到很多帮助,并且他们在过去的一年中增加了很多新功能,表明它仍然有效。
我们决定坚持使用JUnit,再也没有回头。
回答
对我而言,TestNG最大的吸引人卡包括其支持的测试组,更重要的是测试组的依存关系(将测试标记为依赖于组会导致在依赖组失败时,测试仅跳过运行)。
对我来说,TestNG的其他吸引人的地方包括测试参数,数据提供程序,注释转换器,以及充满活力和响应能力强的用户社区。
从表面上看,人们可能并不认为上面的TestNGs功能并不需要,但是一旦我们开始理解测试带来的灵活性,我们会想知道如何应对JUnit。
(免责声明我根本没有使用过JUnit 4.x,因此无法真正评论那里的改进或者新功能)。
回答
在Mike Stone的回复中添加了以下内容:
1)我经常使用TestNG的组是当我想在测试套件中运行单个测试方法时。我只是将此测试添加到" phil"组中,然后运行该组。当我使用JUnit 3时,我会注释掉所有方法的条目,但我想在" suite"方法中运行的方法除外,但是通常会忘记在签入之前取消注释它们。与小组一起,我不再有这个问题。
2)根据测试的复杂性,可以使用sed并自动创建从JUnit3到TestNG的测试迁移,并创建基类来替换静态导入所有TestNG assert方法的TestCase。
我在这里和这里都有从JUnit到TestNG迁移的信息。
回答
TestNG的另一个优点是支持并行测试。我认为,在我们的多核时代,这一点很重要。
我也使用了两个框架。但是我使用hamcrest进行断言。 Hamcrest允许我们轻松编写自己的assert方法。所以代替
assertEquals(operation.getStatus(), Operation.Status.Active);
你可以写
assertThat(operation, isActive());
这使我们有机会在测试中使用更高级别的抽象。这使测试更加强大。
回答
我想分享我今天遇到的那个。我发现,与TestNG相比,Junit4中的内置参数化运行程序非常粗糙(我知道每个框架都有其优势,但仍然有优势)。 Junit4注释@parameters仅限于一组参数。我在同一测试类中测试功能的有效和无效行为时遇到了此问题。因此,将使用它找到的第一个公共的,带静态注释的方法,但是它可以以任何顺序找到它们。这使我们不必要地编写了不同的类。但是,TestNG提供了一种干净的方法来为每种方法提供不同类型的数据提供程序。因此,我们可以在相同的测试类中以有效和无效的方式测试相同的代码单元,将有效/无效数据分开放置。我将使用TestNG。
回答
为以上所有内容加油打气。我个人在TestNG中发现自己更喜欢的其他一些东西是:
- 用于TestNG的@BeforeClass在类创建之后发生,因此我们不必仅能在其中调用类的静态方法。
- 并行和参数化测试,也许我只是没有足够的生命...但是我得到了编写一组Selenium测试的机会,接受了驱动程序名称作为参数。然后定义3个并行测试组,每个1个用于IE,FF和Chrome驱动程序,并观看比赛!我原本是4,但是由于太多原因,我处理的页面太多破坏了HtmlUnit驱动程序。
是的,可能需要找到那种生活。 ;)