一,memberApi测试编写

  • 前面对部门管理的api进行了测试编写,都还比较简单,在进行member的crudApi测试编写的时候,遇到一个问题,请求体数据过于庞大,使用jsonpath之类的小大小闹显然无法满足请求下面这样的数据,后期维护更是灾难。 ```java { “userid”: “zhangsan”, “name”: “张三”, “alias”: “jackzhang”, “mobile”: “+86 13800000000”, “department”: [1, 2], “order”:[10,40], “position”: “产品经理”, “gender”: “1”, “email”: “zhangsan@gzdev.com”, “isleader_in_dept”: [1, 0], “enable”:1, “avatar_mediaid”: “2-G6nrLmr5EC3MNb-zL1dDdzkd0p7cNliYu9V5w7o8K0”, “telephone”: “020-123456”, “address”: “广州市海珠区新港中路”, “main_department”: 1, “extattr”: {
    1. "attrs": [
    2. {
    3. "type": 0,
    4. "name": "文本名称",
    5. "text": {
    6. "value": "文本"
    7. }
    8. },
    9. {
    10. "type": 1,
    11. "name": "网页名称",
    12. "web": {
    13. "url": "http://www.test.com",
    14. "title": "标题"
    15. }
    16. }
    17. ]
    }, “to_invite”: true, “external_position”: “高级产品经理”, “external_profile”: {
    1. "external_corp_name": "企业简称",
    2. "external_attr": [
    3. {
    4. "type": 0,
    5. "name": "文本名称",
    6. "text": {
    7. "value": "文本"
    8. }
    9. },
    10. {
    11. "type": 1,
    12. "name": "网页名称",
    13. "web": {
    14. "url": "http://www.test.com",
    15. "title": "标题"
    16. }
    17. },
    18. {
    19. "type": 2,
    20. "name": "测试app",
    21. "miniprogram": {
    22. "appid": "wx8bd8012614784fake",
    23. "pagepath": "/index",
    24. "title": "my miniprogram"
    25. }
    26. }
    27. ]
    } }
  1. - 前章对读取json格式数据并通过map键值对赋值的方式进行了参数处理,可以吧它单独的封装出来提高复用率
  2. <a name="pgNnS"></a>
  3. ## 封装读json模板,map参数化的方法
  4. ```java
  5. // 在所有类的父类,即 Restful中进行封装
  6. package com.addicated.wework;
  7. import com.jayway.jsonpath.DocumentContext;
  8. import com.jayway.jsonpath.JsonPath;
  9. import io.restassured.response.Response;
  10. import io.restassured.specification.RequestSpecification;
  11. import java.util.HashMap;
  12. import static io.restassured.RestAssured.given;
  13. /**
  14. * @description: 请求引擎封装
  15. * @author: Adi
  16. * @time: 2020/10/5 11:28
  17. **/
  18. public class Restful {
  19. HashMap<String, Object> query = new HashMap<String, Object>();
  20. public RequestSpecification requestSpecification = given();
  21. public Response send() {
  22. requestSpecification = given().log().all();
  23. query.entrySet().forEach(entry -> {
  24. requestSpecification.queryParam(entry.getKey(), entry.getValue());
  25. });
  26. return requestSpecification.when().request("get", "baidu.com");
  27. }
  28. // TODO 优化1 ,将读取json文件的方法封装到contact继承的父类中 templateFromJson
  29. public static String template(String path, HashMap<String, Object> map) {
  30. // 因为是个静态方法,所以获取路径的时候有些许不一样 注意点
  31. DocumentContext documentContext = JsonPath.parse(Restful.class
  32. .getResourceAsStream(path));
  33. // 这种书写方式的有点是,传值可以传一个也可多可,泛用性更强
  34. map.entrySet().forEach(entry -> {
  35. documentContext.set(entry.getKey(), entry.getValue());
  36. });
  37. return documentContext.jsonString();
  38. }
  39. }
  40. -------使用例子 继承关系为 Member extends Contact extends Restful
  41. package com.addicated.wework.contact;
  42. import io.restassured.response.Response;
  43. import java.util.HashMap;
  44. /**
  45. * @description:
  46. * @author: Adi
  47. * @time: 2020/10/4 19:12
  48. **/
  49. public class Member extends Contact {
  50. public Response create(HashMap<String, Object> map) {
  51. String body = template("/data/member_create.json", map);
  52. reset();
  53. return requestSpecification.body(body)
  54. .when().post("https://qyapi.weixin.qq.com/cgi-bin/user/create")
  55. .then().log().all().extract().response();
  56. }
  57. }
  • 直接在子类中通过template方法进行传参调用即可,一参为path,二参为要进行赋值的测试用例,为map类型

    二,Junit5 简单参数化

  • 参照下面如图,junit5提供了多种参数化的实现方式,代码展示最简单的valueSource

  • ValueSource注解中声明要进行遍历的测试数据即可
  • image.png ```java package com.addicated.wework.contact;

import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource;

import java.util.Arrays; import java.util.HashMap;

import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.*;

class MemberTest { static Member member;

  1. @BeforeAll
  2. static void setUp() {
  3. member = new Member();
  4. }
  5. @ParameterizedTest
  6. @ValueSource(strings = {"sevenriby_", "hogwarts_", "testerhome_"})
  7. // valueSource 后面列出参数化的数据,之后通过形参name传入测试类方法,用例执行时会自动进行传参进行
  8. // 数据驱动
  9. void create(String name) {
  10. String nameNew = name + member.random;
  11. String random = String.valueOf(System.currentTimeMillis()).substring(5 + 0, 5 + 8);
  12. HashMap<String, Object> map = new HashMap<>();
  13. map.put("userid", nameNew);
  14. map.put("name", nameNew);
  15. map.put("department", Arrays.asList(1, 2));
  16. map.put("mobile", "151" + random);
  17. map.put("userid", nameNew);
  18. map.put("email", random + "@qq.com");
  19. member.create(map).then().statusCode(200).body("errcode", equalTo(0));
  20. }

}

  1. <a name="Prwu6"></a>
  2. # 三,如何避免产生过多的脏数据
  3. - 比如说,创建了N多部门,这时为了避免过多脏数据影响测试,要写一个整体的清除方法,之后在每次添加数据之前进行调用,保证每次测试时环境都是干净的
  4. ```java
  5. // delete all 清除测试产生的脏数据
  6. public Response deleteAll(){
  7. reset();
  8. // 取得所有部门的id
  9. List<Integer> idList = list("").then().log().all().extract().path("department.id");
  10. System.out.println(idList);
  11. idList.forEach(id -> delete(id.toString()));
  12. return null;
  13. }
  14. --------进行测试的时候进行清楚
  15. class DepartmentTest {
  16. Department department;
  17. String random=String.valueOf(System.currentTimeMillis());
  18. @BeforeEach
  19. void setUp() {
  20. if(department==null){
  21. department=new Department();
  22. // 写在setup中,这样每次用例执行之前都会去清空之前的数据,以保证清洁
  23. department.deleteAll();
  24. }
  25. }
  26. @Test
  27. void list() {
  28. department.list("").then().statusCode(200);
  29. department.list("33").then().statusCode(200);
  30. }