单元测试系列之六:JUnit5 技术前瞻

更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注我的的微信号,感谢!html

 

原文连接:http://www.cnblogs.com/zishi/p/6868495.html
 
JUnit 5是下一代JUnit。 目标是为JVM上的开发人员端测试建立一个最新的基础。 这包括专一于Java 8及更高版本,以及启用许多不一样风格的测试。
 
 
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
与之前的JUnit版本不一样,JUnit 5由三个不一样的子项目组成
 
支持的Java版本
JUnit 5在运行时须要Java 8。 可是,仍然能够测试使用之前版本的JDK编译的代码。
 
JUnit平台做为在JVM上启动测试框架的基础。 它还定义了用于开发在平台上运行的测试框架的TestEngine API。 此外,该平台提供了一个控制台启动器,从命令行启动平台,为Gradle和Maven构建插件以及基于JUnit 4的Runner,用于在平台上运行任何TestEngine。
 
JUnit Jupiter是用于在JUnit 5中编写测试和扩展的新编程模型和扩展模型的组合.Jupiter子项目提供了一个用于在平台上运行基于Jupiter的测试的TestEngine。
 
JUnit Vintage提供了一个用于在平台上运行JUnit 3和JUnit 4的测试的TestEngine。
 
JUnit 5团队于2017年4月1日发布了里程碑4,目前正在开发额外的里程碑,最终发布GA版本(详见路线图Roadmap)。
 
JUnit Jupiter带有许多JUnit 4的断言方法,并添加了一些能够与Java 8 lambdas一块儿使用的方法。
 
全部JUnit Jupiter断言是org.junit.jupiter.Assertions类中的静态方法.
新特性是分组断言,这在之前Junit4是不被容许的。
如下是断言的Demo:
 
import static java.time.Duration.ofMillis;
import static java.time.Duration.ofMinutes;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTimeout;
import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

class AssertionsDemo {

    @Test
    void standardAssertions() {
        assertEquals(2, 2);
        assertEquals(4, 4, "The optional assertion message is now the last parameter.");
        assertTrue(2 == 2, () -> "Assertion messages can be lazily evaluated -- "
                + "to avoid constructing complex messages unnecessarily.");
    }


    @Test
    void groupedAssertions() {
 //分组断言:在一个分组断言中,全部断言都会被执行,而且任何失败的断言也会一块儿被报告
        assertAll("address",
            () -> assertEquals("John", address.getFirstName()),
            () -> assertEquals("User", address.getLastName())
        );
    }

    @Test
    void exceptionTesting() {
        Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
            throw new IllegalArgumentException("a message");
        });
        assertEquals("a message", exception.getMessage());
    }
@Test
    void timeoutNotExceeded() {
        // 下面的断言成功
        assertTimeout(ofMinutes(2), () -> {
            // 执行任务只需不到2分钟
        });
    }

    @Test
    void timeoutNotExceededWithResult() {
        // 如下断言成功,并返回所提供的对象
        String actualResult = assertTimeout(ofMinutes(2), () -> {
            return "a result";
        });
        assertEquals("a result", actualResult);
    }

    @Test
    void timeoutNotExceededWithMethod() {
        // 如下断言调用方法参照并返回一个对象
        String actualGreeting = assertTimeout(ofMinutes(2), AssertionsDemo::greeting);
        assertEquals("hello world!", actualGreeting);
    }
@Test
    void timeoutExceeded() {
        // 下面的断言失败,相似的错误信息:
        // execution exceeded timeout of 10 ms by 91 ms
        assertTimeout(ofMillis(10), () -> {
            // 模拟的任务,须要超过10毫秒
            Thread.sleep(100);
        });
    }

    @Test
    void timeoutExceededWithPreemptiveTermination() {
        // 下面的断言失败,相似的错误信息:
        // execution timed out after 10 ms
        assertTimeoutPreemptively(ofMillis(10), () -> {
            // 模拟的任务,须要超过10毫秒
            Thread.sleep(100);
        });
    }

    private static String greeting() {
        return "hello world!";
    }

}

 

即便由JUnit Jupiter提供的断言设施对于许多测试场景也是足够的,但有时候须要或须要更多的功率和附加功能,如匹配器。
在这种状况下,JUnit团队建议使用第三方断言库,如AssertJ,Hamcrest,Truth等。所以,开发人员能够自由使用他们选择的断言库。
 
例如,匹配器和流畅的API的组合可用于使断言更具描述性和可读性。 可是,JUnit Jupiter的org.junit.jupiter.Assertions类不提供像JUnit 4的org.junit.Assert类中的assertThat()方法,它接受Hamcrest Matcher。 相反,鼓励开发人员使用第三方断言库提供的匹配器的内置支持。
 
如下示例演示了如何在JUnit Jupiter测试中使用Hamcrest的assertThat()支持。 只要将Hamcrest库添加到类路径中,您能够静态导入assertThat(),is()和equalsTo()等方法,而后在下面的assertWithHamcrestMatcher()方法中使用它们。
Demo:
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

class HamcrestAssertionDemo {

    @Test
    void assertWithHamcrestMatcher() {
        assertThat(2 + 1, is(equalTo(3)));
    }

}

 

附录:参考java

 官网首页: http://junit.org/junit5/
 
  做者原创技术文章,转载请注明出处

其余推荐相关阅读:git

 

单元测试系列之一:如何使用JUnit、JaCoCo和EclEmma提升单元测试覆盖率

 

测试系列之二:Mock工具Jmockit实战github

 

单元测试系列之三:JUnit单元测试规范数据库

 

单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解编程

 

单元测试系列之五:Mock工具之Mockito实战api

 

单元测试系列之六:JUnit5 技术前瞻微信

 

单元测试系列之七:Sonar 数据库表关系整理一(rule相关)框架

 

单元测试系列之八:Sonar 数据库表关系整理一(续)工具

 

单元测试系列之九:Sonar 经常使用代码规则整理(一)

 

单元测试系列之十:Sonar 经常使用代码规则整理(二)

 

单元测试系列之十一:Jmockit之mock特性详解

相关文章
相关标签/搜索