摘要:解決鏈路間參數(shù)傳遞的問題可以簡化為解決接口間的參數(shù)傳遞問題。當(dāng)然,針對這個問題的解決方案,其實還是蠻多的??偨Y(jié)下來,自動化用例的維護(hù)和開發(fā)成本主要集中在接口間參數(shù)傳遞的維護(hù)上面。
做過接口自動化測試的同學(xué)肯定都熟悉在全鏈路測試過程中,很多業(yè)務(wù)場景的完成并非由單一接口實現(xiàn),而是由很多接口組成的一條鏈路實現(xiàn)。例如你在淘寶上購物場景。
不同于單接口測試,這種鏈路型的接口自動化測試,由于接口間有參數(shù)依賴關(guān)系,往往不能將鏈路中的接口入?yún)⒐潭▽懰?,而是要依賴“上游”的響?yīng)中的某個字段值,因此需要提取出來動態(tài)地傳遞給下個接口,如下圖。
解決鏈路間參數(shù)傳遞的問題可以簡化為解決接口間的參數(shù)傳遞問題。當(dāng)然我上圖舉例是比較簡單的,下游對上游的依賴關(guān)系為1對1這種類型。實際業(yè)務(wù)場景中,更多的是多對一這種場景,即下游依賴上游的多個接口的返回結(jié)果。
當(dāng)然,針對這個問題的解決方案,其實還是蠻多的。就以JMeter工具為例,它就提供了通過后置處理器的多種參數(shù)提取方法。
其解決方案是,通過正則、JSON Extracor等提取的結(jié)果作為變量,動態(tài)傳遞數(shù)值給下游(變量)使用。
當(dāng)然,這種解決方案對于JMeter工具來說,是個不錯的解決方案,而且這個解決方案也具備普適性,就算你開發(fā)自己的接口測試框架,也是可以使用這種解決方案的(實際上,我在前東家參與研發(fā)的接口測試框架,當(dāng)時解決接口間參數(shù)傳遞的問題就是借鑒的這種思路。開發(fā)了一個類似JMeter正則提取器的正則提取工具包,引用工具包可以允許你輸入要提取的字段key便可匹配到其字段值value,如果提取不到就返回默認(rèn)值,如果有響應(yīng)體中一個key存在多個value,則返回最后一個匹配到的value;下游接口則使用Java replace()方法替換掉請求體中的${xx}。)。
如果只追求可以用,這個方案沒問題。但是這個方案缺點就是接口用例開發(fā)效率比較低,增加了寫接口測試用例的成本。這也是我當(dāng)時遇到的一個問題,大家寫自動化測試用例的時間很大一部分花在接口間參數(shù)提取和調(diào)試上。此外,這個方案也會增加維護(hù)成本,導(dǎo)致用例的“穩(wěn)定性”比較低。是因為如果上游接口的響應(yīng)體結(jié)構(gòu)變化可能會影響提取結(jié)果,下游的接口請求體中的${xx}也需要手動維護(hù)。總結(jié)下來,自動化用例的維護(hù)和開發(fā)成本主要集中在接口間參數(shù)傳遞的維護(hù)上面。
是否有更優(yōu)的解決方案呢?
試想一下,我們能否將整條鏈路可能使用到的字段集合作為一個池子,在上游接口的響應(yīng)結(jié)果提取出key-value并扔到池子里。下游的接口request體模版化,以${xxx}表示需要替換的變量,利用模板引擎(例如Java的velocity/FreeMarker)將${xxx}替換成“池子”中存在的value。實現(xiàn)的簡圖如下。
動手做
下面就以Java語言實現(xiàn)為例,寫兩個方法A、B,且B依賴方法A的返回結(jié)果。
我們只需要開發(fā) 上下文類、模版組裝工具、模擬場景代碼即可。
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
?
public class Client {
?
public static JSONObject login(){
JSONObject result = new JSONObject();
result.put("token","xsjkjdskdjsksjfksjfksjk");
return result;
}
?
// pay接口,依賴login接口
public static JSONObject pay(String request){
JSONObject result = new JSONObject();
// 就簡單寫了
if (request.contains("xsjkjdskdjsksjfksjfksjk")){
result.put("order", "122324434335");
result.put("status", "success");
} else {
result.put("status", "fail");
}
return result;
}
?
// 場景模擬
public static void main(String[] args) {
?
// 首先調(diào)用登陸接口
JSONObject loginResponse = login();
// 步驟1.將結(jié)果寫入上下文
Context context = new Context();
context.setToken(loginResponse.getString("token"));
// 創(chuàng)建一個pay接口的request模版
String request = "{/"token/":/"${token}/"}";
try {
// 步驟2.利用Apache BeanUtils工具 BeanToMap方法 將上下文轉(zhuǎn)化為keyValues
Map
keyValues=null; keyValues = BeanUtils.describe(context);
?
// 步驟3.組裝模版,將${token}替換為上下文中的其key存在的value
String out_request = VelocityUtils.parse(request, keyValues);
System.out.println("組裝request請求模版:" + out_request);
?
// 發(fā)起下單支付
JSONObject result = pay(out_request);
// 打印接口返回結(jié)果
System.out.println("打印響應(yīng)結(jié)果:" + result.toString());
?
}catch (Exception e){
System.out.println("異常退出");
}
}
}
這種方案的優(yōu)點:
我們只需要care步驟1即可(將上游的響應(yīng)結(jié)果寫入上下文),后面的組裝模版這些可以寫成同樣的工具,只需要傳入模版+上下文內(nèi)容即可,無需關(guān)注其他,能大大節(jié)省自動化用例開發(fā)和維護(hù)的成本。
當(dāng)然,本文只是拋磚引玉,如果有其他方案,也希望大家多多發(fā)散,多多交流溝通。
工具清單:
commons-beanutils
org.apache.velocity
com.alibaba.fastjson
org.projectlombok.lombok
往期推薦
經(jīng)驗分享|測試工程師轉(zhuǎn)型測試開發(fā)歷程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125565.html
摘要:同時吸取了社區(qū)大量優(yōu)秀思想,進(jìn)行歸納比對。有興趣的讀者可以點擊下面的鏈接購買,再次感謝各位的支持與鼓勵懇請各位批評指正京東當(dāng)當(dāng)原文網(wǎng)址 在React中最小的邏輯單元是組件,組件之間如果有耦合關(guān)系就會進(jìn)行通信,本文將會介紹React中的組件通信的不同方式 通過歸納范,可以將任意組件間的通信歸類為四種類型的組件間通信,分別是父子組件,爺孫組件,兄弟組件和任意組件,需要注意的是前三個也可以算...
摘要:設(shè)計模式的類別設(shè)計模式一共分為種類型,共種。屬于結(jié)構(gòu)型的設(shè)計模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。問題描述了應(yīng)該在何時使用設(shè)計模式。解決方案描述了設(shè)計的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。 設(shè)計模式概述 1. 設(shè)計模式是什么 我們在平時編寫代碼的過程中,會遇到各種各樣的問題,細(xì)想一下很多問題的解決思路大致一樣的,這時候你就可以把解決問題的思路整...
摘要:原文地址前言起源組件化方案分析業(yè)務(wù)組件的劃分和代碼隔離路由框架基礎(chǔ)庫的優(yōu)勢簡介什么是組件化為什么要組件化分析現(xiàn)有的組件化方案如何選擇組件化方案組件化方案描述架構(gòu)圖一覽架構(gòu)圖詳解宿主層業(yè)務(wù)層業(yè)務(wù)模塊的拆分基礎(chǔ)層核心基礎(chǔ)業(yè)務(wù)公共服務(wù)基礎(chǔ)組件其他 原文地址: https://www.jianshu.com/p/f67... 0 前言 0.1 起源 0.2 組件化方案分析 0.2....
摘要:想繼續(xù)了解設(shè)計模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。創(chuàng)建型設(shè)計模式主要有簡單工廠模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式和單例模式,下面一一道來。而工廠方法模式本意是將實際創(chuàng)建對象的工作推遲到子類中。 接觸前端兩三個月的時候,那時候只是聽說設(shè)計模式很重要,然后我就去讀了一本設(shè)計模式的書,讀了一部分,也不知道這些設(shè)計模式到底設(shè)計出來干嘛的,然后就沒再看了。后...
閱讀 3805·2023-01-11 11:02
閱讀 4308·2023-01-11 11:02
閱讀 3132·2023-01-11 11:02
閱讀 5239·2023-01-11 11:02
閱讀 4804·2023-01-11 11:02
閱讀 5578·2023-01-11 11:02
閱讀 5384·2023-01-11 11:02
閱讀 4084·2023-01-11 11:02