****************************************************************************
本文主要介紹借助自動化框架實現-短文本相似度模型測試
1.測試需求分析
2.測試環境准備
3.測試數據准備
4.測試分析與執行
5.測試問題總結
****************************************************************************
一、測試需求
1)原始需求:測試短文本相似度接口能力是否符合指定的模型效果
2)理解需求:驗證接口的功能、模型評估、性能是否符合需求文檔
3)需求思考:短文本相似度是判定2個文本在語義上是否相似,目前使用場景包含信息檢索圖片、視頻、文本等、新聞推薦、智能客服等,本次測試的應用場景是? 研發回答:沒有指定場景(這是一個坑!!!)
二、測試環境准備
本次測試接口能力均已封裝為鏡像文件,所以直接拉取鏡像啟動即可!
1) 啟動能力鏡像:
CPU版本:
docker run -d -p 5000:5000 -v /dep_pic/wwq/data/TextSimilarity:/home/TextSimilarity/Data text_similarity_cpu:v1
GPU版本:
docker run -d --gpus "device=1"(顯卡號) -p 5000:5000 -v /dep_pic/wwq/data/TextSimilarity:/home/TextSimilarity/Data text_similarity_gpu:v1
2) 代碼運行日志在映射目錄下Log文件夾中startup.log文件中,查看日志命令為cat startup.log,如下則服務已成功啟動:
三、測試數據准備
1)數據分析:需求分析階段了解到模型並沒有指定使用場景,且模型訓練依賴主要CMNLI語料庫,通過分析CMNLI語料庫場景比較單一,經測試建議增加LCQMC語料庫,豐富模型使用場景,使模型效果更理想!
2)語料庫數據展示
四、測試分析與執行
1)測試方法分析:功能測試利用Postman工具(不講),模型評估測試利用公司自動化接口框架實現,性能測試利用JMeter工具(不講)
2)模型評估測試執行
A、獲取評估指標預期值:模型評估包含那些指標,通常會在需求文檔里面體現出,代表算法工程師自測的結果,如
B、獲取評估指標數據量級與數據分布情況:算法工程師通常有2個數據集,訓練集與測試集,如本次測試算法工程師訓練集在十幾萬數據,相似與不相似數據分布比例是1:2,所以我的測試數據設計為:相似1000條,不相似2000條
C、執行模型評估測試,本次測試利用公司自動化接口框架,具體框架的架構、涉及技術不是本次重點,本次重點說一下模型評估自動化的實現方法,以往模型評估過程都需要測試人員整合測試結果,然后手工統計出指標值,結果准確性無法保證耗時也比較久。話不多說,直接上代碼:
AItool工具類:利用sklearn模塊evaluate函數,直接輸出模型指標值,如准確率、精確率、召回率、F1 score
sklearn詳細用法參考博客:https://blog.csdn.net/hfutdog/article/details/88085878
def evaluate(y_true, y_pred): Precision_Statistics = { 'precsion': { 'micro': precision_score(y_true, y_pred, average="micro"), 'macro': precision_score(y_true, y_pred, average="macro"), 'weighted': precision_score(y_true, y_pred, average="weighted")}, 'recall': { 'micro': recall_score(y_true, y_pred, average="micro"), 'macro': recall_score(y_true, y_pred, average="macro"), 'weighted': recall_score(y_true, y_pred, average="weighted") }, 'f1': { 'micro': f1_score(y_true, y_pred, average="micro"), 'macro': f1_score(y_true, y_pred, average="macro"), 'weighted': f1_score(y_true, y_pred, average="weighted"), } } return Precision_Statistics def evaluate1(y_true, y_pred): Precision_Statistics = { 'precsion': { 'precsion': precision_score(y_true, y_pred) }, 'recall': { 'recall': recall_score(y_true, y_pred) }, 'f1': { 'f1': f1_score(y_true, y_pred) } } return Precision_Statistics def appendlist1(label): label_list1.append(label) def appendlist2(label): label_list2.append(label)
testCase用例實現:收集預期結果與接口返回結果,追加到列表: AItool.appendlist1(label)、 AItool.appendlist2(isDataYes)
# 請求目標接口
(res,headers) = shortTextSimilartiy().getAuthoritys(jsons=data, header={"Content-Type": "application/json"}) logger.info(headers) isSuccess = headers['X-EBAPI-CODE'] isSuccess1 = headers['X-EBAPI-DESC'] result1 = Checkpoint().checkIfTextExist(isSuccess, "0000") self.assertEqual(result1, True) # 根據result字段判斷接口是否請求成功 如果請求成功繼續往下校驗是否為預期的相似度
result2 = Checkpoint().checkIfTextExist(isSuccess1, "success") self.assertEqual(result2, True) # 根據result字段判斷接口是否請求成功 如果請求成功繼續往下校驗是否為預期的相似度
try: isDataYes = res["content"][0]["data"] except Exception: logger.info('獲取被測接口的響應label失敗') raise KeyError result3 = Checkpoint().checkIfTextExist(isDataYes, label) if label == 'yes': label = 1
else: label = 0 if isDataYes == 'yes': isDataYes = 1
else: isDataYes = 0
# 追加預期數據與返回數據 AItool.appendlist1(label) AItool.appendlist2(isDataYes) self.assertEqual(result3, True) # 根據返回是否相似 與預期值對比
if label == 'yes': # 如果label等於yes 則判斷返回值中的相似度是否大於等於0.5(0.5這個閾值可調)
result2 = res["content"][1]["data"] >= 0.5 self.assertEqual(result2, True) elif label == 'no': # 如果label等於no 則判斷返回值中的相似度是否小於0.5(0.5這個閾值可調)
result2 = res["content"][1]["data"] < 0.5 self.assertEqual(result2, True)
report輸出報告:報告中調用工具類evaluate1函數,輸出模型評估結果
1 def getReportAttributes(self, result): 2 """
3 Return report attributes as a list of (name, value). 4 Override this to add custom attributes. 5 """
6 startTime = str(self.startTime)[:19] 7 duration = str(self.stopTime - self.startTime) 8 status = [] 9 #Accuracy = AItool.evaluate(AItool.label_list1, AItool.label_list2)
10 # 輸出模型評估指標值
11 Accuracy = AItool.evaluate1(AItool.label_list1,AItool.label_list2) 12 status.append('總計: %s' % (result.success_count + result.failure_count + result.error_count)) 13 if result.success_count: status.append('通過: %s' % result.success_count) 14 if result.failure_count: status.append('失敗: %s' % result.failure_count) 15 if result.error_count: status.append('錯誤: %s' % result.error_count) 16 if status: 17 status = ','.join(status) 18 # 合入Github:boafantasy代碼
19 if (result.success_count + result.failure_count + result.error_count) > 0: 20 self.passrate = str("%.2f%%" % (float(result.success_count) / float( 21 result.success_count + result.failure_count + result.error_count) * 100)) 22 else: 23 self.passrate = "0.00 %"
24 else: 25 status = 'none'
26 return [ 27 (u'測試人員', self.tester), 28 (u'開始時間', startTime), 29 (u'合計耗時', duration), 30 (u'測試結果', status + ",通過率: " + self.passrate), 31 (u'統計數據', ''), 32 # (u'precsion', 'micro=' + str(Accuracy['precsion']['micro']) + ', macro = ' + str(
33 # Accuracy['precsion']['micro']) + ' , weighted = ' + str(
34 # Accuracy['precsion']['weighted'])),
35 # (u'recall', 'micro=' + str(Accuracy['recall']['micro']) + ', macro = ' + str(
36 # Accuracy['recall']['micro']) + ' , weighted = ' + str(
37 # Accuracy['recall']['weighted'])),
38 # (u'f1', 'micro=' + str(Accuracy['f1']['micro']) + ', macro = ' + str(
39 # Accuracy['f1']['micro']) + ' , weighted = ' + str(
40 # Accuracy['f1']['weighted']))
41 (u'precsion','precsion='+str(Accuracy['precsion']['precsion'])), 42 (u'recall','recall='+str(Accuracy['recall']['recall'])), 43 (u'f1','f1='+str(Accuracy['f1']['f1'])) 44
45 ]
report結果展示:
測試報告中結果展示:
五、測試問題總結
1)LCQMC語料庫獲取,模型測試數據獲取都是靠運氣,一般可通過官方網站進行申請(時間比較久,還需要額外審核),自己百度找,需要這份數據集的小伙伴請評論留言!
2)本次模型評估測試采用自動化框架,如果有一定python技術的同學,我建議采用這種方式,首先能夠解放雙手,其次可以縮短測試時間,盡管前期需要投入開發時間,但是一勞永逸,想探討接口自動化框架的小伙伴請評論留言!