pytest文档83 - 把收集的 yaml 文件转 Item 用例并运行

news/2024/5/6 13:23:04/文章来源:https://blog.csdn.net/qq_27371025/article/details/128118808

前言

上一篇通过用例收集钩子 pytest_collect_file 把 yaml 文件收集起来的,仅仅只是收集到用例,还不能执行。
接下来详细讲解,如何把yaml 文件的内容,转成Item 用例去执行。

pytest_collect_file 收集钩子

准备一个待执行的YAML文件内容test_login.yml

name: login case1
request:url: http://127.0.0.1:8000/api/v1/login/method: POSTheaders:Content-Type: application/jsonjson:username: testpassword: 123456

先在conftest.py 写收集钩子

def pytest_collect_file(file_path: Path, parent):# 获取文件.yml 文件,匹配规则if file_path.suffix == ".yml" and file_path.name.startswith("test"):return pytest.File.from_parent(parent, path=file_path)

如果收集到yaml 文件返回pytest.File.from_parent(parent, path=file_path),在运行的时候会出现报错

============================================ ERRORS ============================================
_____________________________ ERROR collecting case/test_login.yml _____________________________
venv\lib\site-packages\_pytest\runner.py:339: in from_callresult: Optional[TResult] = func()
venv\lib\site-packages\_pytest\runner.py:370: in <lambda>call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
venv\lib\site-packages\_pytest\nodes.py:536: in collectraise NotImplementedError("abstract")
E   NotImplementedError: abstract
=================================== short test summary info ====================================
ERROR case/test_login.yml - NotImplementedError: abstract
!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!

报错位置在nodes.py文件里面的collect() 方法,于是找到nodes.py 里面的Collector

class Collector(Node):"""Collector instances create children through collect() and thusiteratively build a tree."""class CollectError(Exception):"""An error during collection, contains a custom message."""def collect(self) -> Iterable[Union["Item", "Collector"]]:"""Return a list of children (items and collectors) for thiscollection node."""raise NotImplementedError("abstract")

由于collect() 方法是空的,直接raise 一个异常NotImplementedError("abstract"), 于是我们需要重写collect() 方法

YamlFile 重写collect()

对应一个YamlFile 类,继承ytest.File,重写collect()方法

  • raw 是读取yaml文件的完整内容
  • name=raw.get(‘name’),name参数是设置用例的名称
  • values=raw,values是自定义的一个参数,读取的yaml文件测试数据
class YamlFile(pytest.File):def collect(self):"""返回读取内容的Iterable 可迭代对象"""raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))print(raw)# raw 是读取 yml 数据的内容yield pytest.Item.from_parent(self, name=raw.get('name'), values=raw)

再次运行pytest

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _item = <Item login case1>def pytest_runtest_call(item: Item) -> None:_update_current_test_var(item, "call")try:del sys.last_typedel sys.last_valuedel sys.last_tracebackexcept AttributeError:passtry:
>           item.runtest()venv\lib\site-packages\_pytest\runner.py:167:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _self = <Item login case1>def runtest(self) -> None:"""Run the test case for this item.Must be implemented by subclasses... seealso:: :ref:`non-python tests`"""
>       raise NotImplementedError("runtest must be implemented by Item subclass")
E       NotImplementedError: runtest must be implemented by Item subclassvenv\lib\site-packages\_pytest\nodes.py:733: NotImplementedError

这次出现的报错在runner.py 文件,执行runtest() 方法抛出的异常NotImplementedError("runtest must be implemented by Item subclass")
看到这里,说明用例Item 已经生成了,在执行的时候,没有定义一个执行yaml文件的方法,所以报错了
于是找到nodes.py 里面的 Item(Node)

class Item(Node):"""A basic test invocation item.Note that for a single function there might be multiple test invocation items."""def runtest(self) -> None:"""Run the test case for this item.Must be implemented by subclasses... seealso:: :ref:`non-python tests`"""raise NotImplementedError("runtest must be implemented by Item subclass")

接下来就需要重写Item 里面的runtest 去执行用例

重写Item 的runtest

最终看到的一个简版执行yaml文件的接口用例conftest.py 如下

import pytest
import requests
import yaml
from pathlib import Pathdef pytest_collect_file(file_path: Path, parent):# 获取文件.yml 文件,匹配规则if file_path.suffix == ".yml" and file_path.name.startswith("test"):return YamlFile.from_parent(parent, path=file_path)class YamlFile(pytest.File):def collect(self):"""返回读取内容的Iterable 可迭代对象"""raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))print(raw)# raw 是读取 yml 数据的内容yield YamlTest.from_parent(self, name=raw.get('name'), values=raw)class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.name = nameself.values = valuesself.s = requests.session()def runtest(self) -> None:"""运行用例"""request_data = self.values["request"]response = self.s.request(**request_data)print("\n", response.text)

输入pytest就可以看到yaml文件被当成用例去执行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228068.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Android的学生管理系统App设计与实现(Eclipse开发)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 研究现状 1 1.2.1 教育系统发展现状 1 1.2.2 手机的应用市场发展现状 1 1.2.3 Android平台介绍 3 1.2.4 Android管理学生信息的意义 5 1.3.3 开发的环境及开发工具介绍 6 1.3 研究主要内容 6 2 相关技术介绍 7 2.…

【生成式网络】入门篇(三):Style Transfer 的 代码和结果记录

文章目录Style Transfer 记录Fast Style Transfer 记录Style Transfer 记录 经典文章xxx&#xff0c;理论就不介绍了&#xff0c;根据一个content图像&#xff0c;和一个style图像&#xff0c;可以把style图像的style迁移到content图像上。 在代码上有一个跟之前不同的地方&am…

硬件定义软件?还是,软件定义硬件?

文章目录**1 软件和硬件****1.1 软件和硬件的定义****1.2 “硬件定义软件”和“软件定义硬件”的定义****1.3 CPU&#xff0c;软件和硬件解耦****1.4 CPU的软硬件定义****2 硬件定义软件****2.1 系统从软件逐步到硬件****2.2 硬件架构决定了软件设计****2.2.1 ASIC的硬件定义**…

django 开启CSRFtoken校验,以及postman实现问题

1.0 Django默认的CSRFtoken 表现&#xff1a; 后端使用的是Django的表单验证 post请求携带参数的问题 2.0 先处理post请求携带数据的csrfmiddlewaretoken 在登录界面 在input输入框中隐藏&#xff0c;所以需要提取input的value值&#xff0c;在【tests】脚本中进行提取&…

【C++11重点语法】lambda表达式,初始化列表

目录 引子&#xff1a;C11为什么的源来 语法1&#xff1a;初始化列表 1.2.2 多个对象的列表初始化 语法3&#xff1a;默认成员函数控制&#xff08;delete&#xff0c;default&#xff09; 语法4&#xff1a;lambda表达式 引子&#xff1a;C11为什么的源来 在2003年C标准…

简述RabbitMQ的架构设计

Broker&#xff1a; rabbitmq的服务节点Queue&#xff1a; 队列&#xff0c;是RabbitMQ的内部对象&#xff0c;⽤于存储消息。RabbitMQ中消息只能存储在队列中。⽣产者投递消息到队列&#xff0c;消费者从队列中获取消息并消费。多个消费者可以订阅同⼀个队列&#xff0c;这时队…

【Linux】shell命令行简单解释器

回顾一下&#xff0c;我们前面学习了进程创建&#xff0c;进程终止&#xff0c;进程等待&#xff0c;进程替换&#xff0c;通过这些内容我们可以来进行实现简单的shell命令行解释器&#xff01;&#xff01;&#xff01;下面我们直接来看一看如何去实现shell命令行解释器&#…

[附源码]Python计算机毕业设计SSM临港新片区招商引资项目管理系统的设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

嫦娥五号探测器详细介绍

嫦娥五号&#xff08;Change 5&#xff09;&#xff0c;即嫦娥五号探测器&#xff0c;是由中国空间技术研究院研制的中国首个实施无人月面取样返回的航天器&#xff0c;是完成中国探月工程重大科技专项“绕、落、回”三步走发展战略最后一步的关键任务。 中国探月工程三步走 嫦…

cisco asa学习笔记

cisco asa学习笔记一、网络模拟实验中的问题调试记录1、ASA自身接口地址ping不通(从远端路由过来的主机)2、同安全级别的接口默认不能通信&#xff0c;怎么才能通信&#xff1f;3、一个asa连接3个路由器&#xff0c;互联互通解决方案<1>方案1 全局开启policy-map inspect…

算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285)

算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2281 另一种模2. MT2282 小码哥的认可3. MT2283 整数…

影响工业产品设计的主要因素

设计师对工业产品的产品外观设计主要依靠形状、图案和颜色的结合&#xff0c;创造出具有一定功能性质的新产品。在这个过程中&#xff0c;设计师需要充分利用各种因素&#xff0c;外观工业设计公司强调材料的机制和颜色。那么&#xff0c;影响产品设计的主要因素是什么呢? 一、…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

spring-boot-starter-data-redis 引发的一系列惨案

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> pom 引入jar包 &#xff0c;如果redis配置文件使用 lettuce &#xff0c;还需要引入 commons-pool2 &a…

数据可视化,销量第一的新能源汽车是什么?比亚迪新能源汽车销量接近60万辆

去年以来&#xff0c;新能源汽车火热度席卷全球&#xff0c;中国的新能源汽车无论制造或者销售&#xff0c;数量增长迅猛。下面小编用一款数据可视化软件&#xff0c;带你用可视化数据解读高端制造背后&#xff0c;中国新能源汽车的具体销售情况。同样如果你工作上有数据报表需…

固话号码认证有什么好处?固话号码认证有什么作用?

固话号码认证为企业提供号码认证服务&#xff0c;在来电时显示企业信息&#xff0c;可提高电话号码辨识度&#xff0c;防止错误标记&#xff0c;确保展现的企业信息与企业的手机终端、APP等多平台展示信息一致&#xff0c;保证品牌企业的身份及商业价值。 那如何上线号码认证服…

多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践

伴随着国家产业升级的推进和云原生技术成熟&#xff0c;多点 DMALL 大数据技术也经历了从存算一体到存算分离的架构调整变迁。本文将从引入 Kyuubi 实现统一 SQL Proxy 的角度讲述这一探索实践的历程。 多点 DMALL 成立于2015年&#xff0c;提供一站式全渠道数字零售解决方案 D…

离线解锁 CodeCombat 全关卡教程 使用docker安装实现

背景 暂时还没收入&#xff0c;想玩顺便&#xff0c;但官方的有点贵&#xff08;是真的贵&#xff0c;扛不住&#xff09; 前期准备 下载安装docker desktop https://www.123pan.com/s/fmvUVv-HqApH&#xff0c; 这个安装不会的随便搜一个教程&#xff0c;挺多的。我随便找了一…

HTML篇_二、HTML简介_HTML入门必修第一课

HTML篇_二、HTML简介 一、HTML的基本结构 1.1 HTML的基本结构及解析 基本结构 这里我们先放一段代码块来进行展示&#xff0c;感受一下来自HTML的魅力。然后下文再对这段代码块进行解析。 <!DOCTYPE html> <html><head><meta charset"utf-8&quo…

使用自己的数据集测试Unbiased Mean Teacher for Cross-domain Object Detection

要复现Unbiased Mean Teacher for Cross-domain Object Detection&#xff08;UMT&#xff09;&#xff0c;首先要正确运行CycleGAN。 1. CycleGAN CycleGAN的github链接&#xff1a;https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 1.1 CycleGAN环境配置 git cl…