2018年離開了自己工作過了7年的公司,從業(yè)務(wù)測試工作轉(zhuǎn)變?yōu)闇y試開發(fā),圍繞公司的質(zhì)量體系打造測試管理平臺(tái)。跳出舒適區(qū)后,忙于新工作新挑戰(zhàn),有1年多沒有發(fā)文章。近年底,工作計(jì)劃也沒有那么繁忙,可以有時(shí)間沉淀一下,記錄自己在這次雙十一工作中做的一套動(dòng)態(tài)的mock服務(wù)。
前期背景
我們公司承接了某品牌方G的OMS業(yè)務(wù),而G的WMS又包給了另外一家公司D。品牌希望OMS和WMS系統(tǒng)能分別做一次性能測試,要求如下:
1. 即各自走內(nèi)部的流程進(jìn)行性能測試,以期望在能在雙十一期間能處理100萬單/小時(shí)的吞吐量能力。
2. OMS這邊來創(chuàng)建訂單,WMS訪問我們的文件系統(tǒng)獲取訂單文件。
3. 希望WMS發(fā)送訂單狀態(tài):出庫確認(rèn)(shipment_confirm)和過倉反饋(transfer_order)時(shí)能夠走我們公司的網(wǎng)絡(luò)系統(tǒng),以此來查看一下WMS的網(wǎng)絡(luò)傳輸能力。
4. 訂單內(nèi)容分為多SKU訂單和單個(gè)SKU訂單,這種訂單比例混合為30%,70%
5. 性能測試在生產(chǎn)環(huán)境下進(jìn)行。
需求理解
1. 該階段性能測試其實(shí)是針對(duì)D的;
2. 做Mock服務(wù)的目的是創(chuàng)建提供給D的測試訂單數(shù)據(jù);
3. 當(dāng)D處理訂單流程中會(huì)向OMS發(fā)送訂單狀態(tài),Mock服務(wù)接收請(qǐng)求并返回響應(yīng);
也就是說,此時(shí)的Mock服務(wù)應(yīng)該入下圖:

設(shè)計(jì)方案
資源申請(qǐng)
1. 5臺(tái)vm資源
2. 1個(gè)MySql單點(diǎn)
3. 用于外部訪問的域名以及Nginx反向代理
技術(shù)實(shí)現(xiàn)
1. spring boot
實(shí)現(xiàn)功能
自動(dòng)創(chuàng)建訂單:
1. 為D的WMS生成約定格式的訂單文件;(這些訂單只能用于D的WMS測試使用)
2. 設(shè)置文件數(shù)量,當(dāng)文件數(shù)量達(dá)到一定大小后才將這些文件打成一個(gè)壓縮包tgz上傳至文件服務(wù)器;
3. 通過接口命令去生成多SKU訂單和單個(gè)SKU訂單,數(shù)量可以由人為輸入;
擋板功能:
1. 接收對(duì)方的過倉反饋(transfer_order)和出庫確認(rèn)(shipment_confirm)請(qǐng)求
2. 解析請(qǐng)求中的一些特定值構(gòu)造成響應(yīng)報(bào)文返回給D
3. 保證Mock Server的性能可靠
開發(fā)思路

1. 由測試人員輸入創(chuàng)單命令,Mock程序開始創(chuàng)單
2. Mock服務(wù)從數(shù)據(jù)庫里面獲取一些必要的信息,例如上次創(chuàng)單號(hào)的最大值;
3. 創(chuàng)建了一張表記錄訂單號(hào)最大值,因?yàn)橛唵翁?hào)是不允許重復(fù)的,所以記錄下來,在下次創(chuàng)單時(shí)再讀取它就可以保證不重復(fù)。
代碼實(shí)現(xiàn)
實(shí)現(xiàn)接口:
1. /ship/create,有三個(gè)參數(shù):
a) total: 一共需要產(chǎn)生多少訂單;
b) unitSize: 每多少訂單就生成一個(gè)tgz壓縮包;
c) type: 多SKU訂單還是單SKU訂單;
2. /ship/send,將生成的訂單tgz壓縮包上傳到文件服務(wù)器上
3. /logistics/service,擋板功能提供給D方調(diào)用發(fā)送狀態(tài)請(qǐng)求,并根據(jù)它的狀態(tài)請(qǐng)求返回相應(yīng)的報(bào)文

以上就是定義的接口信息,由于具體實(shí)現(xiàn)涉及到一定的公司業(yè)務(wù),所以只能大致講述一下以上的思路。
題外話,在協(xié)助D公司進(jìn)行性能測試時(shí),一開始它們對(duì)我的Mock性能有所懷疑,因?yàn)樗鼈兊恼?qǐng)求速度非常慢大約一小時(shí)只能處理20萬單。
于是,我對(duì)自己的/logistics/service接口的使用jmeter對(duì)單臺(tái)mock server進(jìn)行了簡單測試,該接口性能>350req/s,遠(yuǎn)遠(yuǎn)超過D公司的性能要求(100萬單/小時(shí)),更不用說我的服務(wù)可以橫向擴(kuò)展以后的性能。再次,我將日志拿出來進(jìn)行了分析發(fā)現(xiàn),它們?cè)诎l(fā)送請(qǐng)求時(shí)每個(gè)時(shí)間間隔最短為5秒,最長達(dá)到30秒,列出數(shù)據(jù)說明性能瓶頸不在我這邊。
通過這件事,我很慶幸,我當(dāng)時(shí)的日志打印還是比較完善的,才能夠發(fā)現(xiàn)不是我的問題,不然對(duì)于一個(gè)新開發(fā)出來的服務(wù)在對(duì)外聯(lián)調(diào)時(shí),沒有足夠的日志支撐就會(huì)使自己的工作陷入被動(dòng)。
總體來說,對(duì)外部分的Mock服務(wù)功能是非常簡單的,開發(fā)運(yùn)行過程也很順利。而真正的重頭戲才開始,那便是對(duì)內(nèi)壓測部分,請(qǐng)繼續(xù)關(guān)注:開發(fā)Mock服務(wù)做雙十一壓測 (下)