@pytest.mark.parametrize 装饰器可以实现用例参数化
@pytest.mark.parametrize("参数名",数据) #实现自定义参数名称,并进行传入参数数据
举例:
import pytest #自定义两组数据 test_datas = [(1, 2, 3), (11, 22, 33)] datas_dict = [ {"a": 1, "b": 2, "c": 3}, {"a": 11, "b": 22, "c": 33}, {"a": 111, "b": 222, "c": 333}] # 直接写入数据 @pytest.mark.parametrize("a, b, c", [(1, 2, 3), (4, 5, 9)]) #直接将参数写到()里面 def test_add_case1(a, b, c): res = a + b assert res == c # 参数为列表中嵌套元组 @pytest.mark.parametrize("data", test_datas) #自命名一个参数名data,将测试数据test_data 传给 data def test_add_case2(data): res = data[0] + data[1] assert res == data[2] # 参数为列表中嵌套字典 @pytest.mark.parametrize("data", datas_dict) #自命名一个参数名data,将测试数据datas_dict传给data def test_add_case3(data): res = data["a"] + data["b"] assert res == data["c"]
实例:
1、结合登录函数进行参数传递:
import pytest #定义一组测试数据 test_login_data = [("admin", "123456"), ("admin", " ")] def login(user, psw): ‘‘‘登录函数‘‘‘ print("账户:%s" %user) print("密码:%s" %psw) if psw: return True else: return False @pytest.mark.parametrize("user, psw", test_login_data) #这是login的测试函数,在用例上用上装饰器,从而直接使用参数 def test_login(user, psw): ‘‘‘用例‘‘‘ result = login(user, psw) assert result == True, "失败原因:密码为空" if __name__ == "__main__": pytest.main(["-v", "test_demo.py"])
2、使用装饰器@pytest.fixture写登录函数
把登录放到前置条件里,使用@pytest.fixture装饰器:使用默认的request参数
如:user = request.param 用来接收传入的参数
import pytest
# 定义一组测试数据
test_user_data = ["admin1", "admin2"]
@pytest.fixture(scope="module")
def login(request):
user = request.param
print("账户:%s"%user)
return user
@pytest.mark.parametrize("login", test_user_data, indirect=True) #indire=True标识login是个函数,只是在这被用作了参数
def test_login(login):
‘‘‘这是一条用例‘‘‘
a = login
print("用例中login的返回值:%s" % a)
assert a != ""
if __name__ == "__main__":
pytest.main(["-v", "test_demo.py"])
3、假设使用@pytest.fixture装饰器,遇到登录账号有多个参数时,可以用一个字典去存储, 这样的结果也是只传一个参数,但是只需不同的参数从字典里面取对应key值就行,如: user = request.param["user"]
import pytest # 定义一组测试数据 test_user_data = [{"user": "admin1", "psw": "111111"}, {"user": "admin1", "psw": ""}] @pytest.fixture(scope="module") def login(request): user = request.param["user"] psw = request.param["psw"] print("账户:%s" % user) print("密码:%s" % psw) if psw: return True else: return False @pytest.mark.parametrize("login", test_user_data, indirect=True) # indirect=True 这个标识login是个函数,在这被用作了参数直接传递了 def test_login(login): ‘‘‘用例‘‘‘ a = login print("用例中login的返回值:%s" % a) assert a, "失败原因:密码为空" if __name__ == "__main__": pytest.main(["-v", "test_demo.py"])
4、因为在用例上可以存在多个fixture来当做前置操作条件,
因此可以使用多个@pytest.mark.parametrize装饰器但是用例执行次数也会被翻倍
import pytest # 定义一组测试数据 test_user = ["admin1", "admin2"] test_psw = ["11111", "22222"] @pytest.fixture(scope="module") def input_user(request): #这是输入账户名的 user = request.param print("账户:%s" % user) return user @pytest.fixture(scope="module") def input_psw(request): #这是输入密码的 psw = request.param print("密码:%s" % psw) return psw @pytest.mark.parametrize("input_user", test_user, indirect=True) #使用2个装饰器,来分别对user和psw来装饰,用例执行后会看见一共执行了4次,各2次 @pytest.mark.parametrize("input_psw", test_psw, indirect=True) def test_login(input_user, input_psw): ‘‘‘用例‘‘‘ a = input_user b = input_psw print("测试数据a:%s,b:%s" %(a,b)) assert a if __name__ == "__main__": pytest.main(["-v", "test_demo.py"])
pytest 参数化操作 @pytest.mark.parametrize (结合fixture使用)
原文:https://www.cnblogs.com/QiKa/p/13235008.html