场景一:
假设做个登录用例,设计UI自动化用例如下(用例设计不全仅做示范):
1.输入账号为空,输入密码不为空
2.输入账号为空,输入密码为空
3.输入账号不正确,输入密码正确
4.输入账号正确,输入密码不正确
5.输入账号正确,输入密码正确

难道我们需要写5遍一模一样的登录用例吗??只是因为输入的账号密码不一样
肯定不是这样啦!

场景二:
假设我们要实现一个搜索功能用例,输入多次不同的搜索关键字

以上,我们可以通过parameterize来实现我们的需要,装饰器pytest.mark.parameterie实现测试用例参数化,

  1. def parametrize(self,
  2. argnames: Any,
  3. argvalues: Any,
  4. indirect: bool = False,
  5. ids: Any = None,
  6. scope: Any = None)

argnames:变量名称
argvalues:变量
ids:用例名称
indirect:声明传入参数是函数
_
见如下实例:

单参数化

  1. @pytest.mark.parametrize("test_input, excepted", [
  2. ("3+5", 8),
  3. ("1+4", 5),
  4. ("3+3", 6),
  5. ], ids=['test1', 'test2', 'test3'])
  6. def test_eval(test_input, excepted):
  7. assert eval(test_input) == excepted
  8. -----------------
  9. #test_module.py::test_eval[test1] PASSED
  10. #test_module.py::test_eval[test2] PASSED
  11. #test_module.py::test_eval[test3] PASSED

组合参数化

实现用例的交叉组合:
test1-test3
test1-test4
test2-test3
test2-test4

  1. @pytest.mark.parametrize("test_input, excepted", [
  2. ("3+5", 8),
  3. ("1+4", 5),
  4. ], ids=['test1', 'test2'])
  5. @pytest.mark.parametrize("y", [
  6. 2,
  7. 3,
  8. ], ids=['test3', 'test4'])
  9. def test_eval(test_input, excepted, y):
  10. assert eval(test_input) == excepted
  11. print(y)
  12. --------------------------
  13. #test_module.py::test_eval[test3-test1] 2
  14. #test_module.py::test_eval[test3-test2] 2
  15. #test_module.py::test_eval[test4-test1] 3
  16. #test_module.py::test_eval[test4-test2] 3

fixture带参request

测试用例用装饰器pytest.mark.parametrize,
第一个参数是字符串,多个参数则用逗号隔开
第二个参数是list,多组数据用元组类型
user = request.param[“XXX”],设置接收传入的参数
其中indirect=True,声明login是以函数形式执行

  1. test_user_data = [{"user": "15833339620", "psw": "111111"},
  2. {"user": "13233338174", "psw": "111111"}]
  3. @pytest.fixture(scope="module")
  4. def login(request):
  5. user = request.param["user"]
  6. psw = request.param["psw"]
  7. print("登录账户:%s" % user)
  8. print("登录密码:%s" % psw)
  9. return user, psw
  10. # indirect=True 声明login是个函数
  11. @pytest.mark.parametrize("login", test_user_data, indirect=True)
  12. def test_login(login):
  13. '''登录用例'''
  14. user = login[0]
  15. pw = login[1]
  16. print("测试用例中login的返回值:{},{}".format(user, pw))
  17. assert True, "失败原因:密码为空"