...

Java Junit5简单使用

Maven依赖

<dependency>
	<groupId>org.junit.jupiter</groupId>
	<artifactId>junit-jupiter</artifactId>
	<version>5.8.1</version>
	<scope>test</scope>
</dependency>

基本使用

  • @Test:标注为测试方法
  • @DisplayName():可选,标注测试方法显示名称

注意:

  1. 测试类名要以Test开头,如public class TestExample
  2. 测试方法应为public
public class TestExample { 
	@Test 
	@DisplayName("测试方法示例") 
    public void testMethod() {  
        System.out.println("Test Method");  
    }
}

运行方法:

  • mvn test:运行所有测试
  • mvn test -Dtest=TestExample:运行指定测试类
mvn test

测试准备和清理

提示:
测试用例一般都有"预置条件",比如接口授权等,自动化测试中,一般使用测试准备方法来完成。
测试清理多用于测试用例结束时,清理一些数据,以确保每次运行都能测试通过。

  • @BeforeAll:在本类所有测试方法前,执行一次
  • @AfterAll::在本类所有测试方法后,执行一次
  • @BeforeEach:在本类每个测试方法前,执行一次
  • @AfterEach:在本类每个测试方法后,执行一次

例如:

public class TestExample { 
	@BeforeAll  
    public static void setUpClass() {  
        System.out.println("Before Class");  
    }  
    @AfterAll  
    public static void tearDownClass() {  
        System.out.println("After Class");  
    }  
    @BeforeEach  
    public void setUp() {  
        System.out.println("Before Test");  
    }  
    @AfterEach  
    public void tearDown() {  
        System.out.println("After Test");  
    }
} 

用例分组及排序

  • @Tag():对测试方法,设定分组标记,可以添加多个Tag
  • @Order():对类中的测试方法,设定运行顺序
public class TestExample { 
	@Test  
	@Tag("demo")
	@Order(1)
    public void testMethod1() {  
        System.out.println("Test Method1");  
    }

	@Test  
	@Order(2)
    public void testMethod2() {  
        System.out.println("Test Method2");  
    }
}

运行指定Tag方法

mvn test -Dgroups="demo"

断言方法

在测试方法中,断言用于对比实际结果是否符合预期。

Junit5常用断言方法:

  • assertEquals(expected, actual):验证对象是否等于预期对象。
  • assertTrue(value):验证value变量为true
  • assertNull(value):验证value变量为null
  • assertNotNull(value):验证value变量不为null
  • assertThrows(exceptionClass, executable):验证对象是否抛出指定异常。
  • assertTimeout(duration, executable):验证代码块是否在指定时间内完成。

例如,结合OKHttp验证接口是否成功:

使用OKHttp及FastJSON需要添加相关依赖

 <dependency>
	<groupId>com.squareup.okhttp3</groupId>
	<artifactId>okhttp</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.83</version>
</dependency>

断言使用示例:

public class TestExample {
	 @Test
    public void testOkHttpGet() throws IOException {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://postman-echo.com/get?a=1&b=2")
                .addHeader("token", "test")
                .build();
        Response response = client.newCall(request).execute();

        assertTrue(response.isSuccessful()); // 断言响应成功
        assertEquals(200, response.code());  // 断言状态码为200
        assertNotNull(response.body()); // 断言响应内容不为null

        // 解析JSON响应,提取参数并断言
        String responseBody = response.body().string();
        JSONObject jsonObject = JSON.parseObject(responseBody);
        JSONObject args = jsonObject.getJSONObject("args");
        assertEquals("1", args.getString("a"));
        assertEquals("2", args.getString("b"));
    }
}

参数化测试

  • @ParameterizedTest:标记为参数化测试方法,不和@Test同时使用
  • @ValueSource:指定多个同类型数据,每个数据运行一次
  • @CsvSource:指定多行按逗号分隔的数据
  • @CsvFileSource:指定一个CSV数据文件
  • @EmptySource:指定一个空""数据
  • @NullSource:指定一个为null的数据
  • @NullAndEmptySource:指定一个空数据和为null的数据

使用@ValueSource参数化测试(每次一个数据)

public class TestExample { 
	@ParameterizedTest  
    @ValueSource(strings = { "a", "b", "c" })  
    public void testMethod3(String c) {  
        System.out.println("Test Method3: " + c);  
    } 
}

strings外,@ValueSource还可以指定int,char,short,class等类型的数据

使用@CsvSource参数化测试(每次多个数据)

public class TestExample { 
	@ParameterizedTest  
    @CsvSource({"test,TEST", "tEst,TEST", "Java,JAVA"})  
    public void testMethod4(String input, String expected) {  
        String actualValue = input.toUpperCase();  
        assertEquals(expected, actualValue);  
    }
}

使用@CsvFileSource使用CSV文件参数化测试(每次多个数据)
src/test/resources下创建data.csv文件,内容如下

input,expected
test,TEST  
tEst,TEST  
Java,JAVA
public class TestExample { 
	@ParameterizedTest  
    @CsvFileSource(resources = "data.csv", numLinesToSkip = 1)  
    public void testExample5(String input, String expected) {  
        String actualValue = input.toUpperCase();  
        assertEquals(expected, actualValue);  
    } 
} 

HTML测试报告

使用Surefire生成HTML测试报告

Maven配置
<build><plugins></plugins></build>中添加插件

<plugin>  
    <artifactId>maven-surefire-plugin</artifactId>  
    <version>2.22.2</version>  
</plugin>

运行全部测试并生成HTML报告

mvn surefire-report:report

测试报告生成在target/reports/下,打开surefire.html,效果如下:

image

使用Allure生成HTML测试报告

添加Maven依赖

<dependency>
	<groupId>io.qameta.allure</groupId>
	<artifactId>allure-junit5</artifactId>
	<version>2.13.2</version>
</dependency>

Maven插件配置

<plugin>
	<groupId>io.qameta.allure</groupId>
	<artifactId>allure-maven</artifactId>
	<version>2.10.0</version>
	<configuration>
		<reportVersion>2.13.2</reportVersion>
		<allureDownloadUrl>https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.13.2/allure-commandline-2.13.2.zip</allureDownloadUrl>
	</configuration>
</plugin>

运行

mvn test

会在项目根目录生成allure-results测试报告数据,然后运行

allure serve

会自动打开浏览器,显示测试报告,如下:

注意:
allure命令依赖一个allure-commandline工具,下载地址,下载后解压,并把目录配置到PATH变量中去,确保allure命令在命令行可以使用。如果使用Jenkins做持续集成,Jenkins上可以安装Allure插件,自动运行测试并生成Allure报告。

image

Allure还支持更多用例标记,详细用法参考: https://allurereport.org/docs/junit5/

posted @ 2025-04-23 19:14  韩志超  阅读(76)  评论(0)    收藏  举报