一改測試步驟程式碼就全寫?為什麼不試試用 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等相關技術,全面提升測試開發工程師的技術實力