接口自动化–自动编写自动化case
- 工作以来遇到和接触到很多的自动化测试框架。无论是什么样的自动化测试框架或者是自动化测试平台 原理是基本是一致的。都是通过驱动测试用例脚本来测试系统功能,并且记录下测试结果的一个过程。还有些平台会增加自动执行,并发,json转换形成测试用例,测试结果、测试数据持久化存储,等等的一些操作。
- 基于对自动化的认知,测试用例都需要人工的去编写,没有什么捷径可走。使用框架的可以直接编写脚本,这种编码的方式灵活度很高。测试框架可以和开发语言一致,这样有两个优点:
- 一、研发的代码有值得借鉴的一些方法可以直接使用,有助于了解项目代码。
- 二、当遇到问题是,可以找研发求助,毕竟大多数的测试编码水平不如开发(少数测试大牛除外)。
- 测试平台,编写测试用例直接在界面上就可以编写,优缺点也比较明显
- 优点:降低了自动化测试的门槛,测试人员不需要了解代码就可以做自动化测试。
- 缺点:不灵活,遇到参数提取,参数公用等问题 需要定制很多规则。
- 最近,做了一个工具。根据抓包工具或者chrome浏览器导出的.har文件,形成测试用例。
一个请求基础的参数 都获取到。根据用例的格式 可快速的形成一批测试用例。 - 当然这也需要手动去调试,多场景问题解决不了。不过这也是一个快速自动化的解思路
代码附上(spock测试框架)
public class CreateCaseService {
public static void main(String[] args) throws HarReaderException {
HarReader harReader = new HarReader();
//读取har文件
Har har = harReader.readFromFile(new File("/Users/java/test.har"));
//解析har文件内容
for (HarEntry entry : har.getLog().getEntries()) {
//获取url,截取获得api
String[] url = entry.getRequest().getUrl().split ("31229/");
String api = url[1];
//获取response中的内容
String text = entry.getResponse().getContent().getText();
String encoding= entry.getResponse().getContent().getEncoding();
//如果是base61编码,需要解码
if ("base64".equals(encoding)){
text= new String(Base64.getDecoder().decode(text));
}
//新建用例given部分
System.out.println("def \""+api+"\"() {");
System.out.println("\n given:");
System.out.println(" HttpClientUtil httpClientUtil = new HttpClientUtil()");
System.out.println("\n when:");
//判断是post or get 方法
if("POST" == entry.getRequest().getMethod().toString() ) {
System.out.println(" List<Param> paramList = new LinkedList<>()");
for (HarPostDataParam data : entry.getRequest().getPostData().getParams()){
System.out.println(" paramList.add(new Param(\""+data.getName()+"\", \""+data.getValue()+"\"))");
}
System.out.println("\n def result = httpClientUtil.doPost(\"" + api + "\", headerMap,paramList,null)");
}else {
System.out.println("\n def result = httpClientUtil.doGet(\"" + api + "\", headerMap, null)");
}
System.out.println("\n then:");
//校验接口内容
// System.out.println(text);
try {
for (Map.Entry<String, Object> entry1 : JSON.parseObject(text).entrySet()) {
//System.out.println("key值="+entry1.getKey());
//System.out.println("对应key值的value="+entry1.getValue());
System.out.println(" assert JSON.parseObject(result).containsKey("+entry1.getKey()+")");
}
}catch (Exception e) {
e.printStackTrace();
}
System.out.println("}");
}
}
}