接口可以说是大多数测试同学每天都接触的。在客户端、前端上,用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我们已经拿到了针对上面天气接口的请求代码
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("http://notify.mse.sogou.com/weather?city=%E5%A4%A9%E6%B4%A5") .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();
我们想要达到的目标是,遍历全国主要省市的天气。在这之前我们应该是已经拿到了主要/重要省市的“数据字典”,比如:北京、上海、天津、重庆、广州、成都、杭州、南京、深圳。
最简单的方式就是把这些城市做成一个数组:
String[] citys = {"北京","上海","天津","重庆","广州","成都","杭州","南京","深圳"};
然后结合上面Postman给我们生成的请求代码,就可以实现一个简单的随机测试目标城市天气接口返回的自动化啦~
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(); } }}
执行上面的程序,我们就通过随机城市,请求到了这个接口的相应状态和结果。
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的更多方法对请求和响应做更多的验证……
如果你觉得对你的工作有帮助,可以行动起来,尝试一下。