场景一:
假设做个登录用例,设计UI自动化用例如下(用例设计不全仅做示范):
1.输入账号为空,输入密码不为空
2.输入账号为空,输入密码为空
3.输入账号不正确,输入密码正确
4.输入账号正确,输入密码不正确
5.输入账号正确,输入密码正确
难道我们需要写5遍一模一样的登录用例吗??只是因为输入的账号密码不一样
肯定不是这样啦!
场景二:
假设我们要实现一个搜索功能用例,输入多次不同的搜索关键字
以上,我们可以通过parameterize来实现我们的需要,装饰器pytest.mark.parameterie实现测试用例参数化,
def parametrize(self,
argnames: Any,
argvalues: Any,
indirect: bool = False,
ids: Any = None,
scope: Any = None)
argnames:变量名称
argvalues:变量
ids:用例名称
indirect:声明传入参数是函数
_
见如下实例:
单参数化
@pytest.mark.parametrize("test_input, excepted", [
("3+5", 8),
("1+4", 5),
("3+3", 6),
], ids=['test1', 'test2', 'test3'])
def test_eval(test_input, excepted):
assert eval(test_input) == excepted
-----------------
#test_module.py::test_eval[test1] PASSED
#test_module.py::test_eval[test2] PASSED
#test_module.py::test_eval[test3] PASSED
组合参数化
实现用例的交叉组合:
test1-test3
test1-test4
test2-test3
test2-test4
@pytest.mark.parametrize("test_input, excepted", [
("3+5", 8),
("1+4", 5),
], ids=['test1', 'test2'])
@pytest.mark.parametrize("y", [
2,
3,
], ids=['test3', 'test4'])
def test_eval(test_input, excepted, y):
assert eval(test_input) == excepted
print(y)
--------------------------
#test_module.py::test_eval[test3-test1] 2
#test_module.py::test_eval[test3-test2] 2
#test_module.py::test_eval[test4-test1] 3
#test_module.py::test_eval[test4-test2] 3
fixture带参request
测试用例用装饰器pytest.mark.parametrize,
第一个参数是字符串,多个参数则用逗号隔开
第二个参数是list,多组数据用元组类型
user = request.param[“XXX”],设置接收传入的参数
其中indirect=True,声明login是以函数形式执行
test_user_data = [{"user": "15833339620", "psw": "111111"},
{"user": "13233338174", "psw": "111111"}]
@pytest.fixture(scope="module")
def login(request):
user = request.param["user"]
psw = request.param["psw"]
print("登录账户:%s" % user)
print("登录密码:%s" % psw)
return user, psw
# indirect=True 声明login是个函数
@pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
'''登录用例'''
user = login[0]
pw = login[1]
print("测试用例中login的返回值:{},{}".format(user, pw))
assert True, "失败原因:密码为空"