@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