前言:以往在json串比對(duì)的時(shí)候档押,我們都是一對(duì)一的忽略順序比對(duì)方式令宿,本次遇到了一個(gè)奇怪比對(duì)方式(反正我是之前沒想到的),看來又得擼碼打包了筛婉。
? 別總以為測(cè)試人員就不需要擼碼癞松,沒聽說一句老話么,不會(huì)前端的測(cè)試不是好的架構(gòu)師(搞笑的)匆浙。好了厕妖,bb這么多言秸,就是希望沒事提高一下自身水平迎捺,還是來看看什么情況凳枝。先給大家簡(jiǎn)單講一講之前我們?cè)谧鼋涌谧詣?dòng)化測(cè)試的時(shí)候跋核,我們是進(jìn)行json串的比對(duì)叛买,像這樣:
//[OLD]
//用例預(yù)期結(jié)果:
[{"channel":"AA","value":12},{"channel":"BB","value":20}]
//接口返回的結(jié)果:
[{"channel":"BB","value":20},{"channel":"AA","value":12}]
這樣的比對(duì)很簡(jiǎn)單率挣,只需要以數(shù)組的形式比對(duì)就可以了(或者其他方法),以下是我從CSDN里面參考的代碼(需要自行導(dǎo)如Gson包)
/**
* 比較兩個(gè)json字符串是否等價(jià)
* (本次用的是gson2.8.5的包捶箱,自行下載)
*/
public boolean same(String a, String b) {
if (a == null) {
return b == null;
}
if (a.equals(b)) {
return true;
}
JsonElement aElement = parser.parse(a);
JsonElement bElement = parser.parse(b);
if (gson.toJson(aElement).equals(gson.toJson(bElement))) {
return true;
}
return same(aElement, bElement);
}
private boolean same(JsonElement a, JsonElement b) {
if (a.isJsonObject() && b.isJsonObject()) {
return same((JsonObject) a, (JsonObject) b);
} else if (a.isJsonArray() && b.isJsonArray()) {
return same((JsonArray) a, (JsonArray) b);
} else if (a.isJsonPrimitive() && b.isJsonPrimitive()) {
return same((JsonPrimitive) a, (JsonPrimitive) b);
} else if (a.isJsonNull() && b.isJsonNull()) {
return same((JsonNull) a, (JsonNull) b);
} else {
return Boolean.FALSE;
}
}
【可以自行打成包然后放入jmeter進(jìn)行比對(duì)json】
現(xiàn)在丁屎,由于開發(fā)那邊改了需求晨川,連我的比對(duì)方式也得改變[圖片上傳失敗...(image-b4a2b3-1556261984721)] 键思。Just Like This:
//[NEW]
//用例預(yù)期結(jié)果:
[{"channel":"AA","value":12},{"channel":"BB","value":20}]
//接口返回的結(jié)果:
[{"value":20,"channel":"BB"},{"channel":"AA","value":12},{"channel":"CC","value":100},{"channel":"DD","value":100},{"channel":"EE","value":100}]
要求這樣的比對(duì)為true看蚜,Emmmm.....
這不是數(shù)學(xué)上面的包含關(guān)系么供炎,我想想怎么辦?
我想想疾党,在小時(shí)候?qū)W數(shù)學(xué)的時(shí)候音诫,老師教得這么一個(gè)原理:當(dāng)A?B的時(shí)候,得出A∩B = A雪位。
在Java里面的Connection框架里面竭钝,有一個(gè)集合的方法求交集,那就是retainAll()
即(參考代碼https://blog.csdn.net/qq_25806863/article/details/70312046):
//Set集合
Set<String> set1 = new HashSet<>();
Set<String> set2 = new HashSet<>();
set1.add("a"); set1.add("b"); set1.add("c");
set2.add("c"); set2.add("d"); set2.add("e");
//交集 set1.retainAll(set2);
System.out.println("交集是 "+set1);
我也去嘗試了一下雹洗,的確是不行的香罐,為什么?因?yàn)檫@次不僅僅是考慮到兩個(gè)json串的順序时肿,還考慮到了串里面key庇茫、value的順序在里面了(認(rèn)真觀察[NEW]的那串json)螃成。此時(shí)旦签,我的大佬在旁邊給了一點(diǎn)提示查坪,要不要考慮使用List,Gson轉(zhuǎn)成對(duì)象試試宁炫?
于是有了以下的代碼(可提供參考意見進(jìn)行改進(jìn)):
public class Demo {
public boolean sameJson(String jsonA, String jsonB) {
// 通過Gson轉(zhuǎn)對(duì)象
Gson gson = new Gson();
// 通過List存儲(chǔ)對(duì)象
List<Info> infoListA = gson.fromJson(jsonA, new TypeToken<List<Info>>() {
}.getType());
List<Info> infoListB = gson.fromJson(jsonB, new TypeToken<List<Info>>() {
}.getType());
// 計(jì)數(shù)
int count = 0;
for (Info infoa : infoListA) {
for (Info infob : infoListB) {
if (!infoa.equals(infob)) {
continue;
}
count++;
}
}
if (count == infoListA.size()) {
return true;
} else {
return false;
}
}
/*
* 造一個(gè)key value實(shí)體類
*/
public class DemoInfo {
private String channel;
private int value;
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
// 重寫了equals方法,以短的json
public boolean equals(DemoInfo info) {
if (info.getChannel() != null) {
if (this.channel.equals(info.getChannel())
&& this.value == info.getValue()) {
return true;
}
}
return false;
}
}
}
寫到了這里偿曙,提出幾點(diǎn)疑問:
1、為什么我寫方法接的是String類型淋淀,而不是json類型遥昧?
2、DemoInfo這個(gè)對(duì)象每次都需要自己創(chuàng)建朵纷,會(huì)不會(huì)麻煩炭臭?
3、還有沒有其他的辦法袍辞?
那么如何打成包給jmeter用呢鞋仍?
參考傳送門:https://blog.csdn.net/qq_34845382/article/details/53885907
劃重點(diǎn):[注意點(diǎn)]
打包之前,一定要建立一個(gè)MANIFEST.MF文件在工程內(nèi)
Manifest-Version: 1.0 ------------------------前面都要留一個(gè)空格
Class-Path: ./gson-2.8.5.jar ------------------------第三方包放在一起搅吁,當(dāng)前文件夾
Main-Class: com.xxx.Main ------------------------包名.主類
打包的過程我就不詳細(xì)講了威创,接下來我講講jmeter那邊應(yīng)該怎么用。
首先谎懦,肯定是將打好的包放在D:\apache-jmeter-3.3\lib\ext下面啦(別忘了放第三方的jar包)肚豺,然后?打開jmeter咯界拦。搞個(gè)demo先:
把準(zhǔn)備好的csv用例demo
腳本運(yùn)行:
下一期我講解答以上的問題吸申,希望各位大神提出寶貴的建議,優(yōu)化測(cè)試方法享甸。