1. 程式人生 > >Python:使用ddt過程中遇到的問題及解決方案

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原始碼為(紅色粗體部分為修改的內容):

更改程式碼後再執行,結果如下: