当前位置:   article > 正文

Pytest测试用例参数化

Pytest测试用例参数化

@pytest.mark.parametrize('参数名1,参数名2...参数n', [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)])

场景:

定义一个登录函数test_login,传入参数为name,password,需要用多个账号去测试登录功能

  1. # test_mod6.py
  2. import pytest
  3. @pytest.mark.parametrize("name,password",[("Jie",223456),("Jack",111111),("Jame",222222)])
  4. def test_login(name,password):
  5. db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
  6. if name in db_data["name"] and str(password) == db_data["password"][name]:
  7. print(f"{name} 成功登录系统!")
  8. elif name in db_data["name"] and str(password) != db_data["password"][name]:
  9. print(f"{name}账号,密码输出错误,请重新输出!")
  10. else:
  11. print(f"{name} 该账号不存在,请输入正确的账号!")

 上述代码执行结果:

  1. 命令行:pytest -vs test_mod6.py
  2. 结果为:
  3. test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
  4. PASSED
  5. test_mod6.py::test_login[Jack-111111] Jack 成功登录系统!
  6. PASSED
  7. test_mod6.py::test_login[Jame-222222] Jame 成功登录系统!
  8. PASSED
  9. ========================================================================================== 3 passed in 0.03s ===========================================================================================

通过@pytest.mark.parametrize(参数名,测试数据 )装饰器,能够对装饰函数实现参数化测试,提高代码复用率;通过parametrize中传入参数名和测试数据来实现参数化调用测试用例;

parametrize中的参数名对应测试函数中的传入参数名 name ,password;

parametrize中的测试数据是一个list类型 list中存入多个(name,password)元祖形式的测试数据,[("Jie",223456),("Jack",111111),("Jame",222222)]

多个parametrize组合使用

  1. @pytest.mark.parametrize("password",[223456,111111,34567])
  2. @pytest.mark.parametrize("name",["Jie","Jame"])
  3. def test_login(name,password):
  4. db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
  5. if name in db_data["name"] and str(password) == db_data["password"][name]:
  6. print(f"{name} 成功登录系统!")
  7. elif name in db_data["name"] and str(password) != db_data["password"][name]:
  8. print(f"{name}账号,密码输出错误,请重新输出!")
  9. else:
  10. print(f"{name} 该账号不存在,请输入正确的账号!")
  1. 命令行:pytest -vs test_mod6.py
  2. 结果为:
  3. test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
  4. PASSED
  5. test_mod6.py::test_login[Jie-111111] Jie账号,密码输出错误,请重新输出!
  6. PASSED
  7. test_mod6.py::test_login[Jie-34567] Jie账号,密码输出错误,请重新输出!
  8. PASSED
  9. test_mod6.py::test_login[Jame-223456] Jame账号,密码输出错误,请重新输出!
  10. PASSED
  11. test_mod6.py::test_login[Jame-111111] Jame账号,密码输出错误,请重新输出!
  12. PASSED
  13. test_mod6.py::test_login[Jame-34567] Jame账号,密码输出错误,请重新输出!
  14. PASSED
  15. ================================================================================== 6 passed in 0.21s ===================================================================================

通过多个parametrize的组合,可实现参数化组合后调用测试函数,构造不同测试数据的多场景测试

YAML文件

YAML 是专门用来写配置文件的通用数据串行化格式语言,非常简洁和强大

基本语法:

1、yml文件以缩进代表层级关系

2、缩进空格的个数不重要,只要相同层级的元素左对齐即可

3、大小写敏感

4、数据格式为,名称:(空格)值

支持的数据结构:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值(数字、字符串、布尔值)
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

 在Pycharm中新建一个YML文件

 

 

项目文件夹右键-【new】-【File】-输入 文件名.yml 回车即可生成一个空的yml文件

分别介绍YML文件中的三种数据结构

  1. 对象(键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary))
  1. name: Jie # 对象的键值对,使用冒号结构表示,注:冒号后需要加空格
  2. age : 21
  3. address: 上海浦东

读取YAML文件 

  1. import yaml
  2. def read_yaml():
  3. with open("D:\\Buyer_test_code\\testteach\\testdatas.yml",encoding="utf-8") as f:
  4. f = yaml.safe_load(f)
  5. return f
  6. if __name__ == '__main__':
  7. y = read_yaml()
  8. print(y)
  9. 运行结果:
  10. {'name': 'Jie', 'age': 21, 'address': '上海浦东'}

 2.数组

  1. - Jack # 注:-后面需要空格
  2. - Jame
  3. - Flak

通过 safe_load() 读取结果

['Jack', 'Jame', 'Flak']
  1. -
  2. - Jack
  3. - Jame
  4. - Flak
  5. -
  6. - 1
  7. - 2
  8. - 3
  9. -
  10. - python
  11. - java
  12. - C++
[['Jack', 'Jame', 'Flak'], [1, 2, 3], ['python', 'java', 'C++']]

复合结构

对象与数组的结合

  1. name:
  2. - Jie
  3. - Jack
  4. - Jame
  5. password:
  6. Jie: 223456
  7. Jack: 111111
  8. Jame: 222222
{'name': ['Jie', 'Jack', 'Jame'], 'password': {'Jie': 223456, 'Jack': 111111, 'Jame': 222222}}

None 用~表示

name: ~
{'name': None}

用!!强制转换类型

  1. name:
  2. - Jie
  3. - Jack
  4. - Jame
  5. password:
  6. Jie: !!str 223456 # !!str 强制把int转换为str类型
  7. Jack: !!str 111111
  8. Jame: 222222
{'name': ['Jie', 'Jack', 'Jame'], 'password': {'Jie': '223456', 'Jack': '111111', 'Jame': 222222}}

通过YAML文件实现参数化

  1. -
  2. - Jie
  3. - 223456
  4. -
  5. - Jack
  6. - 111111
  7. -
  8. - Jame
  9. - 222222
  10. # 在python输出格式:[['Jie', 223456], ['Jack', 111111], ['Jame', 222222]]
  1. import pytest
  2. from test_demo7 import read_yaml
  3. datas = read_yaml("D:\\Buyer_test_code\\testteach\\testdatas.yml")
  4. @pytest.mark.parametrize("name,password",datas)
  5. def test_login(name,password):
  6. db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
  7. if name in db_data["name"] and str(password) == db_data["password"][name]:
  8. print(f"{name} 成功登录系统!")
  9. elif name in db_data["name"] and str(password) != db_data["password"][name]:
  10. print(f"{name}账号,密码输出错误,请重新输出!")
  11. else:
  12. print(f"{name} 该账号不存在,请输入正确的账号!")

执行结果:

  1. test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
  2. PASSED
  3. test_mod6.py::test_login[Jack-111111] Jack 成功登录系统!
  4. PASSED
  5. test_mod6.py::test_login[Jame-222222] Jame 成功登录系统!
  6. PASSED
  7. =================================================================================== 3 passed in 0.18s ====================================================================================

通过YAML文件,可以做到测试数据与测试代码的分离,进一步提高代码的复用性灵活性 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57523
推荐阅读
相关标签
  

闽ICP备14008679号