目前正在着手开发一款功能全面的接口自动化测试平台,该平台将涵盖登录、用户管理、权限控制、项目管理、用例管理、测试数据管理、测试报告生成、任务调度、缺陷跟踪以及系统配置等多个核心模块。测试完成后,可以将测试失败的结果,同步到禅道上,方便记录缺陷。也可以从禅道上同步缺陷到测试平台。更新缺陷的状态,方便跟踪缺陷。
技术选型
- 后端:采用Java作为主要开发语言。
- 前端:使用VUE框架进行界面展示。
- 缺陷同步: 通过调用禅道的RESTful接口,同步缺陷。
缺陷同步功能设计
调用禅道接口在实现缺陷添加和状态同步,需要先调用token接口。将平台测试不通过的接口的请求数据和接口返回以缺陷步骤的方式,调用禅道创建bug接口,来完成将测试不通过的接口同步到禅道。然后写一个定时任务,通过调用禅道的查询bug详情接口,来跟踪缺陷状态,同步到测试平台。
获取token
@Value("${zentao.api.url}")
private String zentaoUrl;
public String getZentaoToken(String account, String password) throws IOException {
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("applicaton/json;charset=utf-8");
Map<String, String> raw = new HashMap<>();
raw.put("account", account);
raw.put("password", password);
RequestBody body = RequestBody.create(mediaType, JSONObject.toJSONString(raw));
Request request = new Request.Builder().url(zentaoUrl + "/tokens").method("POST", body).addHeader("Content-Type", "application/json").build();
try {
Response response = okHttpClient.newCall(request).execute();
String strResponse = response.body().string();
JSONObject jsonResponse = JSON.parseObject(strResponse);
String token = jsonResponse.getString("token");
if (!token.isEmpty()) {
log.info("获取禅道token成功:{}", token);
return token;
}else {
return "";
}
}catch (Exception ignored){
log.error("获取禅道token失败: {}", ignored.getMessage());
return "";
}
}
创建bug
@Value("${zentao.api.url}")
private String zentaoUrl;
@Value("${zentao.products.id }")
private String productsId;
public int addBug(BugDTO bugDTO, String account, String password) throws IOException {
String token = getZentaoToken(account, password);
String url = String.format("%s/%s/%s", zentaoUrl, productsId, "bugs");
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("applicaton/json;charset=utf-8");
Map<String, Object> raw = new HashMap<>();
raw.put("title", bugDTO.getTitle());
raw.put("severity", bugDTO.getSeverity());
raw.put("pri", bugDTO.getPri());
raw.put("type", bugDTO.getType());
raw.put("steps", bugDTO.getSteps());
RequestBody body = RequestBody.create(mediaType, JSONObject.toJSONString(raw));
Request request = new Request.Builder().url(url).method("POST", body).addHeader("token", token).addHeader("Content-Type", "application/json").build();
try {
Response response = okHttpClient.newCall(request).execute();
String strResponse = response.body().string();
JSONObject jsonResponse = JSON.parseObject(strResponse);
int id = (int) jsonResponse.get("id");
return id;
}catch (Exception ignored){
log.error("获取禅道token失败: {}", ignored.getMessage());
return 0;
}
}
同步bug
@Value("${zentao.api.url}")
private String zentaoUrl;
public boolean syncBug(String account, String password, String bugId) throws IOException {
String token = getZentaoToken(account, password);
String url = String.format("%s/%s/%s", zentaoUrl, "bugs", bugId);
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("applicaton/json;charset=utf-8");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder().url(url).method("GET", body).addHeader("token", token).addHeader("Content-Type", "application/json").build();
try {
Response response = okHttpClient.newCall(request).execute();
String strResponse = response.body().string();
JSONObject jsonResponse = JSON.parseObject(strResponse);
if (response.code() == 200) {
BugDTO bugDTO = new BugDTO();
bugDTO.setAssignedTo(jsonResponse.getJSONObject("assignedTo").getString("realname"));
bugDTO.setStatus(jsonResponse.getString("status"));
bugDTO.setBug_id(Integer.valueOf(bugId));
bugService.updateBug(bugDTO);
log.info("同步bug成功");
return true;
}else {
log.error("同步bug失败");
return false;
}
}catch (Exception exception) {
log.error("同步bug失败:{}", exception.getMessage());
return false;
}
}