pytest之parametrize数据驱动
1.数据驱动
1.1 yaml文件
yaml是一种数据类型,扩展名:.yaml和.yml
作用:
- 配置文件:环境变量,数据库信息,用户名密码,日志格式等
- 测试用例:web,ui,app
语法规则:
- 区分大小写
- 通过缩进表示层级关系,一般用空格,不要使用tab键
- 通过#注释
- 字符串可以不用写引号,也可以写单引号或者双引号,区别在于,单引号会对特殊字符进行转义
常用数据类型
- 标量(整数,浮点数,字符串,布尔,Null,日期和时间)
- 对象(字典dict(键:(空格)值))
- 数组(列表list,在一组数据之前加上-)
data1: 7999 data2: 168.99 data3: 自动化\测试 data4: '自动化\测试' data5: "自动化测试" data6: True data7: Null data8: 2023-06-02 data9: 2023-06-02 21:39:45 data12: name1: 李四 name2: 王五 info: - name: 张三 - sex: 男 - age: 18
数据类型强转
- !!str(数字) 数字转字符串(常用)
- !!int "123" 字符串转整型(常用)
- !!bool
- !!null
- !!timestamp
- !!set
- !!map
- !!binary
info: - name: 张三 - sex: 男 - age: 18 - score: !!int "85" - level: !!str 3
变量的引用
- &表示建立一个锚点
- *用来引用锚点
- <<表示合并
data10: &data10 "测试数据驱动" data11: data12: name1: 李四 name2: 王五 <<: *data10 info: - name: 张三 - sex: 男 - age: 18 - mark: *data10
1.2 操作yaml
1.2.1 读取
#读取yaml的数据 def read_yaml(yaml_path): with open(yaml_path,mode='r',encoding='utf-8') as f: #value=yaml.load(f,yaml.FullLoader) value=yaml.safe_load(f) return value
1.2.2 写入(追加)
def write_yaml(yaml_path): with open(yaml_path,encoding='utf-8',mode='a') as f: data={"data13":"写入的数据"} yaml.dump(data,stream=f,allow_unicode=True)
1.2.3 清空
def clear_yaml(yaml_path): with open(yaml_path,encoding="utf-8",mode="w") as f: f.truncate()
1.3 parametrize数据驱动
1.3.1 第一种写法(list)
@allure.story("接口名称:登录接口") @allure.title("用例名称:验证接口登录成功") @allure.description("用例描述:用户名和密码正确,登录成功") @pytest.mark.smoke @pytest.mark.parametrize("caseinfo",["张三","李四"]) def test_login_success(self,base_url,caseinfo): print(caseinfo)
1.3.2 第二种写法(字典列表 dict of list)
@allure.story("接口名称:登录接口") @allure.title("用例名称:验证接口登录成功") @allure.description("用例描述:用户名和密码正确,登录成功") @pytest.mark.smoke @pytest.mark.parametrize("caseinfo",[{"name":"张三"},{"name2":"李四"}]) def test_login_success(self,base_url,caseinfo): print(caseinfo)
1.3.3 实际应用
login.yaml
login.yaml - story: 登录接口 title: 验证登录成功测试用例 request: method: post url: user/login headers: Content_Type: application/json data: name: wangwu pwd: 123456 validate: null - story: 登录接口 title: 验证登录测试用例2 request: method: post url: user/login headers: Content_Type: application/json data: name: wangwu pwd: validate: null
test_login.py
import allure import pytest import requests from common.yaml_util import read_yaml @allure.epic("项目名称:易宝商城接口自动化测试") @allure.feature("模块名称:用户管理模块测试用例") class TestLogin: a=8 @allure.story("接口名称:登录接口") @allure.title("用例名称:验证接口登录成功") @allure.description("用例描述:用户名和密码正确,登录成功") @pytest.mark.smoke @pytest.mark.parametrize("caseinfo",read_yaml("./data/login.yaml")) def test_login_success(self,base_url,caseinfo): print("*"*15) print(caseinfo["story"]) print(caseinfo["title"]) print(caseinfo["request"]["method"]) print(base_url+caseinfo["request"]["url"]) print(caseinfo["request"]["headers"]) print(caseinfo["request"]["data"]) print(caseinfo["validate"]) #获取yaml里面的参数 url=base_url+caseinfo["request"]["url"] data=caseinfo["request"]["data"] #post请求,返回响应结果 res=requests.post(url,json=data) print(res.text)