之前已经做过基于 http 协议,json 通信的接口自动化测试,眼光停留在本部门
现在想要将测试平台推广或运用到更多的业务或部门去,比如说:
那么这些接口如何做自动化呢?
这里主要讲表单接口的自动化,主要是踩坑
基于上面的信息,带来下面的问题
我们使用 okhttp 来发请求
<properties>
<okhttp3.version>3.10.0</okhttp3.version>
</properties>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp3.version}</version>
</dependency>
在初始化时,加入 cookie 存储和加载的代码
private static CookieJar cookieJar = new CookieJar() {
//Cookie缓存区
private final Map<String, List<Cookie>> cookiesMap = new HashMap<String, List<Cookie>>();
@Override
public void saveFromResponse(HttpUrl arg0, List<Cookie> arg1) {
//移除相同的url的Cookie
String host = arg0.host();
System.out.println("save, host:" + host);
List<Cookie> cookiesList = cookiesMap.get(host);
cookiesMap.put(host, arg1);
}
@Override
public List<Cookie> loadForRequest(HttpUrl arg0) {
System.out.println("load, host:" + arg0.host());
List<Cookie> cookiesList = cookiesMap.get(arg0.host());
//注:这里不能返回null,否则会报NULLException的错误。
//原因:当Request 连接到网络的时候,OkHttp会调用loadForRequest()
return cookiesList != null ? cookiesList : new ArrayList<Cookie>();
}
};
static {
final int timeout = 30;
client = new OkHttpClient().newBuilder()
.connectTimeout(timeout, SECONDS)
.readTimeout(timeout, SECONDS)
.writeTimeout(timeout, SECONDS)
.retryOnConnectionFailure(true)
.cookieJar(cookieJar)
.build();
}
FormBody loginBody = new FormBody.Builder()
.add("userName", "carl")
.add("password", "123456")
.build();
Request loginRequest = new Request.Builder()
.url("http://aaaa.jolly.com/auth/login")
.post(loginBody)
.build();
Call loginCall = client.newCall(loginRequest);
try {
//非异步执行
Response loginResponse = loginCall.execute();
//测试是否登陆成功
System.out.println(loginResponse.body().string());
} catch (IOException e) {
e.printStackTrace();
}
//获取需要提交的CookieStr
StringBuilder cookieStr = new StringBuilder();
//从缓存中获取Cookie
List<Cookie> cookies = client.cookieJar().loadForRequest(loginRequest.url());
//将Cookie数据弄成一行
for(Cookie cookie : cookies){
cookieStr.append(cookie.name()).append("=").append(cookie.value()+";");
}
System.out.println("cookieStr:" + cookieStr.toString());
RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data;charset=utf-8"), new File("E:\\apiTest\\ImportPurDemand.xls"));
RequestBody uploadBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("purDemandFile", "ImportPurDemand.xls", fileBody)
.build();
Request uploadRequest = new Request.Builder()
.url("http://xxxx.jolly.com/reviewPurchase/importPurDemand")
.post(uploadBody)
.build();
client.cookieJar().saveFromResponse(uploadRequest.url(), cookies);
Call uploadCall = client.newCall(uploadRequest);
try {
//非异步执行
Response uploadResponse = uploadCall.execute();
System.out.println("pushRes body:" + uploadResponse.body().string());
} catch (IOException e) {
e.printStackTrace();
}
登录成功,上传文件成功,这里主要注意的是,登录的是 aaaa 系统,上传文件到 xxxx 系统,它们共用同一份 cookie
表单接口的自动化到这里基本上算是没什么问题了,那么对于 xls 文件等这些测试文件,如何存储呢?
建一个文件服务器吗?大家有什么好的主意,或者是如何做的?
大家是如何做表单接口的自动化的?欢迎交流
踩坑完成后,就可以将它做到服务端了