首页 > 其他 > 详细

pytest 参数化操作 @pytest.mark.parametrize (结合fixture使用)

时间:2020-07-04 16:19:15      阅读:250      评论:0      收藏:0      [点我收藏+]

@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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!