在unittest測試用例中,在含有多個斷言時,一個斷言失敗后,測試用例會結束運行,無法知道其他斷言是否成功。unittest不同與pytest,在pytest中,
可以使用pytest.assume(表達式),檢查點失敗繼續運行,所以為了解決unittest的這個弊端,本文解決方式:
1)把多個斷言合成一個斷言,判斷多個斷言的綜合結果是True還是False
2)判斷每個斷言結果,失敗則匯總,在最終斷言中輸出
之前多斷言代碼:
def checkCMSTab(self, tabLabelInfo, tabName):
self.assertNotEqual(len(tabLabelInfo[0][0]) + len(tabLabelInfo[1]), 0,
'導航2N樓層的{}tab下數據異常:tab數據為空'.format(tabName))
self.assertNotEqual(len(tabLabelInfo[0][0]), 0,
'導航2N樓層的{}tab下數據異常:無商品數據'.format(tabName))
self.assertEqual(len(unsaleWareInfoList), 0, '{tabName}tab下存在已售罄商品,具體信息為{unsaleWareInfos}'.format(
tabName=tabName,
unsaleWareInfos=unsaleWareInfos))
self.assertEqual(len(offlineWareInfoList), 0, '{tabName}tab下存在已下架商品,具體信息為{offlineWareInfoList}'.format(
tabName=tabName,
offlineWareInfoList=offlineWareInfoList))
# 驗證tab下圖片坑位是否無跳轉鏈接
self.assertEqual(len(pictureEroorList), 0, "{tabName}下圖片坑位無跳轉鏈接,具體信息為{pictureEroorInfos}".format(tabName=tabName,
pictureEroorInfos=pictureEroorInfos))
優化后代碼如下:
def checkCMSTab(self, tabLabelInfo, tabName):
# 解決unittest中斷言失敗,后續的斷言都不執行的問題
res = True
msg = []
res = res and (len(tabLabelInfo[0][0]) + len(tabLabelInfo[1]) > 0) # 驗證tab下商品+圖片數據為空
res = res and (len(tabLabelInfo[0][0]) > 0) # 驗證tab下商品為空
res = res and (len(unsaleWareInfoList) == 0) # tab下是否存在已售罄
res = res and (len(offlineWareInfoList) == 0) # tab下是否存在已下架
res = res and (len(pictureEroorList) == 0) # 驗證tab下圖片坑位是否無跳轉鏈
if len(tabLabelInfo[0][0]) + len(tabLabelInfo[1]) == 0:
msg.append('導航2N樓層的{}tab下數據異常:tab數據為空'.format(tabName))
if len(tabLabelInfo[0][0]) == 0:
msg.append('導航2N樓層的{}tab下數據異常:無商品數據'.format(tabName))
if len(unsaleWareInfoList) > 0:
msg.append('{tabName}tab下存在已售罄商品,具體信息為{unsaleWareInfos}'.format(tabName=tabName,
unsaleWareInfos=unsaleWareInfos))
if len(offlineWareInfoList) > 0:
msg.append('{tabName}tab下存在已下架商品,具體信息為{offlineWareInfoList}'.format(tabName=tabName,
offlineWareInfoList=offlineWareInfoList))
if len(pictureEroorList) > 0:
msg.append("{tabName}下圖片坑位無跳轉鏈接,具體信息為{pictureEroorInfos}".format(tabName=tabName,
pictureEroorInfos=pictureEroorInfos))
self.assertEqual(res, "\n".join(msg))
此種方式在用例設計中相對實現起來會比較麻煩,為斷言優化初級版;可參考下一篇文章《解決unittest斷言失敗,后續的斷言不執行進階之重新封裝斷言》,重新封裝unittest斷言,
碼字不易,如有轉載請注明出處,感謝~