测试需求,验证新接口和旧接口的返回结果是否一致。
1.涉及到旧接口为 xml 格式,新接口为 json 格式。
2.涉及到新接口有旧接口字段的合并;
3.我只做了简单的对比,如比对两个接口的返回字段是否值相等;
4.项目使用 java 语言,Maven 管理。
//使用日志
@Slf4j
public class TestUrlMap {
//设置请求http参数初始化
public static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.build();
public static void diffMap(String code) throws IOException {
//如果是读取多条url,可以读取文件,我这里直接赋值了。
String oldUrl = "oldUrl";
String newUrl = "newUrl" ;
//获取body
String oldData = client.newCall(
new Request.Builder().url(oldUrl).build())
.execute().body().string();
String newData = client.newCall(
new Request.Builder().url(newUrl).build())
.execute().body().string();
if (StringUtils.isAnyBlank(oldData, newData)) {
log.error("获取数据异常, code={}, oldData={}, newData={}", code, oldData, newData);
}
//读取到json里面result的内容
JSONObject oldJson = JSON.parseObject(oldData).getJSONObject("result");
//XML转换json,并读取里面result内容
JSONObject newJson = XML.toJSONObject(newData).getJSONObject("result");
/**
*数据示例
* "adcode": "110000",
"version": 1601,
*/
//对比字符串
if (!StringUtils.equals(oldJson.getString("adcode"), newJson.getString("adcode"))) {
log.error("code={}, adcode 不一致, {}!={}", code, oldJson.getString("adcode"), newJson.getString("adcode"));
return;
}
//对比整数
if (oldJson.getInt("version") != newJson.getInt("version")) {
log.error("code={}, version 不一致, {}!={}", code, oldJson.getInt("version"), newJson.getInt("version"));
return;
}
int count = newJson.getInteger("count");
JSONArray oldEvents = oldJson.getJSONArray("events");
JSONArray newEvents = newJson.getJSONArray("events");
if (count != oldEvents.size() || count != newEvents.size()) {
log.error("code={} events长度不一致, {}!={}", code, oldEvents.size(), newEvents.size());
return;
}
//下面的for循环是对比json里面的数组
int newI = 0;
int linkIndex = 0;
for (int i = 0; i < oldEvents.size(); i++) {
String oldEvent = StringUtils.trim(oldEvents.getString(i));
//获取json数组里面第N个值。
JSONObject newEvent = newEvents.getJSONObject(newI);
List<String> oldEventList = Splitter.on(",").splitToList(oldEvent);
//oldEventList.get(29),查找接口文档确定 i 的值,但是要注意java的下标是从0开始计数。
if (!StringUtils.equals(Strings.nullToEmpty(newEvent.getString("lonlat")), Strings.nullToEmpty(oldEventList.get(29) + "," + oldEventList.get(30)))) {
log.error("code={}, enventIndex={}, lonlat 不一致, {}!={}", code, i, oldEventList.get(29) + "," + oldEventList.get(30), newEvent.getString("lonlat"));
return;
}
}
//这里做的比较是因为新接口把旧接口的很多相关的niLinkIds字段拼接为一个字段了。
String niLinkIdsStr = newEvent.getString("niLinkIds");
Iterable<String> split = Splitter.on(",").split(niLinkIdsStr);
if (!Iterables.get(split, linkIndex, "").equals(Strings.nullToEmpty(oldEventList.get(26)))) {
log.error("code={}, enventIndex={}, niLinkIds 不一致, {}!={}", code, i, oldEventList.get(26), newEvent.getString("niLinkIds"));
return;
}
linkIndex++;
if (linkIndex >= Iterables.size(split)) {
linkIndex = 0;
newI++;
}
log.info("对比成功");
}
}
public static void main(String[] args) throws IOException {
/* List<String> codes = Files.readLines(new File("F:/code.txt"), Charset.forName("utf-8"));
* for (String code : codes) {
* diffMap(code);
* }
* 这是读取文件,传参数的方式,因为我直接给url赋值了,所以直接调用 diffMap() 就可以了。
*/
diffMap(code);
}
}