参考:微信公众号:从零开始学自动化测试
pytest.mark.parametrize装饰器可以实现测试用例参数化。
装饰器@pytest.mark.parametrize,里面写两个参数
第一个参数是字符串,多个参数中间用逗号隔开
第二个参数是list,多组数据用元祖类型
注意:@pytest.mark.parametrize("user, psw", test_login_data)里面的"user,psw"一定要和def test_login(user, psw)当中的参数名称一致,否则,将会出错。
import pytest
# 测试登录数据
test_login_data = [("admin", "111111"), ("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)
def test_login(user, psw):
# '''登录用例'''
result = login(user, psw)
assert result == True, "失败原因:密码为空"
if __name__ == "__main__":
pytest.main(["-s", "test_01.py"])
运行结果:
test_parameter.py .登录账户:admin
登录密码:111111
F登录账户:admin
登录密码:
AssertionError: 失败原因:密码为空
False != True
如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数
user = request.param 这一步是接收传入的参数
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
# indirect=True 声明login是个函数
@pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
# '''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
assert a, "失败原因:密码为空"
if __name__ == "__main__":
pytest.main(["-s", "test_03.py"])
运行结果:
test_fixture_param.py 登录账户:admin1
登录密码:111111
.测试用例中login的返回值:True
登录账户:admin1
登录密码:
F测试用例中login的返回值:False
test_fixture_param.py:15 (test_login[login1])
login = False