JUnit vs TestNG在工作中,我们目前仍在使用JUnit 3运行测试。 我们一直在考虑切换到JUnit 4来编写新的测试,但是一段时间以来我一直在关注TestNG。 大家对JUnit 4或TestNG都有什么经验,对于大量测试似乎更有效? 灵活地编写测试对我们也很重要,因为我们的功能测试涵盖了广泛的方面,需要以多种方式编写才能获得结果。 旧测试不会被重写,因为它们做得很好。 我想在新的测试中看到的是,测试的编写方式,自然的断言,分组和易于分布的测试执行具有灵活性。 我都使用过,但是我必须同意Justin Standard的观点,即您不应该真正考虑将现有测试重写为任何新格式。无论决定如何,同时运行这两个都是很简单的。 TestNG努力比JUnit更具可配置性,但最终它们两者都可以很好地工作。 TestNG具有一项简洁的功能,您可以将测试标记为特定组,然后轻松运行特定组的所有测试,或者排除特定组的测试。因此,您可以将运行缓慢的测试标记为"慢速"组,然后在需要快速结果时将其忽略。他们的文档中的建议是将某些子集标记为"签入"测试,每当您签入新文件时都应运行这些测试。我在JUnit中从未见过这样的功能,但是如果您没有它,那么再次声明,您不会t真的很想念它。 尽管声称它具有高配置,但在几周前,我确实遇到了一个死角,在那里我无法做我想做的事...我希望我能记住它是什么,但我想提出来所以您知道这并不完美。 TestNG具有的最大优势是注释... JUnit还是在第4版中添加了注释。 首先,我要说的是,不要仅仅为了适应最新的流行而重写所有测试。 Junit3可以很好地工作,并且在4中引入注解并不会给您带来多少(我认为)。你们编写测试更重要,这听起来像您一样。 使用最自然的方法,可以帮助您完成工作。 我没用过TestNG b / c,所以无法发表评论。但是我建议使用unitils,它是JUnit / TestNG / DBUnit / EasyMock的一个很好的包装,无论您采用哪种路线。 (它支持上述所有口味)
大约一年前,我们遇到了同样的问题。我花了一些时间考虑哪个动作更好,最终我们意识到TestNG没有"杀手级功能"。很好,并且具有JUnit 4不具备的某些功能,但我们不需要它们。 我们决定坚持使用JUnit,再也没有回头。 对我来说,TestNG最大的吸引卡包括其支持的测试组,更重要的是-测试组的依存关系(将测试标记为依赖于组会导致在依赖的组发生故障时,测试仅跳过运行)。 对我来说,TestNG的其他吸引人的东西包括测试参数,数据提供程序,注释转换器,以及其他-充满活力且反应迅速的用户社区。 从表面上看,人们可能并不认为上面的TestNGs功能并不需要,但是一旦您开始理解测试带来的灵活性,您就会想知道如何应对JUnit。 (免责声明-我根本没有使用过JUnit 4.x,因此无法真正评论那里的改进或新功能)。 为以上所有加油。我个人在TestNG中发现自己更喜欢的其他一些东西是:
TestNG的
并行和参数化测试,也许我只是没有足够的生命...但是我得到了编写一组Selenium测试的机会,接受了驱动程序名称作为参数。然后定义3个并行测试组,每个1个用于IE,FF和Chrome驱动程序,并观看比赛!我原本是4,但是由于某种原因,我处理的太多页面破坏了 是的,可能需要找到那种生活。 ;) 我想分享我今天遇到的那个。与TestNG相比,我发现Junit4中内置的参数化运行程序非常粗糙(我知道每个框架都有其优势,但仍然可以)。 Junit4注释@parameters仅限于一组参数。我在同一测试类中测试功能的有效和无效行为时遇到了此问题。因此,将使用它找到的第一个公共的,带静态注释的方法,但是它可以以任何顺序找到它们。这导致我们不必要地编写不同的类。但是,TestNG提供了一种干净的方法来为每种方法提供不同类型的数据提供程序。因此,我们可以在相同的测试类中以有效和无效的方式测试相同的代码单元,将有效/无效数据分开放置。我将使用TestNG。 TestNG的另一个优点是支持并行测试。我认为,在我们的多核时代,这很重要。 我还使用了两个框架。但是我用hamcrest作断言。 Hamcrest允许您轻松编写自己的assert方法。所以代替
你可以写
这使您有机会在测试中使用更高级别的抽象。这使您的测试更加强大。 JUnit 4与TestNG – mkyong.com的比较(2013年更新)。 结论:我建议使用TestNG作为Java项目的核心单元测试框架,因为TestNG在参数化测试,依赖性测试和套件测试(分组概念)方面更先进。 TestNG用于功能性,高级测试和复杂的集成测试。它的灵活性对于大型测试套件尤其有用。 此外,TestNG还涵盖了整个JUnit4核心功能。我完全没有理由再使用JUnit。
您可以在此处找到更详细的比较。 在Mike Stone的回复中添加了以下内容: 1)我经常使用TestNG的组是当我想在测试套件中运行单个测试方法时。我只是将此测试添加到" phil"组中,然后运行该组。当我使用JUnit 3时,我会注释掉所有方法的条目,但我想在" suite"方法中运行的方法除外,但是通常会忘记在签入之前取消注释它们。与小组一起,我不再有这个问题。 2)根据测试的复杂程度,可以使用sed并自动创建从JUnit3到TestNG的测试迁移,并创建一个基类来代替TestCase,该类静态导入所有TestNG assert方法。 我在这里和这里都有从JUnit迁移到TestNG的信息。 为什么我们使用TestNG代替JUnit?
在TestNG中,我们可以使用两种方法对测试进行参数化。 @Parameter或@DataProvider批注。 i)@Parameter,用于需要键值映射的简单情况。(数据通过xml文件提供) ii)@DataProvider用于复杂情况。使用二维数组,它可以提供数据。 在TestNG中,由于@DataProvider方法不必是静态的,因此我们可以在同一测试类中使用多个数据提供程序方法。 依赖测试:在TestNG中,如果初始测试失败,则将跳过所有后续的依赖测试,而不标记为失败。但是JUnit标记为失败。 分组:单个测试可以属于多个组,然后在不同的上下文中运行(例如慢速或快速测试)。 JUnit类别中存在类似的功能,但缺少@BeforeGroups / @AfterGroups TestNG批注,该批注允许初始化测试/将其拆解。 并行性:如果您想在多个线程上并行运行相同的测试,则TestNG会为您提供一个易于使用的注释,而JUnit则没有开箱即用的简单方法。 TestNG @DataProvider还可以支持XML,用于输入数据,CSV甚至纯文本文件。 TestNG允许您声明测试之间的依赖关系,如果未通过依赖项测试,则可以跳过它们。
JUnit中不存在此功能 默认情况下,TestNG报告会生成到一个test-output文件夹,该文件夹包含HTML报告,其中包含所有测试数据,通过/失败/跳过,运行了多长时间,使用了哪些输入以及完整的测试日志。此外,它还将所有内容导出到XML文件,该文件可用于构建您自己的报告模板。 在JUnit前端,所有这些数据也可以通过XML获得,但是没有开箱即用的报告,您需要依靠插件。 资源链接: 本教程并排给出了一个很好的区别:TestNG与JUnit:有何区别? 我对让TestNG真正强大得多的看法:
您的问题对我来说似乎是两个问题。一方面,您想比较两个测试框架,另一方面,您想轻松地实现测试,拥有自然的断言等。 好的,首先,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注释一起非常有用。 我喜欢TestNG与Guice的简洁易用的集成。 请使用枝形吊灯模式:
两者几乎相同。 TestNG具有一些额外的功能,例如测试套件和依赖性。请找到随附的screeshot以获得完整的比较。完整的Juni5与TestNG比较 |