JUnit 5 对比 TestNG

JUnit 和 TestNG 是 Java 应用测试领域最流行的测试框架。这两个框架早已经是很完善并且简单易用。所以当你为你的应用去选择测试框架时,最好有一个高层次的想法,对比两种框架的所有的特质,然后再基于你的项目的实际需要来做决定。

1 JUnit 对比 TestNG

JUnit 当前的版本是 5.2.0 并且它仍然在不断的更新迭代、致力于囊括更多的特质。TestNG 当前的版本是 6.14.3 并且 它变得愈来愈成熟,拥有优秀功能也在增加。

下面的表格是对比 JUnit 和 TestNG 的不同特点。表格包括了两种框架当前的不同优秀特点和相似的功能点,比如异常、超时设置、生命周期回调等方法。

特点JUnit 5TestNG总结链接
注解支持注解支持注解两者都基于注解,并且本质和用法都相似JUnit 注解TestNG 注解
易用性JUnit 5 嵌入了多种模块,你需要通过JUnit Platform 和 JUnit Jupiter 来编写测试用例单一模块是TestNG 的特点TestNG 更易用JUnit Maven 依赖TestNG Maven 依赖
IDE 支持被 Eclipse 和 IntelliJ IDEA 等主流 IDE 支持被 Eclipse 和 IntelliJ IDEA 等主流 IDE 支持两者都被主流 IDE 所支持JUnit Tests EclipseEclipse TestNG 插件
数据提供方式支持多种测试数据提供方式,例如方法、枚举、CSV 数据、CSV文件等仅支持 provider 方法和testng xml 文件方式JUnit 在注入测试数据方面做得更好JUnit 参数化测试, TestNG DataProvider 方法TestNG 参数注入
测试套件JUnit 5 仍然不支持测试套件,至本文发布时仍然在开发过程中,可以通过下面的网址GitHub Issue 来查询当前开发状态TestNG 可以装测试用例作为测试套件一起执行。我们可以使用 @Factory 注解来运行多个测试类。对于你的松散的测试用来,TestNG XML 良好的支持创建复杂的测试套件TestNG 对于测试套件有更好的支持TestNG @Factory, TestNG XML Suite
HTML 报告我们需要额外的插件 surefire-report-plugin 来生成 HTML 报告TestNG 可以在测试运行后自动创建 HTNL 报告TestNG 的 HTML 报告看起来已经过时了,但是简单易用。如果你需要与其他人分享 HTML 测试报告,我建议你用JUnitJUnit HTML 报告, TestNG Tutorial
从 Java 主方法运行我们使用 JUnit 5 来通过 java 主方法来运行测试用例我们能使用 TestNG 的 run() 方法来在 Java 主方法中运行测试用例两者都支持在 Java 主方法中运行测试用例JUnit Launcher API Docs, TestNG 从主方法运行
断言JUnit 提供了足够多的断言方法来对比预期和实际测试结果TestNG 提供了足够多的断言方法来对比预期和实际测试结果两者在断言方面支持是相似的JUnit Assertions
预设条件JUnit 支持预设条件来跳过特定测试用例TestNG 不支持预设条件JUnit 在基于预设条件跳过测试用例方面做的更好JUnit Assumptions
顺序测试JUnit 5 仍然不支持顺序测试,但是它计划将在 5.3 版本支持该功能。TestNG 通过 priority 属性来支持将测试方法排序当你想要测试方法安照特定顺序执行时,TestNG更合适
禁用测试用例JUnit 支持多种方式禁用和启用测试用例。例如基于 OS、JRE 和 系统配置TestNG 支持禁用测试用例,但功能性有限当你想要基于特定条件禁用或者启用测试用例时,JUnit 更适合JUnit 禁用测试用例, TestNG 禁用测试用例
并行测试JUnit 5 直至现在不支持并行测试TestNG 可以通过XML 文件配置并行测试TestNG 支持并行测试,JUnit 5 的这个功能仍然在开发中TestNG 并测试
监听JUnit 支持通过 Launcher API 来实现监听,不能机械性添加使用注解TestNG 支持多种监听方式,并且能够使用注解TestNG 在支持监听方面比 JUnit 做的更好TestNG 监听

2 Summary

以上是 TestNG 和 JUnit 的功能特性对比,应该能够帮你找到更适合你的应用的框架。这两者都是优秀的测试框架和 Java 应用。然而,JUnit 5 仍然在不断的发展并且它将会在为来的版本中囊括更多的功能。

以下为个人拙见

1、测试套件

与原作者的一些不同的意见
     💜JUnit 是支持测试套件的,只是不如 TestNG简单易用,因为TestNG支持方法级别的套件(group),@RunWith@Suite注解被用于执行套件测试。下面的代码是所展示的是在JunitTest5被执行之后需要JunitTest1 和JunitTest2也一起执行。所有的声明需要在类内部完成。实现方法如下:


@RunWith(Suite.class)
@Suite.SuiteClasses({
    JunitTest1.class,
    JunitTest2.class
})
public class JunitTest5 {
}

2、断言

     💜个人觉得在断言方面,JUnit 5 做得更加出色,它支持assertAll方法完成批量校验,比如:

assertAll("this is a group assert:",
	() -> assertTrue(resHeaderStatus.contains("Error")),
	() -> assertEquals(json.getInt("id"),"fail"),
	() -> assertTrue(response.getContentType().contains("json"))
	);

4、顺序测试

(1)JUnit 4

     💜JUnit 4 支持使用 @FixMethodOrder 将测试用例变得更加可控,下面例子测试用例的执行顺序按照方法名,当然相比于 TestNG 还是不够易用

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SortedTests {
 
    @Test
    public void a_givenString_whenChangedtoInt_thenTrue() {
        assertTrue(
          Integer.valueOf("10") instanceof Integer);
    }
 
    @Test
    public void b_givenInt_whenChangedtoString_thenTrue() {
        assertTrue(
          String.valueOf(10) instanceof String);
    }
 
}
(2)JUnit 5

     💜JUnit 5.3 之后已经支持顺序测试,使用 @TestMethodOrder@Order 注解实现顺序测试,功能与 JUnit 4 的 @FixMethodOrder 类似,示例如下:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LogTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogTest.class);
    private static LoggerUtil loggerUtil;

    @BeforeAll
    public static void beforeAll() {
        loggerUtil = new LoggerUtil(LOGGER);
        loggerUtil.printInfo("this is beforeEach");
    }
    
    @Test
    @Order(1)
    public void test1() {
        loggerUtil.printDebug("测试 Debug");
    }

    @Test
    @Order(2)
    public void test2() {
        loggerUtil.printInfo("this is test2");
    }

    @AfterEach
    public void afterEach() {
        loggerUtil.printInfo("this is afterEach");
    }
}

     💜 JUnit 支持改变测试用例的展示名称 @DisplayName("Test Method to check that the inputs are not nullable")

     💜 TestNG 支持依赖测试,如果givenEmail_ifValid_thenTrue失败,则后面的用例会被跳过

@Test
public void givenEmail_ifValid_thenTrue() {
    boolean valid = email.contains("@");
    Assert.assertEquals(valid, true);
}
 
@Test(dependsOnMethods = {"givenEmail_ifValid_thenTrue"})
public void givenValidEmail_whenLoggedIn_thenTrue() {
    LOGGER.info("Email {} valid >> logging in", email);
}
当然作者只是对比的 JUnit5 版本,而不是将整个 JUnit 和TestNG比较,4和5是不同的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值