小白的极简接口“自动化”
接口可以说是大多数测试同学每天都接触的。在客户端、前端上,用Fiddler/Charles等工具查看接口、修改接口;在服务端,通过终端等工具查看接口触发的后端逻辑,通过连接数据库查看数据库存储……
在面对接口的时候,经常遇到需频繁修改请求数据查看响应。这个时候,就特别“渴望”有一个自动化脚本,能够遍历所有的请求参数~
生成“自动化”代码
这里有个测试天气的接口: http://notify.mse.sogou.com/weather?city=天津
如果验证这个接口时可能要频繁修改city字段,很多同学都通过Fiddler/Chales等工具拦截请求,但是实在太慢了;另外可能有些同学会用一些测试工具,比如Postman,这样就直接修改Postman中对应Key的value值可以了。
其实Postman还有一个隐藏的小功能,十分实用,点一下按键就可以生成请求的代码。这个隐蔽的按键在`Send`按钮下方,只需要点击一下Code就能拿到这个请求对应的一段代码(图中生成的代码是基于Java OK HTTP的代码)。
目前Postman可生成的请求代码已经覆盖了十几种语言,并且几乎覆盖了全部的主流方式(例如:Python的Request、http.client,Java的OK HTTP等),下图为现在Postman支持的主流语言/方法的情况
只要是有任意一门语言基础的小伙伴,选择自己擅长的语言并且选择一种请求方法,就可以获取到需要验证的接口代码啦~
做接口“自动化”
准备
通过Postman我们已经拿到了针对上面天气接口的请求代码
代码语言:javascript复制OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://notify.mse.sogou.com/weather?city=天津")
.get()
.addHeader("User-Agent", "PostmanRuntime/7.15.0")
.addHeader("Accept", "*/*")
.addHeader("Cache-Control", "no-cache")
.addHeader("Postman-Token", "96b83a66-7ea4-49aa-a471-373f63cdd89e,a43cfc9d-b927-45b7-8ecf-63a6d593d097")
.addHeader("Host", "notify.mse.sogou.com")
.addHeader("cookie", "IPLOC=CN1100")
.addHeader("accept-encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("cache-control", "no-cache")
.build();
Response response = client.newCall(request).execute();
目标
我们想要达到的目标是,遍历全国主要省市的天气。在这之前我们应该是已经拿到了主要/重要省市的“数据字典”,比如:北京、上海、天津、重庆、广州、成都、杭州、南京、深圳。
数据准备
最简单的方式就是把这些城市做成一个数组:
代码语言:javascript复制String[] citys = {"北京","上海","天津","重庆","广州","成都","杭州","南京","深圳"};
编码
然后结合上面Postman给我们生成的请求代码,就可以实现一个简单的随机测试目标城市天气接口返回的自动化啦~
代码语言:javascript复制import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class TestOkhttp {
public static void main(String[] args) {
String[] citys = {"北京","上海","天津","重庆","广州","成都","杭州","南京","深圳"};
int cityLenth = citys.length;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://notify.mse.sogou.com/weather?city=" citys[(int)(Math.random()*(cityLenth))])
.get()
.addHeader("User-Agent", "PostmanRuntime/7.15.0")
.addHeader("Accept", "*/*")
.addHeader("Cache-Control", "no-cache")
.addHeader("Postman-Token", "96b83a66-7ea4-49aa-a471-373f63cdd89e,eb14884c-8b97-463e-b1f8-157419041ba8")
.addHeader("Host", "notify.mse.sogou.com")
.addHeader("cookie", "IPLOC=CN1100")
.addHeader("accept-encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("cache-control", "no-cache")
.build();
try {
Response response = client.newCall(request).execute();
ResponseBody responseBody = response.body();
// 输出response
System.out.println("Response: " responseBody.string());
// 输出相应状态码
System.out.println("Status: " response.code());
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果
执行上面的程序,我们就通过随机城市,请求到了这个接口的相应状态和结果。
代码语言:javascript复制Response: {"iploc":"CN1100","area":"杭州","statuscode":"02","url":"http://m.tianqi.sogou.com/?fr=0005-003q","status":"阴","pmstatus":"优","temperature":"30","pm":"43"}
Status: 200
是不是很简单就实现了一个接口的“自动化”测试小脚本呢。这里只是做了单次的接口测试,当然也可以通过循环等方式遍历所有的城市case;另外也可以用okhttp的更多方法对请求和响应做更多的验证……
如果你觉得对你的工作有帮助,可以行动起来,尝试一下。
写在最后
解决问题最高效的方法永远是 — 行动和思维
小编作为一个刚工作一年多的新手,其实经验也没有很丰富,只是喜欢研究,喜欢尝试,喜欢去用技术解决问题。所以这一年在项目之余写了PC端的工具、Android的工具,也做过接口的监控和自动化、客户端的自动化……
作为测试,有很多工具能提升我们的效率,像文中提到的Postman。还有更多小工具、小软件都能在客户端、服务端起到“自动”的作用,帮助我们减少工作中重复的工作。当然前提你要发现它们,并且真正想要解决它们。
自动化是能够极大的提升我们的效率,就像是机器人,但是很多影视作品已经告诉我们: 机器人的高度智能也会成为灾难。小编很提倡测试er掌握自动化的手段、思维。但是,自动化也不是遇到测试问题的唯一解决方案。解决问题最高效的方法永远是-行动和思维。