pytest-编写插件

news2025/1/9 14:48:05

pytest

      • 0 、文档
      • 1、钩子函数分类
        • 1.4 测试运行钩子
      • 2、本地编写插件:conftest.py
      • 3、外部插件:setuptools
      • 4、实战

0 、文档

官方文档
中文文档

1、钩子函数分类

pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收集钩子、用例执行钩子、报告钩子、调试钩子。

1.4 测试运行钩子

所有与运行测试相关的钩子都会接收一个pytest.Item对象。

  • pytest_runtestloop(session: Session) 调用以开始运行测试用例循环(用例收集完成后执行)。
  • pytest_runtest_protocol(item: Item, nextitem: Optional[Item])
    用于实现runtest_setup/call/teardown协议,包括收集异常和调用报告hook。

runtest 协议:

参数

  • Item:执行的用例
  • nextitem: 指定的下一条执行的测试用例

pytest默认的runtest协议为如下三个阶段:

1、设置阶段:
这个阶段主要执行用例:前置夹具

  • call = pytest_runtest_setup(item)
  • report = pytest_runtest_makereport(item, call)
  • pytest_runtest_logreport(report)
  • pytest_exception_interact(call, report)
    2、调用阶段
    这个阶段负责执行测试用例
  • call = pytest_runtest_call(item)
  • report = pytest_runtest_makereport(item, call)
  • pytest_runtest_logreport(report)
  • pytest_exception_interact(call, report)
    3、拆解阶段
    这个阶段主要执行用例:后置夹具
  • call = pytest_runtest_teardown(item, nextitem)
  • report = pytest_runtest_makereport(item, call)
  • pytest_runtest_logreport(report)
  • pytest_exception_interact(call, report)
  • pytest_runtest_logstart(nodeid: str, location: Tuple[str,
    Optional[int], str]) 在用例setup之前调用。
  • pytest_runtest_logfinish(nodeid: str, location: Tuple[str,
    Optional[int], str])在用例teardown之后调用。
  • pytest_runtest_setup(item: Item) 在用例执行之前调用。
  • pytest_runtest_call(item: Item) 调用以执行用例。
  • pytest_runtest_teardown(item: Item, nextitem: Optional[Item])
    在用例执行完成后调用。
  • pytest_runtest_makereport(item: Item, call: CallInfo[None])
    在runtest_setup/call/teardown之后执行,用于返回当前运行的结果。
  • pytest_pyfunc_call(pyfuncitem: Function) 调用基础测试功能。

2、本地编写插件:conftest.py

⚠️conftest.py文件可以有多个,并且只在当前package下生效)使用而无需导入,
推荐使用根目录下的conftest.py

from datetime import datetime

def pytest_configure():
    """
    配置加载完毕之后执行,所有测试用例执行之前执行
    """
    print(f"{datetime.now()} pytest开始执行")

def pytest_unconfigure():
    """
    配置卸载完毕之后执行,所有测试用例执行之后执行
    """
    print(f"{datetime.now()} pytest开始结束")

任意运行某条case:
在这里插入图片描述

3、外部插件:setuptools

  1. 根目录下创建setup.py文件
import setuptools
from setuptools import setup

setup(
    name="demo",  # 包名称
    author="cxs",
    description="用于替换pnc账号",  # 程序的简单描述
    long_description="",  # 程序的详细描述
    packages=setuptools.find_packages(),  # 需要处理的包目录(通常为包含 __init__.py 的文件夹)
    py_modules="",  # 需要打包的 Python 单文件列表
    setup_requires=["pytest-runner", ...],  # 指定运行 setup.py 文件本身所依赖的包
    tests_require=["pytest", ...],  # 在测试时需要使用的依赖包
)
  1. 新建一个package,暂叫demo,该package下新建download.py,内容如下:
from concurrent.futures import ThreadPoolExecutor
import requests


def download_all(func, sites):
    with ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(func, sites)


def download(url):
    response = requests.get(url)
    print(response.status_code)
    return response


if __name__ == '__main__':
    sites = ["https://www.baidu.com/", "https://codetop.cc/home",
             "https://leetcode.cn/problemset/all/"]
    download_all(download, sites)
  1. 执行python3 setup.py sdist ; 会生成dist文件,该文件内有个.tar.gz的安装包,使用pip进行安装
    在这里插入图片描述
  2. python中即可使用此包
    在这里插入图片描述

4、实战

# -*- coding: utf-8 -*-
import pytest
import requests
import json
from _pytest.reports import TestReport
from datetime import datetime

data = {
    "passed": 0,
    "failed": 0,
}

url = "xxx"
headers = {
    "Content-Type": "application/json;charset=utf-8"
}


def pytest_runtest_logreport(report: TestReport):
 	"""
    统计用例执行成功/失败数
    """
    if report.when == "call":
        data[report.outcome] += 1


def pytest_collection_finish(session: pytest.Session):
    """
    用例加载完成之后执行,包含了全部用例
    """
    data["total"] = len(session.items)


def pytest_configure(config):
    """
    配置加载完毕之后执行,所有测试用例执行之前执行
    """
    data["start_time"] = datetime.now()


def pytest_unconfigure():
    """
    配置卸载完毕之后执行,所有测试用例执行之后执行
    """
    data["end_time"] = datetime.now()
    data["duration"] = data["end_time"] - data["start_time"]
    data["passed_rate"] = f'{data["passed"] / data["total"]:.2f}%'

    content = f"""
    测试时间:{data["end_time"]}
    用例数量:{data["total"]}
    执行时长:{data["duration"]}
    测试通过:{data["passed"]}
    测试失败:{data["failed"]}
    测试通过率:{data["passed_rate"]}
    
    测试报告地址:"https://www.osgeo.cn/pytest/reference.html#test-running-runtest-hooks"
    """

    d = {"text":"pytest自动化测试通知:",
         "attachments":
             [
                 {
                     "title": "Star Wars III",
                     "text": content,
                     "color": "#ffa500"
                 }
             ]
         }

    res = requests.post(url=url, data=json.dumps(d), headers=headers).json()

执行结果如图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rtl仿真器-incisive安装和测试

需要的文件 安装文件 incisive : http://pan.baidu.com/s/1dFC9KZn 提取码 k3cb path: license: IScape: 安装的图形界面 IScape下载链接: https://pan.baidu.com/s/1FvpOto5fAIRjQARcbMbjZQ 密码: k1cb 目录结构 需要四个目录 安装目录:INCISIVE151 path 存放解密工具 l…

强化学习路线规划之深度强化学习

学到如今,我实在明白了一个至关重要的东西,那就是目标很重要,有了清晰的目标我们就知道该做什么,不至于迷茫,否则每天都在寻找道路。所以我一直在规划这样一条道路,让想学习的人可以抛下不知道该怎么做的顾…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验(二)

大家好,我是瓜叔。 notion AI在工作和生活场景中的应用 我们先来看"总结"功能。 这边有一篇文章叫做学习编码的好处。导入到nation https://www.likecs.com/show-203992587.html 导入方法详见上一篇文章:在Notion AI 中轻松打造您的AI私人助理…

VMware快照:简化虚拟化环境管理与数据保护

引言: 在虚拟化环境中,数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能,为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用,以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…

Threejs进阶之十五:在Thereejs 使用自定义shader

目录 最终效果什么是 ShaderShaderMaterial类常用属性uniforms属性vertexShader属性fragmentShader属性 代码实现新建ShaderView.vue文件并引入Threejs定义初始化函数创建initMesh函数实例化ShaderMaterial类实例化TextureLoader()定义uniforms 全局变量定义vertexShader顶点着…

ad18学习笔记二:绘图工具栏、活动栏

在画原理图库的时候会经常用到顶上的绘图工具栏(官方文档里叫做活动栏): 版本不同,上面的命令是不同的 ad如何自定义绘图工具栏? 网上介绍工具栏和设置的文章还挺多的,但是没有看到ad18是怎么增减绘图工具…

LeetCode高频算法刷题记录7

文章目录 1. 下一个排列【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 两数相加【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 括号生成【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 滑动窗口最大值【困难】4.1 题目描述4.2 解题思路4.3 代码实现 5. 最小覆盖子串…

c++boost库学习-07-Message Queue

一、前言 boost中的消息队列(Message Queue)是进程间通信的一种机制,实际上是其内部也是采用共享内存的方式来达到进程间通信的目的。这也就意味这Message Queue有其局限性:只有处在同一台计算机中的不同进程才能使用消息队列进行…

在原有机械硬盘的基础上集装固态硬盘并装操作系统

1、加装固态硬盘 我的电脑出场自带的是机械硬盘(即右边那个白色长方形,上面有类似于锡纸一样的东西),左边的这个光滑的正方形里面是内存条,可以拆开这个光滑的盖进行安装,而我们的固态硬盘装在左下角这个长…

性能测试——性能统计工具

性能统计工具 一、io监控命令1、io监控命令iostat2、io指标监控命令df 二、cpu监控命令1、cpu指标监控命令uptime2、cpu指标监控命令 cat /proc/cpuinfo3、cpu 指标监控命令 mpstat4、cpu指标监控命令 sar 三、mem指标监控命令1、mem指标监控命令 cat /proc/meminfo2、mem指标监…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

自动化测试技术解析:Appium、Sikuli与MonkeyTalk

目录 前言: 一、Appium自动化测试框架 它的优点是: 二、Sikuli自动化测试工具 它的优点是: 三、MonkeyTalk自动化测试工具 它的优点是: 四、代码样例 总结: 前言: 随着移动应用的普及,…

手把手教你通过PaddleHub快速实现输入中/英文本生成图像(Stable Diffusion)

近来,基于Diffusion的文图生成模型比较火,用户输入一句话,模型就可以生成一副对应的图像,还是很有意思的。本文记录了通过PaddleHub快速实现上述任务的过程,以供参考。 1、安装PaddlePaddle PaddleHub底层依赖于百度…

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 一、提出需求如何撰写百度地图标注开发的需求文档 二、针对性地连续提问推荐下一下百度地图标注文档的详细需求列表如何撰写百度地图标注开发的技术规范如何确定百度地图标注开发后的部署计划... 三、生成报价单四、运营…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理

1 模型离线推理 各步要解析如下: Host&Device内存管理与数据传输: Host&Device上的内存申请与释放,内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备∶根据禹线om的输入输出,在Device…

微信小程序富文本组件mp-html

功能介绍 支持在多个主流的小程序平台和 uni-app 中使用支持丰富的标签(包括 table、video、svg 等)支持丰富的事件效果(自动预览图片、链接处理等)支持设置占位图(加载中、出错时、预览时)支持锚点跳转、…

【Linux】在Linux操作系统下对于权限的理解

目录 ❤️前言 正文 Linux下的不同用户 Linux的权限管理 文件访问者的分类 文件类型和访问权限 文件访问权限的修改方法 默认权限 目录权限 粘滞位 🍀结语 ❤️前言 大家好!今天这篇文章主要是关于Linux操作系统下对于各种权限的理解问题&#…

AI人工智能预处理数据的方法和技术有哪些?

AI人工智能 预处理数据 在人工智能(Artificial Intelligence,简称AI)领域中,数据预处理是非常重要的一环。它是在将数据输入到模型之前对数据进行处理和清洗的过程。数据预处理可以提高模型的准确性、可靠性和可解释性。 本文将…

Springboot +spring security,基于多种方式配置登录用户:memory、jdbc、MyBatis

一.简介 前面章节所有的用户信息(用户名和密码)都是基于配置文件配置的,这篇文章学习基于多种方式配置登录用户,比如: memory(内存)jdbcMyBatis 二.创建项目 如何创建一个SpringSecurity项目,前面文章已…

Python入门【序列、列表简介、列表的创建 、列表元素的增加、列表元素的删除 】(四)-全面详解(学习总结---从入门到深化)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…