unittestreport 數(shù)據(jù)驅(qū)動 (DDT) 的實現(xiàn)源碼解析

前言

在做自動化過程中,通過數(shù)據(jù)驅(qū)動主要是為了將用例數(shù)據(jù)和用例邏輯進(jìn)行分離,提高代碼的重用率以及方便用例后期的維護(hù)管理。
很多小伙伴在使用 unittest 做自動化測試的時候,都是用的 ddt 這個模塊來實現(xiàn)數(shù)據(jù)驅(qū)動的。也有部分小伙伴對 ddt 內(nèi)部實現(xiàn)的源碼比較感興趣,前段時間小編在開發(fā) unttestreport 的時候也寫了一版數(shù)據(jù)驅(qū)動,使用的入口和 ddt 差不多,今天就給大家分析一下 unittestreport 中數(shù)據(jù)驅(qū)動(ddt),源碼實現(xiàn)的過程!

在給大家分析源碼之前先給大家講解一下 unittestreport 中的 ddt 如何使用!unittestreport.dataDriver 模塊中實現(xiàn)了三個使用方法,支持使用列表(可迭代對象)、JSON 文件、YAML 文件來生成測試用例,這邊給大家介紹一下使用方法:
1、模塊導(dǎo)入

2、使用案例
第一步:使用 ddt 裝飾測試用例類
第二步:根據(jù)使用的數(shù)據(jù)選擇對應(yīng)的方法進(jìn)行驅(qū)動

第三步:運(yùn)行上面用例文件,就會發(fā)現(xiàn)執(zhí)行了三條測試用例

在上面的使用案例中我們使用了一個 ddt 的裝飾器去裝飾測試用例類,一個 list_data 的裝飾器去裝飾測試用例方法。
1、ddt
在上面的用例類前面我們用了一個@ddt 這行代碼的作用到底是什么呢?

我們來看一下 ddt 里面的源碼

從上面的源碼我們可以看出來,把測試類當(dāng)成參數(shù)傳入 data 之后,在內(nèi)部做了一系列操作之后將測試類返回了出來。這一系列操作其實就是根據(jù)測試用例數(shù)據(jù),創(chuàng)建測試用例方法添加到測試類中,代碼中重要步驟如下圖描述所示。

對于上面遍歷,判斷方法是否擁有 PARAMS 屬性,這個 PARAMA 屬性是怎么來的呢?PARAMA 屬性是@list_data(cases)的時候添加的,接下來我們來看一下 list_data 的源碼
2、list_data
上面案例中@list_data(cases)這行代碼的作用等同于 test_case = list_data(cases)(test_case),我們來看一下源碼。

通過源碼我們可以發(fā)現(xiàn)執(zhí)行@list_data(cases)的時候只做了一件事情,就是給測試用例方法添加了一個 PARAMS 屬性。

通過上面的源碼分析,我們來簡單的講一下,關(guān)于 ddt 實現(xiàn)的具體流程。

在 ddt 這個函數(shù)中我們調(diào)用了?_create_test_name?和?_update_func?這兩個內(nèi)部方法,那么這兩個內(nèi)部方法中分別做了什么事情呢?接下來分別來看一下

可以看到該方法會根據(jù)傳進(jìn)來的 index(用例數(shù)據(jù)的索引)和原用例名進(jìn)行拼接,生成一個新的用例方法名。

從上面的代碼可以看到,這個函數(shù)內(nèi)部重寫定義了一個函數(shù),將原來的函數(shù)保存為了這個函數(shù)對象的屬性,并設(shè)置了函數(shù)名,以及函數(shù)相關(guān)的文檔字符串,最后將函數(shù)返回了。函數(shù)內(nèi)部調(diào)研的還是原來的函數(shù)(測試用例方法)。

1、將所有的測試用例數(shù)據(jù)保存為測試方法的 PARAMS 屬性。
2、遍歷測試類的所有屬性和方法。
3、判斷遍歷出來的屬性或者方法是否擁有 PARAMS 屬性。
4、如果擁有 PARAMS 屬性,那么就遍歷 PARAMS 中的測試數(shù)據(jù)。
5、每遍歷出來一條數(shù)據(jù),就創(chuàng)建一個測試方法,并將測試方法添加為測試類的類屬性。
關(guān)于數(shù)據(jù)驅(qū)動實現(xiàn)的源碼就給大家介紹到這里了,另附 unittestreport 模塊詳細(xì)的使用文檔,里面有關(guān)于更多的 uniitestreport 擴(kuò)展使用功能哦。有興趣的小伙伴可以去看一下:unittestreport 詳細(xì)功能使用文檔(V1.1.1)
說明:本文為檸檬班木森老師原創(chuàng),轉(zhuǎn)載需注明出處!