pytest参数化和yaml学习

 一、参数化parametrize

  组装测试数据,在测试前定义好测试数据,并在测试用例中使用

  1. 单次循环(单参数单次循环):

    @pytest.mark.parametrize("a",["b"])
     def test_parametrize(a):
       print(a) 

      2.多次循环(单参数多次循环,将数组中的值分别赋值给变量,每赋值一次,运行一次):
    @pytest.mark.parametrize("a",["b","c","d"])
     def test_parametrize(a):
      print(a)
  3.多参数多次循环(值可以是数组或元组形式)
    @pytest.mark.parametrize("a,b",[("c","d"),("e","f")])
    def test_parametrize(a,b):
      print(a,b)
  4.参数值为字典形式
    @pytest.mark.parametrize("hero",[{"name":"安琪拉"}])
    def test_parametrize(hero):
        print(hero["name"])

二、yaml(yaml语言本质是一种通用的数据串行化格式)

适用场景:

  1. 在脚本语言中使用,实现简单,解析成本低
  2. 序列化
  3. 在编程时写配置文件,比xml快,比ini文档功能更强
  4. yaml是专门用于写配置文件的语言,非常简洁和强大,比json格式方便

yaml支持的三种数据结构:

  1. 对象:即键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
  2. 数组:一组按次序排列的值,又称为序列/列表(list)
  3. 纯量:单个的、不可再分的值(str、float、int)

三、yaml写法

  1. 对象

    key:
     child-key: value
     child-key2: value2
          等于 {"key":{"child-key":"value","child-key2":"value2"}}

    2.数组

    key:
     - A
     - B
     - C
    等于{"key":[A,B,C]}
       3.组合
    key:
     - child-key: value
      chile-key2: value2
         等于 {"key":[{"child-key":"value","child-key2":"value2"}]}

       4.数组嵌套
    key:
     -
      - A
      - B
      - C
   等于{"key":[[A,B,C]]}

四 、yaml中不同写法

hero1: {name: 安琪拉, age: 18,hp: 433.4}
等同于
hero:
name: 安琪拉
age: 18
hp: 433.4

五、读取yaml文件

  1. yaml包安装:pip3 install pyyaml(或package安装)
  2. 读取yaml文件内容

       

  import yaml
  def read_yaml():
  f=open("../config/data.yaml",encoding="utf-8")
  data=yaml.safe_load(f)
  return data
  if __name__ == '__main__':
   result=read_yaml()
   print(result)

  3.复杂yaml数据读取

test:
name: login_case1
request:
url: https://xxx
method: POST
header:
Content-Type: application/json
json:
username: test
password: 123456
getdata=read_data()['test']['request']['header'](通过键获取值 )

六 、yaml在线格式校验
地址:https://www.bejson.com/validators/yaml_editor/

七、yaml+parametrize使用
(从yaml中获取,值需是数组,如
getdata["heros_name"]需是数组,否则无法获取
优缺点:使用数组无法知道每个值的含义,场景:同一个字段不同值的场景,如不通过手机号注册或登录
多个参数时建议以字段形式,不通过
@pytest.mark.parametrize参数传递
1.单参数
heros_name:
- 安琪拉
- 黄忠
- 小乔
import pytest
from utils.read_data import getdata
@pytest.mark.parametrize("name",getdata["heros_name"])
def test_parametrize_yaml(name):
print(name)

2.多参数
perso:
- - zhangsan
- 18
- - lisi
- 20
或者下面的形式:
mobil_belong_get:
- [18837238983,2232342]
- [17938282888,2312313]
@pytest.mark.parametrize("name,age",getdata['perso'])
def test_parametrize_yaml(name,age):
print('我的姓名:%s'%name,',年龄:%s'%age)
#print(f'我的姓名:{name},年龄:{age}')
八、yaml使用自定义函数
data.yaml文件
person:
name: random_name()
age: 18
sex: 男
替换函数
def func_yaml(data):
if isinstance(data,dict):
for key,value in data.items():
if 'random' in str(value):
data[key]=eval(value)
return data
def func_yaml_2(data):
if isinstance(data,dict):
for key,value in data.items():
if '${' and '}' in str(value):
start=str(value).index('${')
end=str(value).index('}')
func_name=str(value)[start+2:end]
#data[key]=eval(func_name) #${random_name()}
data[key] = str(value)[0:start]+eval(func_name)+str(value)[end+1:len(str(value))] #上海-${random_name()}-测试
return data
如果方法在其他文件中,不在工具文件(yaml_util中,在 yaml_util需要引入对应函数)


posted @ 2024-08-30 13:46  稻草人&梦想  阅读(299)  评论(0)    收藏  举报