8-5接口测试用例设计与编写-3发送消息与图片
1. 获取token
public class WXopenDemo {
/**
* 异常测试:错误的参数
*/
@Test(groups = "testtoken")
public void getToken1(){
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
String corpid = "123456";
String corpsecret = "123456";
given().param("corpid",corpid).param("corpsecret",corpsecret).get(url).then().body("errcode",equalTo(40013));//prettyPeek连带消息头一起打印
}
/**
* 获取token
*/
@Test(groups = "testtoken")
public void getToken2(){
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
String corpid = "XXXXXXXXXXXX";
String corpsecret = "XXXXXXXXXXXXX";
given().param("corpid",corpid).param("corpsecret",corpsecret).get(url).then().statusCode(equalTo(200));//prettyPeek连带消息头一起打印
}
}
使用xml组织用例,并运行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite" verbose="1">
<test verbose="2" preserve-order="true" name="lesson1"><!--测试名称-->
<groups>
<run>
<include name="testtoken" /><!--只跑add组-->
</run>
</groups>
<classes>
<class name="com.csj2018.WXopenDemo" />
</classes>
</test>
</suite>
2. 发送消息:
2.1 发送文本消息
/**
* 发消息
*/
@Test
public void sendMessage(){
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
//先获取token
String corpid = "XXXXXXXXXXXX";
String corpsecret = "XXXXXXXXX";
Response res = given().param("corpid",corpid).param("corpsecret",corpsecret).get(url).prettyPeek();
assertThat(res.statusCode(),equalTo(200));
String accessToken = res.getBody().jsonPath().getString("access_token");
assertThat(accessToken,notNullValue());
//发送消息
String messageUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="+accessToken;
String reqContent = "{\n" +
" \"toparty\" : \"4\",\n" +
" \"msgtype\" : \"text\",\n" +
" \"agentid\" : 1000004,\n" +
" \"text\" : {\n" +
" \"content\" : \"你的快递已到,请携带工卡前往邮件中心领取。\\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。\"\n" +
" },\n" +
" \"safe\":0,\n" +
" \"enable_id_trans\": 0\n" +
"}";
given().contentType(ContentType.JSON).body(reqContent).post(messageUrl).prettyPeek().then().body("errmsg",equalTo("ok"));
}
2.2 优化代码:将重复代码封装为工具类,将请求封装为一个对象,便于重复使用,提高易读性
package com.csj2018.utils;
import io.restassured.response.Response;
import java.io.File;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
public class WXUtils {
private static String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
private static String corpid = "XXXXXXXXXX";
private static String corpsecret = "XXXXXXXXXXXXXXXXX";
private static String uploadImageUrl= "https://qyapi.weixin.qq.com/cgi-bin/media/upload";
public static String getToken(){
Response res = given().param("corpid",corpid).param("corpsecret",corpsecret).get(url).prettyPeek();
assertThat(res.statusCode(),equalTo(200));
String accessToken = res.getBody().jsonPath().getString("access_token");
assertThat(accessToken,notNullValue());
return accessToken;
}
}
请求参数类
package com.csj2018.model;
import java.util.Map;
public class WXTextMessageModel {
/**
* {
* "touser" : "UserID1|UserID2|UserID3",
* "toparty" : "PartyID1|PartyID2",
* "totag" : "TagID1 | TagID2",
* "msgtype" : "text",
* "agentid" : 1,
* "text" : {
* "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
* },
* "safe":0,
* "enable_id_trans": 0
* }
*/
private String touser;
private String toparty;
private String totag;
private String msgtype;
private Integer agentid;
private Map<String, String> text;
private Map<String, String> image;
private Integer safe;
private Integer enable_id_trans;
//省略getter和setter方法 mac快捷键ctrl + enter
/**
* 发送文本
*/
@Test
public void sendMessage2(){
String accessToken = WXUtils.getToken();
//发送消息
String messageUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="+accessToken;
WXTextMessageModel wxTextMessageModel = new WXTextMessageModel();
wxTextMessageModel.setToparty("4");
wxTextMessageModel.setMsgtype("text");
wxTextMessageModel.setAgentid(1234567);
Map<String, String> map = new HashMap<>();
map.put("content","你的快递已到,请携带工卡前往邮件中心领取。\\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。");
wxTextMessageModel.setText(map);
wxTextMessageModel.setSafe(0);
wxTextMessageModel.setEnable_id_trans(0);
given().contentType(ContentType.JSON).body(wxTextMessageModel).post(messageUrl).prettyPeek().then().body("errmsg",equalTo("ok"));
//如果报错cannot serialize object because no JSON serializer fount in classpath.Please put either Jackson(Databind) or Gson in the classpath.可能是json-schema-validator缺失,倒入即可
}
2.3 发送图片
- 1.发送图片需要从上传临时素材接口获取media_id
- 2.上传图片需要文件标识名
- 3.去rest-assured查找使用说明
上传临时素材的接口
Multi-part form data示例
- 1.在工具类中先按示例中上传文件到临时素材接口
WXUtils.java
public static String getWXMediaId(){
String accessToken = getToken();
System.out.println(accessToken);
Response res = given().contentType("multipart/form-data")
.queryParam("access_token",accessToken)
.queryParam("type","image")
.multiPart("meida",new File("src/test/image/singleDog.jpg")).when().post(uploadImageUrl).prettyPeek();
String mediaId = res.getBody().jsonPath().getString("media_id");
System.out.println(32+mediaId);
assertThat(mediaId,notNullValue());
return mediaId;
}
- 编写发送图片的用例
/**
* 发送图片
*/
@Test
public void sendImage(){
//发送消息
String messageUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="+WXUtils.getToken();
WXTextMessageModel wxTextMessageModel = new WXTextMessageModel();
wxTextMessageModel.setToparty("4");
wxTextMessageModel.setMsgtype("image");
wxTextMessageModel.setAgentid(1000004);
Map<String, String> imageMap = new HashMap<>();
imageMap.put("media_id",WXUtils.getWXMediaId());
wxTextMessageModel.setImage(imageMap);
wxTextMessageModel.setSafe(0);
wxTextMessageModel.setEnable_id_trans(0);
given().contentType(ContentType.JSON).body(wxTextMessageModel).post(messageUrl).prettyPeek().then().body("errmsg",equalTo("ok"));
}
3.我司上传接口
现在公司业务很大比例外包出去,合作伙伴没有提供接口文档,swagger的描述也不够清晰。因为懒,我会等踩着客户端的肩膀写接口用例。
分析header,对我有价值的只有Content-Type为multipart/form-data
再分析Multipart,此处有2点:
- resultType为0
- 上传文件名为fileContent,类型为image/jpg
public class TestUploadFile extends BaseInfo {
String url = "*****/uploadFile";
@Test
public void sendPost(){
System.out.println(url);
try {
Response res = given()
.header("Content-Type","multipart/form-data")
.header("accept", "application/json;charset=UTF-8")
.multiPart("resultType",0)
.multiPart("fileContent",new File("/Users/chenshanju/Desktop/1th/lc76.jpeg"),"image/jpg")
.post(url)
.prettyPeek();
String imgId = res.jsonPath().get("result[0]");
System.out.println(imgId);
}catch (Exception e){
e.printStackTrace();
}
}
}
4.其他:
1. print和prettyPeek的区别
print只打印响应体;prettyPeek会讲响应头和响应体一起打印
2. queryParam和param的区别
param用于get请求中;
queryParam和formParam用于post请求中,queryParam用于拼接URL,formParam用于提交表单
使用body传递参数,可以指定编码,如contentType("application/json; charset=UTF-16")
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json").
body(message).
when().
post("/message");
使用formParam传递参数
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json; charset=UTF-16").
formParam("param1", message).
when().
post("/message");