pytest参数化

一、@pytest.mark.parametrize介绍

bash 复制代码
@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None)

参数说明:
argnames: 一个或多个参数名,用逗号分隔的字符串,如"arg1,arg2,arg3",参数名与用例入参数一致。
argvalues :参数值,必须是列表类型;如果有多个参数,则用元组存放值,一个元组存放一组参数值,元组放在列表中。
indirect :如果设置成True,则把传进来argnames的参数当函数执行,而不是一个参数
ids :用例的ID,传一个字符串列表,可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性,ids的长度需要与测试数据列表的长度一致。

bash 复制代码
@pytest.mark.parametrize("para1",[1,2,3,4,5])
@pytest.mark.parametrize("para1,para2,para3",[(a,b,c),(1,2,3)])
@pytest.mark.parametrize("para1,para2,para3",get_list())

二、登录接口使用@pytest.mark.parametrize

1、将接口测试数据写道yaml文件中

以下为登录接口的三组数据

yaml 复制代码
-
 feature: 用户管理
 story: 登录接口
 title: USER-登录-错误密码
 request:
  method: post
  url: http://IP:81/api/login
  headers: ""
  data:
   username: admin@qq.com
   password: 123456
 validate: 用户名或密码错误

-
 feature: 用户管理
 story: 登录接口
 title: USER-登录-用户名错误
 request:
  method: post
  url: http://114.55.135.15:81/api/login
  headers: ""
  data:
   username: admin
   password: password
 validate: 用户名不存在!

-
 feature: 用户管理
 story: 登录接口
 title: USER-登录-成功
 request:
  method: post
  url: http://114.55.135.15:81/api/login
  headers: ""
  data:
   username: admin@qq.com
   password: pass123
 validate: 操作成功

2、编写读取测试用例yaml的工具类

以列表形式,返回3条数据[data1,data2,data3]

python 复制代码
import yaml

def read_yaml(path):
    with open(path,encoding="utf-8",mode='r') as f:
        value = yaml.load(f,yaml.FullLoader)
        return value

if __name__ == "__main__":
    print(read_yaml("./login_01.yaml"))
   

3、封装请求工具

使用RequestUtil类,作为所有请求发送的入口,可以在此类中,进入异常处理、日志监控、请求信息处理等。

类变量session,所有的请求都使用该session,可解决后续的Cookie关联问题

bash 复制代码
import requests

class RequestUtil():
    session = requests.session()

    def  send_request(self,method,url,**kwargs):
        res = RequestUtil.session.request(method,url,**kwargs)
        print(res.json())
        return res

4、测试用例类

@pytest.mark.parametrize('casedata',YamlReadUtil.read_yaml("./testcases/login_01.yaml"))

从login_01.yaml文件中读到3条测试用例,循环将3组用例数据传递给casedata。

python 复制代码
from TestPytest.testcases import YamlReadUtil
from TestPytest.testcases.RequestUtil import RequestUtil

class TestRequests():
    @pytest.mark.parametrize('casedata',YamlReadUtil.read_yaml("./testcases/login_01.yaml"))
    def test_01_login(self,casedata):
        method=casedata["request"]["method"]
        url = casedata["request"]["url"]
        data = casedata["request"]["data"]
        res = RequestUtil().send_request(method=method,url=url,data=data)
        result = jsonpath.jsonpath(res.json(),"$.message")[0]
        print(result)
        # assert casedata["validate"] == result

执行结果

三、将用例写在yaml文件的优点与问题

优点:

用例编写只用写yaml文件,不需要再编写代码

缺点:

(1)接口关联处理,如编写文章接口入参需要上一个接口返回的access_token,在yaml文件中不好提取对应值。

(2)接口需要上传文件数据,yaml文件中不能执行open函数,无法写对应的文件数据。

相关推荐
西游音月2 天前
(2)pytest+Selenium自动化测试-环境准备
selenium·测试工具·pytest
我的xiaodoujiao2 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 23--数据驱动--参数化处理 Yaml 文件
python·学习·测试工具·pytest
我的xiaodoujiao6 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 22--数据驱动--参数化处理 Json 文件
python·学习·测试工具·pytest
胜天半月子6 天前
Python自动化测试 | 快速认识并了解pytest的基本使用
服务器·python·pytest
北珣.10 天前
自动化框架pytest基础
自动化·pytest
程序员杰哥11 天前
Pytest之收集用例规则与运行指定用例
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
学习3人组12 天前
Python + requests + pytest + allure + Jenkins 构建完整的接口自动化测试框架
python·jenkins·pytest
shao91851615 天前
Gradio全解14——使用Gradio构建MCP的服务器与客户端(4)——Python包命令:uv与uvx实战
pytest·uv·1024程序员节·npx·uvx·uv pip·ruff
我的xiaodoujiao16 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 20--PO(POM) 设计模式和用例撰写
python·学习·测试工具·设计模式·pytest
sky0Lan16 天前
一个类似 pytest 的 html 报告
android·html·pytest