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)

浙公网安备 33010602011771号