1. 程式人生 > 其它 >一改測試步驟程式碼就全寫?為什麼不試試用 Yaml實現資料驅動?

一改測試步驟程式碼就全寫?為什麼不試試用 Yaml實現資料驅動?

理念與同“UI自動化測試框架”中的“測試步驟的資料驅動”相同,介面中的測試步驟的資料驅動就是將介面的引數(比如 method、url、param等)封裝到
yaml 檔案中管理。當測試步驟發生改變,只需要修改 yaml 檔案中的配置即可。

** 測試資料的資料驅動**

資料驅動就是資料的改變從而驅動自動化測試的執行,最終引起測試結果的改變。簡單來說,就是引數化的應用。資料量小的測試用例可以使用程式碼的引數化來實現資料驅動,資料量大的情況下建議使用一種結構化的檔案(例如yaml,json等)來對資料進行儲存,然後在測試用例中讀取這些資料。

引數化實現資料驅動

原理與前面章節“UI自動化測試框架”中的“測試資料的資料驅動”大同小異。依然使用 @pytest.mark.parametrize
裝飾器來進行引數化,使用引數化來實現資料驅動。

通過引數化的方式,分別判斷id為2,3的部門的parentid為1:


import pytest  
class TestDepartment:    department = Department()  
    @pytest.mark.parametrize("id", [2, 3])    def test_department_list(self, id):        r = self.department.list(id)        assert self.department.jsonpath(expr="$..parentid")[0] == 1

上面的程式碼首先使用 @pytest.mark.parametrize 裝飾器,傳遞了兩組資料,測試結果顯示有兩條測試用例被執行,而不是一條測試用例。也就是
pytest 會將兩組測試資料自動生成兩個對應的測試用例並執行,生成兩條測試結果。

使用 Yaml 檔案實現資料驅動

當測試資料量大的情況下,可以考慮把資料儲存在結構化的檔案中。從檔案中讀取出程式碼中所需要格式的資料,傳遞到測試用例中執行。本次實戰以YAML進行演示。YAML以使用動態欄位進行結構化,它以資料為中心,比
excel、csv、Json、XML 等更適合做資料驅動。

將上面引數化的兩組資料儲存到 yaml 檔案中,建立一個data/department_list.yml檔案,程式碼如下:

-2-3

上面的程式碼定義了一個 yaml
格式的資料檔案department_list.yml,檔案中定義了一個列表,列表中有兩個資料,最後生成的是這樣的資料格式:[1,2]。將測試用例中引數化的資料改造成從
department_list.yml 檔案中讀取,程式碼如下:


class TestDepartment:    department = Department()  
    @pytest.mark.parametrize("id", \    yaml.safe_load(open("../data/department_list.yml")))    def test_department_list(self, id):        r = self.department.list(id)        assert self.department.jsonpath(expr="$..parentid")[0] == 1

上面的程式碼,只需要使用yaml.safe_load()方法,讀取department_list.yml檔案中的資料,分別傳入到用例
test_department_list() 方法中完成輸入與結果的驗證。

** 配置資料驅動**

實際工作中,對於環境的切換和配置,為了便於維護,通常不會使用硬編碼的形式完成。在“多環境下的介面測試”章節中已經介紹了,如何將環境的切換作為一個可配置的選項。本章節會把這部分內容進行重構,使用資料驅動的方式完成多環境的配置。

環境準備

根據“多環境下的介面測試”章節,將此章節中的環境配置部分改為資料驅動的模式

程式碼如下:


#把host修改為ip,並附加host headerenv={    "docker.testing-studio.com": {        "dev": "127.0.0.1",        "test": "1.1.1.2"    },    "default": "dev"}data["url"]=str(data["url"]).replace(    "docker.testing-studio.com",    env["docker.testing-studio.com"][env["default"]])data["headers"]["Host"]="docker.testing-studio.com"

** 實戰演示**

依然以yaml為示例,將所有的環境配置資訊放到 env.yml
檔案中。如果怕出錯,可以先使用yaml.safe_dump(env)將dict格式的程式碼轉換為yaml。

如下所示,打印出來的,就是成功轉換yaml格式的配置資訊:


def test_send(self):    env={        "docker.testing-studio.com": {            "dev": "127.0.0.1",            "test": "1.1.1.2"        },        "default": "dev"    }    yaml2 = yaml.safe_dump(env)    print("")    print(yaml2)

將打印出來的內容貼上到 env.yml 檔案中: env.yml


docker.testing-studio.com:  dev: "127.0.0.1"  test: "1.1.1.2"  level: 4default:  "dev"

將環境準備中的程式碼稍作修改,把env變數從一個典型dict改為,使用yaml.safe_load讀取 env.yml:


# 把host修改為ip,並附加host headerenv = yaml.safe_load(open("./env.yml"))data["url"] = str(data["url"]).\    replace("docker.testing-studio.com",    env["docker.testing-studio.com"][env["default"]])data["headers"]["Host"] = "docker.testing-studio.com"

如此一來,就可以實現使用資料驅動的方式,通過修改 env.yml 檔案來直接修改配置資訊。

** _
來霍格沃茲測試開發學社,學習更多軟體測試與測試開發的進階技術,知識點涵蓋web自動化測試 app自動化測試、介面自動化測試、測試框架、效能測試、安全測試、持續整合/持續交付/DevOps,測試左移、測試右移、精準測試、測試平臺開發、測試管理等內容,課程技術涵蓋bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相關技術,全面提升測試開發工程師的技術實力

點選獲取更多資訊