接口自动化Rest-Assured框架实战企业微信

前言:
初级测试入门自动化启蒙,初级升中级可以说自动化是必备技能了,而接口自动化尤为吃香!
欢迎大家和我一起技术探讨,可以加我QQ一起交流:2538699146
技术栈:
1.项目构建选用Maven;
2.接口测试数据处理,选用:1.YAML,Json格式文件;
3.接口驱动,单元测试框架选用:Rest-Assured + TestNG;
4.report测试报告选用:Allure2;
5.记录执行步骤,日志框架:log4j;
6.数据库校验结果集:MySQL;
7.邮件发送:Javax.mail;
废话不多说,下面我们开始!
1.先构建一个maven项目,加入pom依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
2.打开企业微信,进入API文档,点击服务端API,在通讯录接口中寻找几个简单的API开始小动作

2.1这里我们可以看见,想肆意玩弄他们接口必须要先获取access_token,下面我们来操作一波哈:
1).先看API文档了解需要传什么字段,这里我们看到必传corpid,corpsecret;

2).corpid获取:我的企业-企业信息,有个企业id,获取该字段;

3).corpsecret获取:管理工具-通讯录同步-开启API调试,拿到Secret;


2.2打开idea在我们刚创建的项目中开始小实验哈,创建一个class文件,开始实现获取access_token,代码如下:
package cn.Knife.Wework;
import io.restassured.RestAssured;
import io.restassured.response.Response;
/**
* @author Knife
* @description
* @createTime 2020-05-07 15:30
*/
public class getAccess_token {
/**
* 获取wework的access_token
* @param corpid 企业id
* @param corpsecret 应用密钥
* @return
*/
public Response getToken(String corpid, String corpsecret) {
Response response = RestAssured.given()
.log().all() //打印请求头信息
.queryParam("corpid", corpid)
.queryParam("corpsecret", corpsecret)
.when().get("https://qyapi.weixin.qq.com/cgi-bin/gettoken") //发送get请求
.then().extract().response();
return response;
}
}
2.2.1封装好接口请求方法,下面我们来快乐的调用把:
1).鼠标右击,选择Generate,如下:

2).Testing library:选择testng,勾选我们需要创建的方法,如下:

3).这里讲解一下文档注释的好处哈,当我们不知道要传递什么值,又或者值太多,我们可以通过文档注释方便我们调用,效果如下:

4).废话不多说,我们开始实测试,代码如下:
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.equalTo;
/**
* @author Knife
* @description
* @createTime 2020-05-07 15:50
*/
public class GetAccess_tokenTest {
运行结果大家也可以看一下,比较清晰,比起client少了一些处理,结果如下:
Request method: GET
Request URI: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww2df66b08696343ff&corpsecret=vj1C5akNwtxZb18MECiNZym4IVBTWEi18L57r1KJF2s
Proxy: <none>
Request params: <none>
Query params: corpid=ww2df66b08696343ff
corpsecret=vj1C5akNwtxZb18MECiNZym4IVBTWEi18L57r1KJF2s
Form params: <none>
Path params: <none>
Headers: Accept=*/*
Cookies: <none>
Multiparts: <none>
Body: <none>
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 07 May 2020 08:11:02 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 277
Connection: keep-alive
Error-Code: 0
Error-Msg: ok
{
"errcode": 0,
"errmsg": "ok",
"access_token": "XQntbz4sN9lyxTMbsoLwmi2sYFMeJZN-L1l52lX5NwJjhhuqbtGmnD2ubk0uo-EQVGi79zM5dDan7IFDUpSc_NPqYucD7TLjgEZl4JrFx1-TznpjOno573pmNq2mpKK7MTcSOW141Fgbp1867LtKtoRnbeKg-ZE46LhBXAzF6qPbO-72Bdx9xHAA1CqXxHweDj97Wg14UHXRvspxo54sUw",
"expires_in": 7200
}
5)扩展一下,正常场景有了,异常也让大家看看哈,在一个上面那个类添加一个方法,代码如下:
运行结果:
Request method: GET
Request URI: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=&corpsecret=vj1C5akNwtxZb18MECiNZym4IVBTWEi18L57r1KJF2s
Proxy: <none>
Request params: <none>
Query params: corpid=
corpsecret=vj1C5akNwtxZb18MECiNZym4IVBTWEi18L57r1KJF2s
Form params: <none>
Path params: <none>
Headers: Accept=*/*
Cookies: <none>
Multiparts: <none>
Body: <none>
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 07 May 2020 08:22:30 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 43
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
{
"errcode": 41002,
"errmsg": "corpid missing"
}
java.lang.AssertionError: 1 expectation failed.
JSON path errcode doesn't match.
Expected: <0> //看这里看这里,这是预期body断言结果
Actual: 41002 //实际body响应errcode结果
2.3拿到access_token之后,我们终于能肆意的对企业微信API进行骚操作,因为入门教程哈,所以我们选选择几个简单的API进行操作,选择部门管理、如下:

2.3.1先给大家看看他们的API描述和文档,如下:






1).这里需要用到马爸爸的fastjson框架进行序列化,加入pom依赖:
<!-- fastjson依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
2).废话不多说,开始上第一版代码:
import com.alibaba.fastjson.JSONObject;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import java.util.HashMap;
/**
* @author Knife
* @description 部门管理
* @createTime 2020-05-07 16:45
*/
public class Department {
//定义存储token的容器
private static String[] token;
/**
* 因为我个人比较懒,这里直接用一个String数组,返回要获取的token
* 单例设计,这里采用懒汉式
*
* @return
*/
private static String[] getAcc_token() {
if (token == null) {
GetAccess_token getAccess_token = new GetAccess_token();
Response response = getAccess_token.getToken("ww2df66b08696343ff", "vj1C5akNwtxZb18MECiNZym4IVBTWEi18L57r1KJF2s");
String t = response.path("access_token").toString();
token = new String[]{"access_token", t};
}
return token;
}
/**
* 创建部门
*
* @param name 部门名称
* @param name_en 别名
* @param parentid 父类id
* @param order 排序
* @param id id
*/
public Response create(String name, String name_en, String parentid, String order, String id) {
//将参数都添加到map
HashMap<String, Object> parame = new HashMap();