背景
校驗系統的正確性和可靠性時,僅靠用例場景無法覆蓋全生產環境下的所有場景,需要一套引流工具,在系統正式上線前用線上的請求測試待上線系統,在正常請求下了解是否有報錯、在數倍請求下了解系統的性能瓶頸。常用的引流工具有GoReplay、tcpcopy等。
豬齒魚效能平台自動化測試模塊流量回歸測試功能,主要使用GoReplay錄制產品界面中的操作產生的HTTP請求及響應用於生成流量文件,然后將其導入Choerodon平台生成用例進行管理與執行。本文通過GoReplay的介紹及GoReplay在豬齒魚效能平台中的實踐,幫助大家理解豬齒魚流量回歸測試的概念及使用。
關於GoReplay
GoReplay,原名叫gor,因為其易上手,且功能比較全所以我們使用GoReplay進行流量錄制。GoReplay是在投入生產之前使用真實流量測試應用程序最簡單和最安全的方式。
隨着應用程序的增長,測試所需的工作量也呈指數增長。GoReplay提供了重復使用現有流量進行測試的簡單想法,這使得它非常強大。可以分析和記錄應用程序流量,且不影響應用,消除了將第三方組件置於關鍵路徑中帶來的風險。
GoReplay的安裝
-
然后在環境中輸入指令:
--wget https://github.com/buger/goreplay/releases/download/v1.1.0/gor_1.1.0_x64.tar.gz
這樣我們就能獲取到gor_1.1.0_x64.tar.gz壓縮文件,。
- 然后對其解壓輸入指令:
--tar vxf gor_1.1.0_x64.tar.gz
文件解壓過分我們得到了一個gor文件;我們將gor文件移動到path環境下,這樣我們就可以使用gor命令進行流量錄制了。
GoReplay的基本指令
--input-raw
- 用於捕獲HTTP流量,您應該指定IP地址或接口和應用程序端口。--input-file
- 接受之前使用的文件--output-file
。--input-tcp
- 如果您決定將來自多個轉發器Gor實例的流量轉發給它,則由Gor聚合實例使用。
可用輸出:
-
--output-http
- 重放HTTP流量到給定的端點,接受基礎URL。 -
--output-file
- 記錄傳入的流量到文件。 -
--output-tcp
- 將傳入數據轉發給另一個Gor實例。 -
--output-stdout
- 用於調試,輸出所有數據到stdout。
GoReplay在豬齒魚平台的實踐
1. 錄制流量
1.1 首先我們先在服務器中安裝Gor_1.1.0;
1.2 然后輸入命令以下命令:
sudo nohup gor –input-raw :8080 \ # 監聽服務的端口(默認網關的端口為8080) -http-allow-method GET \ # 只錄制GET,POST,PUT,DELETE四種方法的請求 -http-allow-method POST
-http-allow-method PUT
-http-allow-method DELETE
-input-raw-track-response \ # 捕獲響應報文 -input-raw-timestamp-type PCAP_TSTAMP_HOST \ # 指定時間戳格式 -input-raw-buffer-size 32mb \ # 控制用於持有TCP包的系統緩存大小 -prettify-http \ # 自動解碼 Content-Encoding:gzip 和 Transfer-Encoding:chunked的請求和響應 -output-file-append \ # 追加到文件,使得最終只生成一個.gor文件 -output-file requests.gor & # 指定結果文件名稱
這些命令的含義是監聽服務的端口並開始錄制指定的請求類型的請求,例如這里錄制的請求類型是:GET,PSOT,PUT和DELETE。捕獲響應報文並把這些請求追加到文件,像這里生成的文件名叫“requests.gor”。
1.3 在命令執行后,輸出如下:
這里顯示的【1】19436是gor程序的進程PID,在我們錄制完成后可以利用此PID進行終止gor。
1.4 這時gor已經開始進行流量錄制了,此時測試人員可以開始在被測系統進行測試,此段時間的測試發出的請求會被錄制。
測試人員在正式錄制相關的功能之前,建議刷新頁面以請求 self 接口獲取當前用戶信息,這個接口的響應便於之后導入流量文件時解析用例,如果既沒有錄制到 self 接口,也沒有在導入時提供用戶信息獲取接口,則在無法解析請求所屬用戶的情況下,請求生成的用例會被忽略。
1.5 在錄制一段時間的流量后,我們執行以下命令終止gor的錄制輸入一下命令:
sudo kill -15 ${gor進程PID}
像我們這里的輸入sudo kill -15 ${19436}
命令就可以終止gor進程。
1.6 此時,可以看到執行錄制指令的目錄下,得到一份文件名為 requests.gor
的流量文件。到此,錄制完畢。
2.導入流量文件
2.1 我們進入豬齒魚流量回歸測試頁面:
2.2 點擊流量回歸測試右上方的導入流量文件
,進入流量導入界面:
2.3選擇選擇用於放置生成用例的目錄,我們這里選擇的是測試合集目錄,點擊上傳按鈕,上傳我們剛才錄制的requests.gor文件,確定上傳文件后,下方會立刻生成一條文件的導入記錄。
如果導入用例為0條,可能有以下原因:
①錄制期間,被測系統未關閉主鍵加密功能;
②錄制期間,未請求 self 接口獲取用戶信息,且導入時未提供用戶信息獲取接口;
③提供用戶信息獲取接口,但是錄制的流量文件時間過長,超過了用戶的 Token 過期時間,導致流量文件中涉及到的請求的認證信息已經過期了,無法識別用戶,所以無法生成用例;
④所有的請求都不是 json 類型的請求
⑤所有的請求的方法都不是 GET、POST、PUT或DELETE
2.4 待文件導入成功后,所選的目錄下將會生成對應的用例。列表中會展示各個用例對應的路徑、請求方式、菜單、用戶以及請求時間。
- 路徑:即用例中請求的路徑。
- 請求方式:即用例中請求的請求方式。
- 菜單:即用例中對應請求所屬的菜單。
- 用戶:即在錄制過程中,執行此次請求的用戶名。
- 請求時間:即錄制過程中,該請求對應的執行時間。
3.用例批量處理
3.1 由於我們通過導入流量文件得到的用例內,各個請求使用的ID參數在之后的執行過程中會產生變化。因此我們需要通過用例批量處理的功能將用例內各個請求路徑、請求參數、請求體中的ID參數替換為變量。
在此之前,我們還需要選擇一個POST類型的請求,將其響應體中生成的ID作為變量提取出來,以供后續的用例進行引用。
首先在頁面左側的樹結構內選中一個流量回歸集合
,而后點擊頂部的用例批量處理
按鈕,右側會出現批量處理的頁面。
3.2使用搜索欄進行用例篩選,支持的搜索方式有:
- 輸入搜索條件查詢:可搜索任意內容,下方的列表中將會顯示出路徑、請求與響應中含有搜索值的對應用例。
- 快速篩選:預置的快速篩選為
含數值用例
,可直接搜索出路徑、請求與響應中含有數值的所有用例,用於幫助進一步縮小ID查詢范圍。同時,保存的自定義篩選條件也將存放到快速篩選的下拉框中。 - 請求方式篩選:允許篩出GET、POST、PUT與DELETE類型的用例請求。
- 用例狀態篩選:支持篩選出
處理完成
或未處理
狀態的用例請求。 - 正則篩選:支持使用正則表達式來篩選出滿足條件的用例請求。
- 目錄篩選:支持篩選出各個目錄下的用例請求。
- 菜單篩選:支持篩選出對應菜單下的用例請求。
- 具體字段:用於指定搜索值的定位生效區域。支持定位到:路徑、請求頭、請求參數、請求體、響應頭與響應體。
3.3提取頁面中的變量,在此界面中,需要將生成ID的用例請求找到,並將其響應體中的ID參數作為變量提取出來。具體步驟如下:
1.通過搜索欄中的各個選項定位到目標用例。
此處的一般步驟為: - 在快速篩選的搜索欄中選擇
含數值用例
,先篩出所有含有數值的用例。 - 在具體字段中,選擇為:POST,以篩出目標用例。 - 選擇想要處理的功能塊所在的菜單,或在搜索條件中輸入相關內容,來進一步縮小搜索的范圍。 - 最后,在篩出的用例請求中逐一找出目標用例。
2.勾選出一個目標用例,點擊下方的添加變量提取
的按鈕,右側會彈出變量提取的界面。
選擇提取的來源:一般為響應體JSON,此處需根據提取的目標變量的位置與格式而定;支持選擇響應體JSON、響應體XML、響應體文本與響應頭。
輸入變量名稱:此處輸入的變量名稱,會作為后續用例引用的變量。
選擇器:需通過選擇器定位到提取的變量所在的位置。
變量提取成功后,還需要對請求中使用了ID參數的用例進行批量的ID替換,將其替換為提取出的變量。 使用此功能,可以批量地將可以配置的參數提取為變量,例如提取請求中常見的項目ID、租戶ID或者其它的資源ID。
-
值替換功能:
-
選擇替換區域:支持選擇路徑、請求參數、請求頭、請求體、響應頭、響應體;用於定位所有選中的用例需要進行替換的具體區域。
-
輸入源值:即之前的ID參數的准確值。后續會將這個ID數值替換為已經提取出的變量。
-
輸入替換值:在此輸入需要引用的變量即可。
例:之前提取出的變量名稱為id,此處就輸入:${id}
-
-
用例狀態替換:直接在下拉框中選擇需要將所選的用例請求變為的目標狀態;對於已經處理完成的用例請求,直接批量將其置為
處理完成
的狀態即可。回到列表之后,這些用例的狀態就變為了處理完成
。
總結
豬齒魚全場景效能平台流量回歸測試通過GoReplay批量錄制產品界面操作,並將得到的用例進行集中管理,便於后續進行批量的回歸測試,從很大程度上減輕了測試人員編寫腳本、收集測試數據等重復且耗時的工作,提升團隊的測試效能。
參考資料
本文由豬齒魚技術團隊原創,轉載請注明出處