pytest之parametrize数据驱动

发布时间 2023-06-09 11:55:36作者: 那年腹黑兔

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)