一、需求背景
结合rest-asssured和junit5,对项目的增删改查实现了自动化测试,并且想让增删改查4个接口有序执行
二、解决方案
junit5的TestMethodOrder和@Order注解
三、具体步骤
1、官网定义
用于为注解的测试类配置测试方法执行顺序; 类似于 JUnit 4 的 @FixMethodOrder。 这样的注释是继承的。
默认情况下,将使用确定性但有意不明显的算法对测试方法进行排序。 这确保了测试套件的后续运行以相同的顺序执行测试方法,从而允许可重复的构建。
虽然真正的单元测试通常不应该依赖于它们的执行顺序,但有时还是需要强制执行特定的测试方法执行顺序 — 例如,在编写集成测试或功能测试时,测试的顺序是 重要,尤其是与@TestInstance(Lifecycle.PER_CLASS) 结合使用。
要控制测试方法的执行顺序,请使用 @TestMethodOrder 注释您的测试类或测试接口并指定所需的 MethodOrderer 实现。 您可以实现自己的自定义 MethodOrderer 或使用以下内置 MethodOrderer 实现之一。
- DisplayName:根据显示名称按字母数字顺序对测试方法进行排序(请参阅显示名称生成优先规则)
- MethodName:根据方法名称和形式参数列表按字母数字顺序对测试方法进行排序。
- OrderAnnotation:根据通过 @Order 注释指定的值对测试方法进行数字排序。
- Random:伪随机地订购测试方法并支持自定义种子的配置。
- Alphanumeric:根据名称和形式参数列表按字母数字对测试方法进行排序。 不推荐使用 MethodName。 将在 6.0 中移除
2、先在测试类上面添加注解,@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
3、在测试方法增加注解@Order(1)、@Order(2)...
4、案例演示
这里我们使用企业微信部门的增删改查接口来示范,实现了4个接口的自动化用例,只是想在功能回归测试中想让其顺序执行。
package com.wechat.testcase; import io.qameta.allure.Description; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.junit.jupiter.api.*; import static io.restassured.RestAssured.given; import static org.junit.jupiter.api.Assertions.assertEquals; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class Demo_02 { public static String acessToken; public static String departmentId; @BeforeAll public static void getAccessToken(){ acessToken = given() .when() .param("corpid","wwc376242756245a88") .param("corpsecret","oQ2Q1pRsobYehKX6xYCJ44g9qhIaC_s16tZvCBxGg9Q") .get(" https://qyapi.weixin.qq.com/cgi-bin/gettoken") .then() .log().body() .extract() .response() .path("access_token") ; } @Test @Description("创建部门") @DisplayName("创建部门") @Order(1) void createDepartment(){ String creaetBody = "{\n" + " \"name\": \"广州研发中心\",\n" + " \"name_en\": \"RDGZ\",\n" + " \"parentid\": 1,\n" + " \"order\": 1,\n" + " \"id\": 2\n" + "}\n"; Response creatResponse = given() .contentType(ContentType.JSON) .queryParam("access_token",acessToken) .when() .body(creaetBody) .post("https://qyapi.weixin.qq.com/cgi-bin/department/create" ) .then() .log().body() .extract() .response() ; assertEquals("0",creatResponse.path("errcode").toString()); departmentId = creatResponse.path("id")!=null ?creatResponse.path("id").toString() :null; } @Test @Description("更新部门") @DisplayName("更新部门") @Order(2) void updateDepartment(){ String updateBody = "{\n" + " \"id\": "+departmentId+",\n" + " \"name\": \"广州研发中心update\",\n" + " \"name_en\": \"RDGZupdate\",\n" + " \"parentid\": 1,\n" + " \"order\": 1\n" + "}\n"; Response updateResponse = given() .contentType(ContentType.JSON) .queryParam("access_token",acessToken) .when() .body(updateBody) .post("https://qyapi.weixin.qq.com/cgi-bin/department/update" ) .then() .log().body() .extract() .response() ; assertEquals("0",updateResponse.path("errcode").toString()); } @Test @Description("查询部门") @DisplayName("查询部门") @Order(3) void listDepartment(){ Response listResponse = given() .contentType(ContentType.JSON) .param("access_token",acessToken) .param("id",departmentId) .when() .get("https://qyapi.weixin.qq.com/cgi-bin/department/list") .then() .log().body() .extract() .response() ; assertEquals("0",listResponse.path("errcode").toString()); } @Test @Description("删除部门") @DisplayName("删除部门") @Order(4) void deleteDepartment(){ Response deleteResponse = given() .contentType(ContentType.JSON) .param("access_token",acessToken) .param("id",departmentId) .when() .get("https://qyapi.weixin.qq.com/cgi-bin/department/delete") .then() .log().body() .extract() .response() ; assertEquals("0",deleteResponse.path("errcode").toString()); } }
5、测试结果
四、总结
junit5的执行顺序只能简单用于功能的自动化回归测试,虽然能帮助我们提高一定的效率,但是不能使用与整个工程的并发执行测试,在实际的自动化测试过程中需采用更加完善的测试方案