场景一:
假设做个登录用例,设计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) == exceptedprint(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, "失败原因:密码为空"
