1. 程式人生 > >接口測試的另一種方式 – 接口測試平臺

接口測試的另一種方式 – 接口測試平臺

please bst log nginx ont sch 大致 安裝模塊 c-c

接口測試的另一種方式 – 接口測試平臺

文章目錄[顯示]

搭建的初衷

現狀

目前,基於我們組所需要測試的點,很大一部分都是跟接口相關的,不管是我們系統內部的接口還是第三方(外部系統)的接口。部分接口還涉及到對傳輸數據的加密解密處理,那麽,在日常的測試工作中,難免需要開發為我們提供加解密的工具或者我們自己編寫小工具進行測試。隨著接口數量的增多,我們為每一個項目開發的小工具也越來越多,每個小工具的使用方法也不太相同,隱性的增加了一些維護成本和使用成本。其實很多方法都是可以復用的,WEB接口測試的方法也都大致相同,那我們是否可以考慮整合一下,做一個統一的測試平臺呢?

常規接口測試工具

WEB接口測試的方法,通常都是模擬客戶端向服務器發送請求,服務器處理後返回請求結果,然後在檢查返回的結果是否符合預期,檢查返回的數據格式、字段以及異常請求時服務器是否返回異常等等,尤其涉及第三方接口時,需要考慮接口的安全性,是否可以隨意獲取等等。
那常規的接口我們可以使用像Loadrunner、Jmeter、Postman、Fiddler這類性能測試工具或抓包工具來模擬請求,當然熟悉Python或其他開發語言的話,也可以使用類似httpclient、httplib之類的庫自行編寫腳本模擬客戶的請求。

需要解決的痛點

基於我們所測試的接口特點、不涉及加密加簽的接口都可以使用已有的測試工具來模擬客戶端請求來測試、那麽涉及到加密加簽的接口我們就需要自行編寫小工具來進行測試了。
不能使用現成的工具是因為基於我們所測試的接口特點不能滿足我們的測試需求:
1. 數據的加密解密算法不同
2. 數據的加簽驗簽算法不同
3. 簽名的位置,一些要求放在Headers中傳輸,一些要求當做Body參數傳輸
4. 接口請求有時效限制
如果用現成的工具來測試,我們需要單獨生成這些數據後再拼成完整的請求數據,過程會異常麻煩。所以我們需要為不同的項目編寫測試小工具來測試,為了我們編寫的小工具更具備通用性,降低使用和維護成本,讓沒有編碼基礎的測試人員也能輕松完成這類接口的測試工作,方便回歸測試,就有了搭建這麽一個接口測試平臺的想法。

平臺框架圖

技術分享

平臺預覽

登錄、註冊

技術分享
技術分享

個人信息管理

技術分享

設置

技術分享

單接口測試

技術分享

多接口測試配置

技術分享

任務管理

技術分享

測試報告

技術分享
技術分享
技術分享

擴展功能

技術分享
技術分享

部署說明(Linux)

環境準備

測試平臺是基於Python 3.5開發的,所以需要Python 3以上版本,推薦安裝Python 3.5
使用了tornado web開發框架,了解tornado。

安裝需要的模塊

  1. pip install tornado sqlalchemy apscheduler pymysql pycrypto

如果在安裝模塊的過程中還缺少其他模塊,請自行根據提示進行安裝。
另外還使用了前端框架Bootstrap

tornado: web開發框架
sqlalchemy: Python對象關系映射器及強大的數據庫工具,官網
apscheduler: 定時任務框架
pymysql: 純Python實現的Mysql客戶端,Mysqldb的替代品
pycrypto: Python加密工具包

代碼部署

將源碼上傳到服務器的任意位置、基於規範,建議上傳到存放web應用的統一目錄中。

Nginx配置

  1. upstream tornadoes {
  2. server 127.0.0.1:19090;
  3. server 127.0.0.1:19091;
  4. server 127.0.0.1:19092;
  5. server 127.0.0.1:19093;
  6. server 127.0.0.1:19094;
  7. server 127.0.0.1:19095;
  8. server 127.0.0.1:19096;
  9. server 127.0.0.1:19097;
  10. server 127.0.0.1:19098;
  11. server 127.0.0.1:19099;
  12. }
  13. server {
  14. listen 9999;
  15. server_name 172.20.20.86;
  16. access_log off;
  17. index index.html index.htm index.py;
  18. root /opt/APITest_platform;
  19. location / {
  20. proxy_pass http://tornadoes;
  21. include public_config/proxy.conf;
  22. }
  23. location /static/ {
  24. root /opt/APITest_platform/static;
  25. if ($query_string) {
  26. expires max;
  27. }
  28. }
  29. location ~ .*\.(gif|jpg|jpeg.png@!medium|bmp|swf|flv|ico|eot|ttf|svg|woff|woff2)$ {
  30. expires 30d;
  31. access_log off;
  32. }
  33. location ~ .*\.(js|css)?$ {
  34. expires 7d;
  35. access_log off;
  36. }
  37. }

啟停腳本

  1. #!/bin/bash
  2. # tornado服務啟停腳本
  3. function startservice(){
  4. for i in 19090 19091 19092 19093 19094 19095 19096 19097 19098 19099
  5. do
  6. if [ $i -eq 19090 ];then
  7. nohup python3 /opt/APITest_platform/app.py --port=$i --monitor=on --log_file_prefix=/opt/APITest_platform/log/apitest-$i.log > /dev/null 2> &1 &
  8. else
  9. nohup python3 /opt/APITest_platform/app.py --port=$i --log_file_prefix=/opt/APITest_platform/log/apitest-$i.log > /dev/null 2> &1 &
  10. fi
  11. echo"started port $i‘s service"
  12. done
  13. }
  14. function stopservice(){
  15. for i in 19090 19091 19092 19093 19094 19095 19096 19097 19098 19099
  16. do
  17. kill -9`ps aux | grep "port=$i" | grep -v "grep" | awk ‘NR==1 {printf $2}‘`
  18. echo"stoped port $i‘s service"
  19. done
  20. }
  21. if [ "$1" = "start" ];then
  22. startservice
  23. elif [ "$1" = "stop" ];then
  24. stopservice
  25. elif [ "$1" = "restart" ];then
  26. stopservice
  27. startservice
  28. else
  29. echo"Please input like this:\"$0 start [stop | restart]\""
  30. fi

啟動命令說明

app.py是系統入口文件,啟動參數有三個
–port=9999 啟動端口
–monitor=on 啟動時同時啟動定時任務監控
–log_file_prefix=log_file_path 系統日誌輸出到指定文件
如:

  1. $python app.py --port=9999 --monitor=off

使用說明

註冊、登錄

技術分享

建議使用公司郵箱註冊,密碼在數據庫中已加密存儲。

技術分享

使用註冊的郵箱登錄

個人信息管理

技術分享

修改用戶名後,可以使用郵箱或用戶名登錄

技術分享

設置

項目管理

新增項目

技術分享

禁用項目

技術分享

禁用項目後,在所有跟項目相關聯的配置中,該項目不可選

刪除項目

技術分享

在刪除項目之前,需要刪除跟該項目所有相關聯的配置

成員管理

技術分享

配置可訪問該項目的普通用戶,管理員可見所有的項目,測試報告的郵件發送將基於項目成員用戶發送。

配置自定義參數

技術分享

項目參數配置,主要配置項目中有特殊需求的情況,比如需要加簽、需要添加、驗證特殊字段、從數據庫獲取特定值等情況

配置自定義方法

技術分享
在配置自定義參數時,Function類型的參數,需要根據項目需求配置自定義方法,具體步驟如下:
1. 進入源碼中的encryption目錄
技術分享
2. 打開customfunc.py文件
技術分享
3. 在customfunc.py文件末尾添加新增的方法
技術分享

自定義方法必須有三個固定的參數,body、params和encrypt
body:請求Body,以字典格式傳入,如果轉成字典失敗會原樣傳入,使用前最好進行類型判斷。
params:已配置的項目自定義參數,以元素為字典的列表格式傳入。
encrypt:項目相關的加密配置信息,以字典格式傳入,沒有傳入值為None。

技術分享
4. 打開config.py文件
技術分享
5. 找到自定義方法配置所在位置,新增一行配置
技術分享

自定義方法配置是元素為字典的列表
新增一個列表元素,格式為:{‘name’: ‘sign_test’, ‘function’: sign_test, ‘comment’: ”}
name:選擇時顯示的方法名
function:該方法的處理函數名,即在customfunc.py文件中新增的方法名(不帶括號引用)
comment:備註,在配置中選擇自定義方法時,會給出提示方便識別。

6. 重啟服務
技術分享

Host配置

Host配置用於通過切換域名指向不同的ip地址來達到測試不同測試環境的目的。

新增HOST

技術分享

選擇應用於所有項目,添加時將為所有項目配置Host
選擇單個項目,添加時只為該項目配置Host

刪除HOST

技術分享

刪除host配置後,將使用系統所部署服務器的host配置,如果沒有則使用DNS解析結果。

禁用 / 啟用HOST

技術分享

禁用host配置後,將使用系統所部署服務器的host配置,如果沒有則使用DNS解析結果。
按鈕為紅色,顯示為禁用時,該配置是已生效狀態

接口配置

新增接口

技術分享

刪除接口

技術分享

接口完整性檢查配置

技術分享

接口完整性檢查配置,用於檢查接口返回值參數是否符合需求,比如字段是否完整,字段值是否為空等等
1. 只能檢查返回值是json格式的接口
2. 目前只檢查了字段是否完整和字段值是否為空,後續增加對字段類型的檢查
** 配置格式說明: **
檢查第一層Key值,一行配置一個,需要檢查子層時,在第一層的基礎上用 .[] 連接子層需要檢查的Key值,如果某個字段的值為列表,用.N取列表值,key=0[非必填] | key=1[必填],如:
id=1
code.[code=1,id=1,msg=0]
rows.[0].[code=1,id=1,msg=0]
result.rows.[code=1,id=1,msg=0]

接口默認請求HEADERS配置

在配置接口測試參數時,選擇該接口將默認為headers字段填充配置的值

接口默認請求BODY配置

在配置接口測試參數時,選擇該接口將默認為body字段填充配置的值

加解密配置

新增配置

技術分享

  1. 加解密算法配置必須選擇一個項目進行關聯
  2. 加密算法和解密算法是成對配置的
  3. 目前已經配置了三類加密算法,分別是AES、DES、DES3。
  4. 三類加密算法分別有ECB和CBC模式,經過base64、urlencode編碼之後,組合了14中方法,如果沒有所需的,可以另外配置
刪除配置

技術分享

新增加解密處理方法

新增加解密方法的步驟跟新增自定義方法的過程類似

1. 進入encryption目錄
技術分享
2. 如果需要添加的加解密方法不在系統預設的AES、DES、DES3三大類中,可以在encryption目錄中新建一個加密類文件
技術分享
3. 打開function.py文件,參考該文件中的方法在文件末尾新增處理方法。
技術分享
技術分享

方法必須包含四個傳入參數:
string:待加密或解密的字符串
key:加密或解密KEY
iv:加密或解密IV
mode:加密或解密模式
返回處理後的結果

4. 打開config.py文件,配置加解密方法
技術分享
技術分享

找到加解密配置所在位置
加解密配置是元素為字典的列表
新增一個列表元素,格式為:{‘name’: ‘DES3(CBC)_TO_base64_URLEncode’, ‘function’: des3_encode_to_b64_url_encode, ‘mode’: ‘CBC’, ‘comment’: ‘DES3加密並進行base64編碼後再URLEncode, CBC模式’}
name:選擇時顯示的方法名
function:該加解密方法的處理函數名,即在function.py文件中新增的方法名
mode:加密或解密模式
comment:備註,在配置中選擇加解密方法時,會給出提示方便識別。
加密和解密的配置格式相同,可參考已有的配置

5. 保存配置後重啟服務
技術分享

單接口測試

技術分享
技術分享

Headers配置格式為 key: value 形式,也可以是字典格式{“key”: “value”},字典格式必須在一行,不能換行。
Body配置的格式可以為任何形式,取決於Headers中Content-Type的類型,如果Content-Type類型是application/json,Body必須是json格式字符串,如果Content-Type類型是application/x-www-form-urlencoded,Body可以是字典格式的字符串,或者以Key=value的形式配置,一組參數獨占一行,當然,可以直接以URLEncode後的形式配置,比如:key1=value1&key2=value2&key3=value3
Body加密配置,能夠加密的前提是Headers中Content-Type的類型為application/json或application/x-www-form-urlencoded。目前只能加密第一層數據,如果不指定加密的字段,將加密所有內容。
解密字段配置,接口返回數據必須是json格式字符串,只能解密第一層數據。
重定向跟隨選項,如果接口返回301或者302,勾選將自動跟隨請求重定向後的鏈接,不勾選將直接返回響應結果。
僅生成請求數據選項,勾選將只生成請求Body數據,不發起接口請求,需要手工測試時可輔助生成請求數據。

批量接口測試配置

新增測試接口

技術分享
技術分享

檢查點配置,配置此項將搜索接口返回值中是否包含配置的關鍵詞。
關聯配置,配置此項用於獲取接口返回值中的特定值,要求接口返回值必須是json格式字符串,配置格式跟接口完整性檢查的配置類似,例如:
{page_id}=data.page_id 表示取返回值中key為data下的字典key為page_id的值
{page_id}=data.[1].page_id 表示取返回值中key為data,data的值是一個元素為字典的列表,取列表中第二個元素,字典key為page_id的值。
有兩個系統關聯參數
{cookie}=response_cookie 獲取cookie值
{response_body}=response_body 獲取完整響應body值
關聯參數支持int和float類型轉換
{id}=int(data.id) 表示將獲取到的值轉換為int類型
{total}=float(data.[0].total) 表示將獲取到的值轉換為float類型
備註,是對該接口測試的一些描述說明。

選擇測試接口

技術分享

配置完測試接口後,可以隨意組合接口進行測試,勾選要測試的接口,測試時會按接口的排序先後進行測試,如果需要調整接口順序,可點擊【操作】列中的【上移】按鈕進行調整。

立即執行任務

勾選完需要測試的接口後,點擊【立即執行】按鈕,將立即執行測試任務。在執行前,可給任務取一個任務名稱。

預約執行任務

勾選完需要測試的接口後,配置好定時時間,執行周期,點擊【預約執行】按鈕,將會保存此任務,到預約的時間點後自動執行。在執行前,可給任務取一個任務名稱。

擴展功能

加密調試

技術分享
技術分享

解密調試

技術分享
技術分享

系統預定義參數

{random_mobile} 隨機手機號
{random_email} 隨機email
{timestamp} 時間戳
{datetime} 當前時間, 格式: %Y-%m-%d %H:%M:%S
{datetime_int} 當前時間, 格式: %Y%m%d%H%M%S
{date} 當前日期, 格式: %Y-%m-%d
{date_int} 當前日期, 格式: %Y%m%d

系統關聯參數

{cookie}=response_cookie 獲取cookie
{response_body}=response_body 獲取完整響應body

本站采用BY-NC-SA協議進行授權, 如未特別說明, 均為原創
本文轉載來自貝克街的捉蟲師: 接口測試的另一種方

接口測試的另一種方式 – 接口測試平臺