python+jenkins+pytest實現機器學習專案介面自動化測試
背景介紹
演算法機器學習專案程式碼為python實現。
整體實現:通過 http介面接受引數,呼叫dubbo thrift 服務,再呼叫演算法檔案,演算法返回結果給dubbo thrfit,dubbo thrift 返回給http後臺
(dubbo 和thrift 待詳細瞭解)
實現的介面自動化流程
呼叫的為dubbo介面
jenkins配置
1,SVN路徑
2,輪詢SCM
H/10 * * * *
3,拉取的程式碼放置路徑
source files設定
**/**.**,**/**
可以摘取所有檔案。因為模型檔案比較大,拉取會比較慢。這裡沒有設定拉取。
4,構建後操作–構建其他工程
構建測試程式碼工程
遇到的問題:
問題描述:
執行啟動指令碼,jenkins工程構建成功,控制檯輸出也沒有錯誤資訊。但實際thrift服務沒有並啟動。在xshell終端中執行指令碼可以成功。執行停服務指令碼可以成功。
啟動指令碼內容主要為
nohup python -u ${server_file} 18090 >> ${log_dir}/nohup_18090.out 2>&1 &
問題排查:
通過google和不斷嘗試,發現以下情況:
Jenkins不能執行python命令,需要帶上python的全路徑,如 /home/anaconda2/bin/python
Jenkins預設會在構建結束後Kill掉所有的衍生程序
原本想在伺服器上新增python路徑的環境變數,但發現已經有,仍然不能啟動服務。
讀者也可以嘗試下,看看自己的是否會成功。
新增python環境變數方法參考
問題解決:
1,在jenkins中新增環境變數
2,通過更改BUILD_ID達到不被殺程序的目的
OLD_BUILD_ID=$BUILD_ID
BUILD_ID=dontKillMe
export PATH=/home/anaconda2/bin/:$PATH
cd /home/XXXX/
sh stop.sh
sh start.sh
BUILD_ID=$OLD_BUILD_ID
測試指令碼工程配置
使用單元測試框架pytest+python編寫程式碼
主要是使用pytest的引數化@pytest.mark.parametrize("case_name,code, param", data())
case_name 為用例名
code 為斷言使用的響應碼
param 為請求的引數
新建case_data.py的指令碼,編寫測試用例,主要形式內容如下
data()
name1 = ""
code1 = ""
param1 = ""
params = [(name1, code1, param1), (name2, code2, param2)]
return params
也考慮過用excel檔案讀取測試資料,覺得沒有這樣方便。
斷言
演算法返回結果定義為JSON格式,返回內容不固定。比如推薦系統的推薦,無法對內容做斷言。
輸出的內容也不是相對固定的,所為這裡只對響應code碼做斷言。這code碼不是http的響應碼,是演算法工程師和大資料JAVA開發定義的。所以不會像http返回200,實際響應報錯情況。
構建結果
加上–junit-xml=test_result.xml引數,jenkins上可以檢視Test Result 測試結果報告
jenkins安裝釘釘外掛,構建後發訊息到釘釘。釘釘access token,釘釘群中新增群機器人獲取。