UI 自動(dòng)化測(cè)試實(shí)戰(zhàn)(二)| 測(cè)試數(shù)據(jù)的數(shù)據(jù)驅(qū)動(dòng)
數(shù)據(jù)驅(qū)動(dòng)就是通過(guò)數(shù)據(jù)的改變驅(qū)動(dòng)自動(dòng)化測(cè)試的執(zhí)行,最終引起測(cè)試結(jié)果的改變。簡(jiǎn)單來(lái)說(shuō),就是參數(shù)化在自動(dòng)化測(cè)試中的應(yīng)用。
測(cè)試過(guò)程中使用數(shù)據(jù)驅(qū)動(dòng)的優(yōu)勢(shì)主要體現(xiàn)在以下幾點(diǎn):
1.提高代碼復(fù)用率,相同的測(cè)試邏輯只需編寫(xiě)一條測(cè)試用例,就可以被多條測(cè)試數(shù)據(jù)復(fù)用,提高了測(cè)試代碼的復(fù)用率,同時(shí)提高了測(cè)試代碼的編寫(xiě)效率。
2.異常排查效率高,測(cè)試框架依據(jù)測(cè)試數(shù)據(jù),每條數(shù)據(jù)生成一條測(cè)試用例,用例執(zhí)行過(guò)程相互隔離。如果其中一條失敗,不會(huì)影響其他的測(cè)試用例。
3.代碼可維護(hù)性高,清晰的測(cè)試框架利于其他測(cè)試工程師閱讀,提高代碼的可維護(hù)性。
數(shù)據(jù)量小的測(cè)試用例可以使用代碼的參數(shù)化來(lái)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng),數(shù)據(jù)量大的情況下建議大家使用一種結(jié)構(gòu)化的文件(例如 YAML,JSON 等)來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),然后在測(cè)試用例中讀取這些數(shù)據(jù)。
Pytest 提供了@pytest.mark.parametrize裝飾器來(lái)進(jìn)行參數(shù)化,可以使用參數(shù)化來(lái)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)。代碼如下:
上面的代碼首先使用@pytest.mark.parametrize裝飾器,傳遞了兩組數(shù)據(jù),測(cè)試結(jié)果顯示有兩條測(cè)試用例被執(zhí)行,而不是一條測(cè)試用例。也就是 Pytest 會(huì)將兩組測(cè)試數(shù)據(jù)自動(dòng)生成兩個(gè)對(duì)應(yīng)的測(cè)試用例并執(zhí)行,生成兩條測(cè)試結(jié)果。
當(dāng)測(cè)試數(shù)據(jù)量大的情況下,可以考慮把數(shù)據(jù)存儲(chǔ)在結(jié)構(gòu)化的文件中。從文件中讀取出代碼中所需要格式的數(shù)據(jù),傳遞到測(cè)試方法中執(zhí)行。這里推薦大家使用 YAML 類型的文件來(lái)存儲(chǔ)測(cè)試數(shù)據(jù)。YAML 使用動(dòng)態(tài)字段進(jìn)行結(jié)構(gòu)化,它以數(shù)據(jù)為中心,比 Excel、CSV、JSON、XML 等更適合做數(shù)據(jù)驅(qū)動(dòng)。
下面,我們將上面參數(shù)化的兩組數(shù)據(jù)存儲(chǔ)到 YAML 文件中,創(chuàng)建一個(gè) data/searchdata.yml 文件,代碼如下:
上面的代碼定義了一個(gè) yaml 格式的數(shù)據(jù)文件 searchdata.yml ,文件中定義了一個(gè)列表,列表中有兩組數(shù)據(jù),最后生成的是這樣的數(shù)據(jù)格式:[[“alibaba”, “BABA”, 200],[“JD”, “JD”, 20]] 。
下一步將測(cè)試用例中參數(shù)化的數(shù)據(jù)改造成從 searchdata.yml 文件中讀取,代碼如下:
上面的代碼,只需要使用 yaml.safe_load() 方法,就來(lái)讀取 searchdata.yml 文件中的數(shù)據(jù),分別傳入到用例 test_search() 方法中完成數(shù)據(jù)的輸入與結(jié)果的驗(yàn)證。而如果使用 Excel、CSV 文件格式進(jìn)行數(shù)據(jù)的存儲(chǔ),需要先從 Excel 文件中讀取數(shù)據(jù),再解析成需要的格式。而使用 YAML 則完全省去了這個(gè)過(guò)程。
以上,關(guān)于其他環(huán)節(jié)的數(shù)據(jù)驅(qū)動(dòng),在后續(xù)章節(jié)分享。