Java Junit5简单使用
Maven依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
基本使用
@Test
:标注为测试方法@DisplayName()
:可选,标注测试方法显示名称
注意:
- 测试类名要以Test开头,如
public class TestExample
- 测试方法应为
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,效果如下:
使用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报告。
Allure还支持更多用例标记,详细用法参考: https://allurereport.org/docs/junit5/