一、使用背景
當我們在設計用例的時候,經常會出現需要不同參數的情況,例如一個登錄的用例,我們需要測試它登錄名正常、為空、長度過長、過短、特殊字符等情況,因此就需要有不同情況下的參數,而當這些參數過多時,我們如果要一步一步的輸入,便會顯得有點繁瑣,因此就需要有參數化的概念。這里用到pytest里的parametrize+yaml來實現參數化。
二、parametrize
首先我們需要知道parametrize的用法。下面是官方文檔中的說明

這里我總結了一下:
@pytest.mark.parametrize("參數名",列表數據)
參數名:用來接收每一項數據,並作為測試用例的參數。
列表數據:一組測試數據。
接下來直接用代碼說明:
@pytest.mark.parametrize("a, b, c", [(1, 2, 3), (4, 5, 9), (1, 3, 6)])
def test_add01(a, b, c):
res = a + b
assert res == c
這里是比較a+b是否等於c,顯然只有2個滿足該條件,故斷言只有2個通過
運行結果:

三、yaml
能用來做參數化的形式其實有很多種,可以用xlrd讀取excel表做參數化也可以。這里我選擇用yaml來做參數化。因為yaml是一個可讀性高,用來表達數據序列化的格式,它不是一門語言,跟json有點類似,是一種儲存數據的載體,且支持多種語言,也比較容易理解。需要注意的是yaml比較注重格式,下面是yaml格式的一些基本語法:

示例:
- - 1 - 2 - 3 - - 3 - 4 - 7
- case1: - search_key: "python" - case2: - search_key: "ddt" - case3: - search_key: "selenium"
四、將yaml數據轉換成parametrize可讀的列表形式
從上面我們知道了parametrize需要傳一個數據參數 ,所以現在的關鍵點是怎么把yaml格式的數據轉換成parametrize可接受的數據格式。
import yaml
def get_yaml(yaml_file):
with open(yaml_file, "r", encoding="utf-8") as fp:
f = fp.read() # 讀出來是字符串
print(type(f))
d = yaml.load(f) # 轉列表
print("讀取到yaml文件數據")
print(d)
print(type(d))
return d
封裝一個方法,該方法用來將yaml中的數據轉換成列表。上面的兩個yaml示例轉換成列表后如下:


知道了yaml格式和如何轉換yaml數據之后,接下來要實現用例的參數化就好辦多了。
test_parametrize.py
import pytest
from testyaml import get_yaml
file = get_yaml("D:\\python project\\test\\test.yaml")
@pytest.mark.parametrize("a, b, c", file)
def test_add02(a, b, c):
res = a + b
assert res == c
test_yaml
- - 1 - 2 - 3 - - 3 - 4 - 7
運行測試用例后,可以看到有兩組用例測試通過

如果后續想繼續加數據,可直接將數據寫再yaml文件里即可。即實現了參數化功能,做到數據與代碼分離。
