国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

接口間參數(shù)傳遞的一種解決方案

不知名網(wǎng)友 / 1042人閱讀

摘要:解決鏈路間參數(shù)傳遞的問(wèn)題可以簡(jiǎn)化為解決接口間的參數(shù)傳遞問(wèn)題。當(dāng)然,針對(duì)這個(gè)問(wèn)題的解決方案,其實(shí)還是蠻多的。總結(jié)下來(lái),自動(dòng)化用例的維護(hù)和開(kāi)發(fā)成本主要集中在接口間參數(shù)傳遞的維護(hù)上面。

引言

做過(guò)接口自動(dòng)化測(cè)試的同學(xué)肯定都熟悉在全鏈路測(cè)試過(guò)程中,很多業(yè)務(wù)場(chǎng)景的完成并非由單一接口實(shí)現(xiàn),而是由很多接口組成的一條鏈路實(shí)現(xiàn)。例如你在淘寶上購(gòu)物場(chǎng)景。

不同于單接口測(cè)試,這種鏈路型的接口自動(dòng)化測(cè)試,由于接口間有參數(shù)依賴關(guān)系,往往不能將鏈路中的接口入?yún)⒐潭▽?xiě)死,而是要依賴“上游”的響應(yīng)中的某個(gè)字段值,因此需要提取出來(lái)動(dòng)態(tài)地傳遞給下個(gè)接口,如下圖。

解決鏈路間參數(shù)傳遞的問(wèn)題可以簡(jiǎn)化為解決接口間的參數(shù)傳遞問(wèn)題。當(dāng)然我上圖舉例是比較簡(jiǎn)單的,下游對(duì)上游的依賴關(guān)系為1對(duì)1這種類型。實(shí)際業(yè)務(wù)場(chǎng)景中,更多的是多對(duì)一這種場(chǎng)景,即下游依賴上游的多個(gè)接口的返回結(jié)果。

當(dāng)然,針對(duì)這個(gè)問(wèn)題的解決方案,其實(shí)還是蠻多的。就以JMeter工具為例,它就提供了通過(guò)后置處理器的多種參數(shù)提取方法。

其解決方案是,通過(guò)正則、JSON Extracor等提取的結(jié)果作為變量,動(dòng)態(tài)傳遞數(shù)值給下游(變量)使用。

當(dāng)然,這種解決方案對(duì)于JMeter工具來(lái)說(shuō),是個(gè)不錯(cuò)的解決方案,而且這個(gè)解決方案也具備普適性,就算你開(kāi)發(fā)自己的接口測(cè)試框架,也是可以使用這種解決方案的(實(shí)際上,我在前東家參與研發(fā)的接口測(cè)試框架,當(dāng)時(shí)解決接口間參數(shù)傳遞的問(wèn)題就是借鑒的這種思路。開(kāi)發(fā)了一個(gè)類似JMeter正則提取器的正則提取工具包,引用工具包可以允許你輸入要提取的字段key便可匹配到其字段值value,如果提取不到就返回默認(rèn)值,如果有響應(yīng)體中一個(gè)key存在多個(gè)value,則返回最后一個(gè)匹配到的value;下游接口則使用Java replace()方法替換掉請(qǐng)求體中的${xx}。)。

如果只追求可以用,這個(gè)方案沒(méi)問(wèn)題。但是這個(gè)方案缺點(diǎn)就是接口用例開(kāi)發(fā)效率比較低,增加了寫(xiě)接口測(cè)試用例的成本。這也是我當(dāng)時(shí)遇到的一個(gè)問(wèn)題,大家寫(xiě)自動(dòng)化測(cè)試用例的時(shí)間很大一部分花在接口間參數(shù)提取和調(diào)試上。此外,這個(gè)方案也會(huì)增加維護(hù)成本,導(dǎo)致用例的“穩(wěn)定性”比較低。是因?yàn)槿绻嫌谓涌诘捻憫?yīng)體結(jié)構(gòu)變化可能會(huì)影響提取結(jié)果,下游的接口請(qǐng)求體中的${xx}也需要手動(dòng)維護(hù)。總結(jié)下來(lái),自動(dòng)化用例的維護(hù)和開(kāi)發(fā)成本主要集中在接口間參數(shù)傳遞的維護(hù)上面。

是否有更優(yōu)的解決方案呢?

試想一下,我們能否將整條鏈路可能使用到的字段集合作為一個(gè)池子,在上游接口的響應(yīng)結(jié)果提取出key-value并扔到池子里。下游的接口request體模版化,以${xxx}表示需要替換的變量,利用模板引擎(例如Java的velocity/FreeMarker)將${xxx}替換成“池子”中存在的value。實(shí)現(xiàn)的簡(jiǎn)圖如下。

動(dòng)手做

下面就以Java語(yǔ)言實(shí)現(xiàn)為例,寫(xiě)兩個(gè)方法A、B,且B依賴方法A的返回結(jié)果。

我們只需要開(kāi)發(fā) 上下文類、模版組裝工具、模擬場(chǎng)景代碼即可。

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();// 就簡(jiǎn)單寫(xiě)了if (request.contains("xsjkjdskdjsksjfksjfksjk")){            result.put("order", "122324434335");            result.put("status", "success");        } else {            result.put("status", "fail");        }return result;    }?// 場(chǎng)景模擬public static void main(String[] args) {?// 首先調(diào)用登陸接口        JSONObject loginResponse = login();// 步驟1.將結(jié)果寫(xiě)入上下文        Context context = new Context();        context.setToken(loginResponse.getString("token"));// 創(chuàng)建一個(gè)pay接口的request模版String request = "{/"token/":/"${token}/"}";try {// 步驟2.利用Apache BeanUtils工具 BeanToMap方法 將上下文轉(zhuǎn)化為keyValues            Map keyValues=null;            keyValues = BeanUtils.describe(context);?// 步驟3.組裝模版,將${token}替換為上下文中的其key存在的valueString out_request = VelocityUtils.parse(request, keyValues);            System.out.println("組裝request請(qǐng)求模版:" + 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)點(diǎn):

我們只需要care步驟1即可(將上游的響應(yīng)結(jié)果寫(xiě)入上下文),后面的組裝模版這些可以寫(xiě)成同樣的工具,只需要傳入模版+上下文內(nèi)容即可,無(wú)需關(guān)注其他,能大大節(jié)省自動(dòng)化用例開(kāi)發(fā)和維護(hù)的成本。

當(dāng)然,本文只是拋磚引玉,如果有其他方案,也希望大家多多發(fā)散,多多交流溝通。

工具清單:

commons-beanutils

org.apache.velocity

com.alibaba.fastjson

org.projectlombok.lombok

往期推薦

多項(xiàng)目管理實(shí)踐論壇定于12月11-12日通過(guò)云端分

經(jīng)驗(yàn)分享|測(cè)試工程師轉(zhuǎn)型測(cè)試開(kāi)發(fā)歷程

技術(shù)面必考:多線程、多進(jìn)程

接口測(cè)試框架開(kāi)發(fā)實(shí)踐2:接口自動(dòng)化測(cè)試框架設(shè)計(jì)思路

接口自動(dòng)化測(cè)試框架實(shí)踐1:接口測(cè)試概述

我在阿里做測(cè)開(kāi)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/125565.html

相關(guān)文章

  • 解密傳統(tǒng)組件通信與React組件通信

    摘要:同時(shí)吸取了社區(qū)大量?jī)?yōu)秀思想,進(jìn)行歸納比對(duì)。有興趣的讀者可以點(diǎn)擊下面的鏈接購(gòu)買(mǎi),再次感謝各位的支持與鼓勵(lì)懇請(qǐng)各位批評(píng)指正京東當(dāng)當(dāng)原文網(wǎng)址 在React中最小的邏輯單元是組件,組件之間如果有耦合關(guān)系就會(huì)進(jìn)行通信,本文將會(huì)介紹React中的組件通信的不同方式 通過(guò)歸納范,可以將任意組件間的通信歸類為四種類型的組件間通信,分別是父子組件,爺孫組件,兄弟組件和任意組件,需要注意的是前三個(gè)也可以算...

    CoderBear 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式概述

    摘要:設(shè)計(jì)模式的類別設(shè)計(jì)模式一共分為種類型,共種。屬于結(jié)構(gòu)型的設(shè)計(jì)模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。問(wèn)題描述了應(yīng)該在何時(shí)使用設(shè)計(jì)模式。解決方案描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。 設(shè)計(jì)模式概述 1. 設(shè)計(jì)模式是什么 我們?cè)谄綍r(shí)編寫(xiě)代碼的過(guò)程中,會(huì)遇到各種各樣的問(wèn)題,細(xì)想一下很多問(wèn)題的解決思路大致一樣的,這時(shí)候你就可以把解決問(wèn)題的思路整...

    leon 評(píng)論0 收藏0
  • MVPArms官方快速組件化方案開(kāi)源,來(lái)自5K star的信賴

    摘要:原文地址前言起源組件化方案分析業(yè)務(wù)組件的劃分和代碼隔離路由框架基礎(chǔ)庫(kù)的優(yōu)勢(shì)簡(jiǎn)介什么是組件化為什么要組件化分析現(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....

    aikin 評(píng)論0 收藏0
  • 《JavaScript設(shè)計(jì)模式》讀后感 覺(jué)很復(fù)雜

    摘要:想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。創(chuàng)建型設(shè)計(jì)模式主要有簡(jiǎn)單工廠模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式和單例模式,下面一一道來(lái)。而工廠方法模式本意是將實(shí)際創(chuàng)建對(duì)象的工作推遲到子類中。 接觸前端兩三個(gè)月的時(shí)候,那時(shí)候只是聽(tīng)說(shuō)設(shè)計(jì)模式很重要,然后我就去讀了一本設(shè)計(jì)模式的書(shū),讀了一部分,也不知道這些設(shè)計(jì)模式到底設(shè)計(jì)出來(lái)干嘛的,然后就沒(méi)再看了。后...

    e10101 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<