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

介面測試的另一種方式 – 介面測試平臺

文章目錄[顯示]

搭建的初衷

現狀

目前,基於我們組所需要測試的點,很大一部分都是跟介面相關的,不管是我們系統內部的介面還是第三方(外部系統)的介面。部分介面還涉及到對傳輸資料的加密解密處理,那麼,在日常的測試工作中,難免需要開發為我們提供加解密的工具或者我們自己編寫小工具進行測試。隨著介面數量的增多,我們為每一個專案開發的小工具也越來越多,每個小工具的使用方法也不太相同,隱性的增加了一些維護成本和使用成本。其實很多方法都是可以複用的,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|[email protected]!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

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

禁用 / 啟用HOST

禁啟用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檔案,