前言
这段时间一直在学习以及编写TesterHome android apk ,虽然只是负责一些打酱油的工作,但是或多或少都学到了很多东西,中间又抽了点时间学习了接口自动化 主要是看了这篇文章 API 自动化测试框架分享。写的真的很棒,大体按照它的实现方式自己写了一个基础。不过还有很多不完善的地方尤其是结果的校验方面。
正文
首先说下参数化部分,因为想要做好了一个框架给到其他使用者最好是能够让使用者很少的去接触到你的代码,而是使用一些配置项来满足他们的需要,所以使用excel来做参数化。
主要说下object这个字段,它主要是为了提取http 返回的内容中的字段。采用正则的方法进行过滤出来。检查字段目前还没有做 后续会加上这个。其他都是较为容易能够看懂的。
再来是读取excel。 这里的读取采用apache 的poi进行读取。方式很粗暴。
public static List<TestCase> readXls() throws IOException {
File files = new File("");
String path = files.getAbsolutePath().replaceAll("\\\\","/");
path = path.substring(0, path.lastIndexOf("/"));
path = path +"/res/CareApi.xls";
File file = new File(path);
POIFSFileSystem poifsFileSystem = null;
poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(poifsFileSystem);
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);
int rowstart = hssfSheet.getFirstRowNum();
int rowEnd = hssfSheet.getLastRowNum();
List<TestCase> testCaseList = new ArrayList<TestCase>();
for(int i=rowstart;i<=rowEnd;i++)
{
if(i==0){
continue;
}
HSSFRow row = hssfSheet.getRow(i);
if(null == row) continue;
int k = row.getFirstCellNum();
TestCase testCase = new TestCase();
HSSFCell cell = row.getCell(k);
try{
String testCaseId = String.valueOf(getValue(cell));
if (testCaseId.trim().equals("0.0")||testCaseId.trim().equals("")){
break;
}
testCase.setId(testCaseId);
k += 1;
cell = row.getCell(k);
testCase.setCaseName(getValue(cell));
k += 1;
cell = row.getCell(k);
testCase.setSendType(getValue(cell));
k += 1;
cell = row.getCell(k);
testCase.setUrl(getValue(cell));
k += 1;
cell = row.getCell(k);
testCase.setHeader(getValue(cell));
k += 1;
cell = row.getCell(k);
testCase.setData(getValue(cell));
k += 1;
cell = row.getCell(k);
testCase.setFilterData(getValue(cell));
testCaseList.add(testCase);
}catch (IllegalStateException e){
break;
}
}
return testCaseList;
}
以上的代码也很简单就是读取excel表的值放到一个list中 接着返回。
下来我们就要进行遍历用例了。首先可以再仔细观察一下里面有几个参数化的内容。类似于
这里就需要我们对参数进行转换了,不过我们先跳过这个,往下走。转换完URL以及postData的内容以后我们可以直接进行http的get或者post请求了。这个大家可以从网上找到一个封装好apache http 的工具类。请求后获取到我们想要的内容,这个时候就要靠object这个值来进行提取内容了。我们看看具体的实现步骤吧。
/**
* 提取对应的字符串
* @param response 原字符串
* @param filter 过滤的字段
* @param map 存放键值对的map
* @return
*/
public static HashMap<String,String > responseFilter(String response, String filter, HashMap<String,String> map) {
String[] filterArray = filter.split(",");
for(int i=0;i<filterArray.length;i++) {
if (!map.containsKey(filterArray[i])) {
Pattern p= Pattern.compile(filterArray[i]+"\":(.*?),");
Matcher m=p.matcher(response);
while(m.find()){
String str = m.group(1).replaceAll("\"","");
map.put(filterArray[i],str);
}
}
}
return map;
}
由于返回的response基本都是json的格式,所以说我们就是利用这个来做一些正则的匹配以及替换。再将提取到的字段存放到一个map中。这个时候我们就可以回到前面跳过的参数替换的问题了。具体的实现如下:
public static String paramParser(String param, HashMap<String,String> map){
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry)iterator.next();
if (param.contains(String.valueOf(entry.getKey()).toUpperCase())) {
param = param.replaceAll(String.valueOf(entry.getKey()).toUpperCase(),String.valueOf(entry.getValue()));
}
}
if (param.contains("RANDOM")){
int random = (int)(Math.random()*Integer.parseInt(param.substring(param.indexOf("(")+1,param.indexOf(")"))));
return param.replaceAll("RANDOM\\(\\d+\\)",String.valueOf(random));
}
return param;
}
以上主要是判断URL中是否包含有所存储的hash的key,如果有的话就将其进行一个替换。另外还有一个是随机数。这个也是比较简单的。
以上就是大体的一个框架了,里面还省略了一部分内容,例如说接口耗时的计算。以及状态码 statusCode的匹配,结果reportNg以及maven生成报告。等等。
感想
感觉还是有点水,最关键的字段验证并没有做。
TODO:后续将字段验证补上,将其结合jenkins 进行集成测试。