Python:使用ddt過程中遇到的問題及解決方案
前言:
在使用DDT資料驅動+HTMLTestRunner輸出測試報告時遇到過2個問題:
1、生成的測試報告中,用例名稱後有dict() -> new empty dictionary
2、使用ddt生成的用例名稱無法更改
1、用例名稱後有dict() -> new empty dictionary
報告中用例名稱後有dict() -> new empty dictionary,如圖所示:
解決方案:這是ddt高版本1.2.0的bug
1、cmd先通過pip uninstall ddt 解除安裝ddt,
2、然後再安裝一個低版本的ddt,命令pip install ddt==1.1.3
安裝後再執行程式,結果如下
2、使用ddt生成的用例名稱無法更改
如上圖所示測試用例名稱都是test_api_index,執行結果無法看出用例執行的是哪條資料,翻閱網上的資料找到一個比較好的方法,講解比較詳細,這段內容來自連結https://www.cnblogs.com/Simple-Small/p/9230382.html
ddt原始碼中有個函式用來生成用例名稱, mk_test_name
它接收兩個引數:name 和 value.
name:為測試用例的名字。即test_api.
value:為測試資料,ddt是處理一組測試資料。而這個value就是這一組資料中的每一個測試資料。
對value的值是有限制的:要麼就是單值變數,要麼就是元組或者列表並且要求元組和列表中的資料都是單值變數。如("name","port") 、["name","port"]
如果傳進來的測試資料,不符合value的要求,那麼測試用例名字為:name_index。
如果傳進來的測試資料,符合value的要求,那麼測試用例名字為:name_index_value。如果value為列表或者元組,那麼將列表/元組的每個資料依次追加在末尾。
比如傳進來的name值為test_login,value值為["name","port"]。那最終的測試用例名字是:test_login_01_name_port。
如果傳進來的name值為test_login,value值為{"userName":"18500384561", "password":"123456"},那最終的測試用例名字為:test_login_1。 因為它不支援對字典型別的資料處理 。
而我的介面自動化框架中,ddt處理的資料是一列表:列表當中每個資料都為字典。ddt一遍歷整個列表,那傳給value的值剛好是字典。。
所以我得到的測試用例名稱就是:test_login_1,test_login_2,test_login_3
為了讓我的測試報告,呈現的更好。那就改改ddt原始碼,讓它能夠適應我的框架。
考慮兩個問題:
1、不同介面的測試用例名字如何來??
2、如何讓ddt支援對字典的處理??
解決方案:
第一個問題:每一個測試用例主動提供一個用例名字,說明你是什麼介面的什麼場景用例。比如:介面名_場景名。login_success、login_noPasswd、login_wrongPasswd等。
在我的框架當中,每一個測試用例是一個字典。那麼我就在字典中新增一個鍵值對,case_name=用例名稱
第二個問題:在ddt中新增對字典的處理,如果字典中有case_name欄位,則將字典中鍵名為case_name的值作為測試用例名稱中的value值。
修改後的ddt原始碼為(紅色粗體部分為修改的內容):
更改程式碼後再執行,結果如下: