一,通讯录token模块的封装

  1. package com.addicated.wework;
  2. import io.restassured.RestAssured;
  3. public class Wework {
  4. private static String token;
  5. public static String getWeworkToken(){
  6. return RestAssured.given().log().all()
  7. .queryParam("corpid", WeworkConfig.getInstance().corpid)
  8. .queryParam("corpsecret", WeworkConfig.getInstance().secret)
  9. .when().get("https://qyapi.weixin.qq.com/cgi-bin/gettoken")
  10. .then().log().all().statusCode(200)
  11. .extract().path("access_token");
  12. }
  13. public static String getToken(){
  14. if(token==null){
  15. token=getWeworkToken();
  16. }
  17. return token;
  18. }
  19. }

部门模块一览api测试编写

  1. package com.testerhome.hogwarts.wework.contact;
  2. import com.testerhome.hogwarts.wework.Wework;
  3. import io.restassured.response.Response;
  4. import static io.restassured.RestAssured.given;
  5. public class Department {
  6. public Response list(String id){
  7. return given().log().all()
  8. .param("access_token", Wework.getToken())
  9. .param("id", id)
  10. .when().get("https://qyapi.weixin.qq.com/cgi-bin/department/list")
  11. .then().log().all().statusCode(200).extract().response();
  12. }
  13. }
  • 之后同前文一样,根据方法生成测试方法 ```java package com.testerhome.hogwarts.wework.contact;

import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;

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

class DepartmentTest {

  1. @BeforeEach
  2. void setUp() {
  3. }
  4. @Test
  5. void list() {
  6. Department department=new Department();
  7. department.list("").then().statusCode(200).body("department.name[0]", equalTo("定向班第一期"));
  8. department.list("33").then().statusCode(200).body("department.name[0]", equalTo("定向班第一期"));
  9. }

}

  1. - 至此,初步框架成型,后期会进行不断的迭代封装。
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1608527/1601807383189-6d0d212a-ab84-4b99-92b4-dfa1efe29a91.png#align=left&display=inline&height=629&margin=%5Bobject%20Object%5D&name=image.png&originHeight=629&originWidth=438&size=39226&status=done&style=none&width=438)
  3. <a name="IpC6B"></a>
  4. # 二,解决痛点
  5. - 前面发送get请求获取部门list这样简单的api还好,不涉及很多参数,但是下面要进行post请求的api测试的话,构建请求体有的时候会让人蛋疼不已,下见例子。
  6. ```java
  7. public class Department {
  8. public Response list(String id){
  9. return given().log().all()
  10. .param("access_token", Wework.getToken())
  11. .param("id",id)
  12. .when().get("https://qyapi.weixin.qq.com/cgi-bin/department/list")
  13. .then().log().all().statusCode(200).extract().response();
  14. }
  15. // 创建部门
  16. public Response create(){
  17. given().log().all()
  18. .param("access_token", Wework.getToken())
  19. .body("{\n" +
  20. " \"name\": \"阿迪研发中心\",\n" +
  21. " \"name_en\": \"RDGZ\",\n" +
  22. " \"parentid\": 1,\n" +
  23. " \"order\": 1,\n" +
  24. " \"id\": 2\n" +
  25. "}")
  26. .when().post("https://qyapi.weixin.qq.com/cgi-bin/department/create")
  27. .then().statusCode(200);
  28. }
  29. }
  • 如上述代码一样,这样构建请求体,后期根本无法维护,且看着就头大。
  • 为了解决这样的痛点,引入模板技术
  • 注意点:使用restAssured的时候,如果发送post请求,但是请求地址需要拼接的时候
  • 要携程queryParamer,防止混淆产生报错

    数据封装

  • 使用模板技术

  • 使用pojo实体类构建请求体数据
    • 当请求提数据参数很多的时候会耗费大量时间去写pojo实体类,效率不高
  • 使用jsonPath,yaml之类的对应库进行参数替换

先在resource下建一个data的文件夹,之后建一个json文件保存请求体实例数据

  1. {
  2. "name": "广州研发中心",
  3. "name_en": "RDGZ",
  4. "parentid": 1,
  5. "order": 1,
  6. "id": 2
  7. }
  • 之后编写读json的工具类代码,将处理好的请求体数据填入
  • 注意点,有的json类库只可读不可写,本次使用的为下面这个库

    1. <dependency>
    2. <groupId>com.jayway.jsonpath</groupId>
    3. <artifactId>json-path</artifactId>
    4. <version>2.4.0</version>
    5. </dependency>
    1. public Response create(String name,String parentid){
    2. String body = JsonPath.parse(this.getClass()
    3. // getResourceAsStream 会吧文件作为字节流读进来
    4. .getResourceAsStream("/data/create.json"))
    5. .set("$.name", name)
    6. .set("parentid", parentid).jsonString();
    7. return given().log().all()
    8. .queryParam("access_token", Wework.getToken())
    9. .body(body)
    10. .when().post("https://qyapi.weixin.qq.com/cgi-bin/department/create")
    11. .then().log().all().statusCode(200).extract().response();
    12. }

    三,编写测试方法之后发现新的痛点

  • 对部门进行CRUD(增删查改)的api请求方法编写之后,会发现出现了大量重复臃肿代码,下见图 ```java package com.addicated.wework.contact;

import com.addicated.wework.Wework; import com.jayway.jsonpath.JsonPath; import io.restassured.response.Response;

import static io.restassured.RestAssured.given;

/**

  • @description:
  • @author: Adi
  • @time: 2020/10/4 19:12 **/

public class Department {

  1. public Response list(String id) {
  2. return given().log().all()
  3. .param("access_token", Wework.getToken())
  4. .param("id", id)
  5. .when().get("https://qyapi.weixin.qq.com/cgi-bin/department/list")
  6. .then().log().all().statusCode(200).extract().response();
  7. }
  8. // 创建部门
  9. public Response create(String name, String parentid) {
  10. String body = JsonPath.parse(this.getClass()
  11. .getResourceAsStream("/data/create.json"))
  12. .set("$.name", name)
  13. .set("parentid", parentid).jsonString();
  14. return given().log().all()
  15. .queryParam("access_token", Wework.getToken())
  16. .body(body)
  17. .when().post("https://qyapi.weixin.qq.com/cgi-bin/department/create")
  18. .then().log().all().statusCode(200).extract().response();
  19. }
  20. // 删除部门
  21. public Response delete(String id) {
  22. return given().queryParam("access_token", Wework.getToken())
  23. .queryParam("id", id)
  24. .when().get("https://qyapi.weixin.qq.com/cgi-bin/department/delete")
  25. .then().statusCode(200).extract().response();
  26. }
  27. // 更新部门
  28. public Response update(String name, String id) {
  29. String body = JsonPath.parse(this.getClass()
  30. .getResourceAsStream("/data/update.json"))
  31. .set("$.name", name)
  32. .set("id", id).jsonString();
  33. return given().log().all()
  34. .queryParam("access_token", Wework.getToken())
  35. .body(body)
  36. .when().post("https://qyapi.weixin.qq.com/cgi-bin/department/update")
  37. .then().log().all().statusCode(200).extract().response();
  38. }

}

```

  • 观察代码会发现其中有相当多的 given 之类的restAssured请求代码,这些东西需要进行统一的封装达到精简方便后期维护