Pytest精通指南(16)利用skip、skipif跳过用例执行

news2024/10/5 20:26:40

文章目录

      • 前言
      • skip源码分析
      • skip装饰方法
      • skip装饰类
      • skip装饰模块
      • skipif源码分析
      • skipif装饰方法
      • skipif装饰类
      • skipif装饰模块
      • 拓展-用例内部跳过执行


请添加图片描述

前言

skip:

  • skip用于无条件地跳过测试用例,无论测试环境的状态或条件如何。
  • 通常用于那些在任何情况下都不应该执行的测试用例,比如因为测试环境受限或特定条件下不需要执行。
  • 使用skip可以明确地指示某些测试用例不被执行,而不是因为它们失败而被标记为失败。

skipif:

  • skipif用于根据特定条件跳过测试用例。
  • 它允许定义一个条件表达式,当该表达式为真时,相应的测试用例会被跳过。
  • 这在功能未开发完成或某些用例在特定环境下无法运行时非常有用。通过使用skipif,可以避免在不满足测试条件的情况下执行这些用例,从而避免不必要的错误或失败。

补充描述:

  • skipskipif都是pytest框架提供的装饰器,用于控制测试用例的执行。
  • 使用skip时,不需要提供任何条件,它会无条件地跳过相应的测试用例。
  • 使用skipif时,需要提供一个可评估为TrueFalse的条件表达式。
  • 如果条件为真,则跳过测试用例;如果条件为假,则执行测试用例。
  • 这两个装饰器都提供了注释或说明来解释为什么跳过测试用例,这对于理解测试策略和测试结果非常有帮助。

总结来说,skip用于无条件跳过测试用例,而skipif则根据特定条件来决定是否跳过测试用例。

skip源码分析

这段代码是pytest框架内部的一部分,用于处理测试用例的跳过。

它定义了一个特殊的装饰器类_SkipMarkDecorator,这个类继承自MarkDecorator,并覆盖了其__call__方法以处理跳过的逻辑。

通过使用@overload装饰器,它提供了两种调用方式:

  • 一种是直接标记一个可标记的对象,
  • 另一种是提供一个跳过的原因并返回一个可以用于进一步操作的MarkDecorator实例。

结论:

  • 方法:skip(reason=None)
  • 参数:可选参数reason,用于标注跳过的原因,会在测试结果中显示
  • 使用方法:@pytest.mark.skip(reason="xxx")
    class _SkipMarkDecorator(MarkDecorator):
        @overload  # type: ignore[override,misc,no-overload-impl]
        def __call__(self, arg: Markable) -> Markable:
            ...

        @overload
        def __call__(self, reason: str = ...) -> "MarkDecorator":
            ...

skip装饰方法

示例代码

import pytest


# 使用skip装饰器跳过测试
@pytest.mark.skip(reason="测试skip强制跳过该测试用例执行")
def test_case_01():
    print("测试skip强制跳过该测试用例执行")
    assert 1 == 1

执行效果

请添加图片描述

skip装饰类

示例代码

import pytest


# 使用skip装饰器跳过测试
@pytest.mark.skip(reason="测试skip强制跳过该测试用例执行")
def test_case_01():
    print("测试skip强制跳过该测试用例执行")
    assert 1 == 1


@pytest.mark.skip(reason="测试skip强制跳过该类中的所有测试用例执行")
class TestClassDemo1:
    print("进入类内部")

    def test_case_02(self):
        print("测试skip强制跳过 test_case_02 执行")
        assert 1 == 1

    def test_case_03(self):
        print("测试skip强制跳过 test_case_03 执行")
        assert 1 == 1

执行结果

请添加图片描述

skip装饰模块

示例代码

import pytest

pytestmark = pytest.mark.skip(reason="跳过该模块中所有的测试用例函数")


# 使用skip装饰器跳过测试
# @pytest.mark.skip(reason="测试skip强制跳过该测试用例执行")
def test_case_01():
    print("测试skip强制跳过该测试用例执行")
    assert 1 == 1


# @pytest.mark.skip(reason="测试skip强制跳过该类中的所有测试用例执行")
class TestClassDemo1:
    print("进入类内部")

    def test_case_02(self):
        print("测试skip强制跳过 test_case_02 执行")
        assert 1 == 1

    def test_case_03(self):
        print("测试skip强制跳过 test_case_03 执行")
        assert 1 == 1

执行结果

请添加图片描述

skipif源码分析

在这段源码中,定义了一个名为_SkipifMarkDecorator的类,它继承自MarkDecorator。这个类似乎是用来处理条件性跳过测试用例的装饰器;意味着它可能是用于标记或修改测试行为的装饰器,特别是在满足某些条件时跳过测试。

在这个方法中,_SkipifMarkDecorator接收两个参数:condition*conditions,以及一个可选的reason参数。

  • condition: 这是一个位置参数,可以是一个字符串或一个布尔值。如果它是一个字符串,可能是一个条件表达式;如果是一个布尔值,它直接决定了是否跳过测试。
  • *conditions: 这是一个可变位置参数,意味着你可以传入任意数量的条件。这些条件可能是额外的字符串或布尔值,用于进一步定义何时跳过测试。
  • reason: 这是一个关键字参数,用于提供跳过测试的原因。这个信息通常用于在测试报告中显示,帮助开发者理解为什么测试被跳过。
    class _SkipifMarkDecorator(MarkDecorator):
        def __call__(  # type: ignore[override]
            self,
            condition: Union[str, bool] = ...,
            *conditions: Union[str, bool],
            reason: str = ...,
        ) -> MarkDecorator:
            ...

skipif装饰方法

示例代码

import pytest


@pytest.mark.skipif(condition=True, reason="测试skipif条件成立时跳过该测试用例执行")
def test_case_01():
    print("测试skipif条件成立时跳过 test_case_01 ")
    assert 1 == 1


@pytest.mark.skipif(condition=False, reason="测试skipif条件成立时跳过该测试用例执行")
def test_case_02():
    print("测试skipif条件成立时跳过 test_case_02")
    assert 1 == 1


@pytest.fixture
def data():
    return "hello"


# 定义一个函数,该函数返回是否应该跳过测试的条件
def should_skip_test():
    # 获取 data fixture 的值
    value = data()
    # 根据 value 的值决定是否跳过测试
    return value.startswith("h")


# @pytest.mark.skipif(condition=data().startswith("h"), reason="测试skipif条件成立时跳过该测试用例执行")
@pytest.mark.skipif(condition=should_skip_test, reason="测试skipif条件成立时跳过该测试用例执行")
def test_case_03():
    print("测试skipif条件成立时跳过 test_case_03")
    assert 1 == 1

执行结果

请添加图片描述

skipif装饰类

示例代码

import pytest


@pytest.mark.skipif(condition=True, reason="测试skipif条件成立时跳过该测试用例执行")
class TestClassDemo2:
    print("进入类的内部")

    def test_case_01(self):
        print("测试skipif条件成立时跳过 test_case_01 ")
        assert 1 == 1

    def test_case_02(self):
        print("测试skipif条件成立时跳过 test_case_02")
        assert 1 == 1

    def test_case_03(self):
        print("测试skipif条件成立时跳过 test_case_03")
        assert 1 == 1

执行结果

请添加图片描述

skipif装饰模块

示例代码

import sys

import pytest

pytestmark = pytest.mark.skipif(sys.platform == "darwin", reason="Mac系统中跳过该模块中的所有测试用例")
print("进入模块的内部")


# @pytest.mark.skipif(condition=True, reason="测试skipif条件成立时跳过该测试用例执行")
class TestClassDemo2:
    print("进入类的内部")

    def test_case_01(self):
        print("测试skipif条件成立时跳过 test_case_01 ")
        assert 1 == 1

    def test_case_02(self):
        print("测试skipif条件成立时跳过 test_case_02")
        assert 1 == 1

    def test_case_03(self):
        print("测试skipif条件成立时跳过 test_case_03")
        assert 1 == 1

执行结果

请添加图片描述

拓展-用例内部跳过执行

示例代码

import pytest
import platform


def test_case_01():
    print("进入test_case_01函数")
    if platform.system() == "Darwin":
        print("进入if判断")
        pytest.skip(reason="Darwin系统下跳过执行")
        print("Darwin系统下跳过执行")
    else:
        print("执行成功")

执行结果

请添加图片描述

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

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

相关文章

idea使用plantuml插件报错(类图):Dot Executable: /opt/local/bin/dot

报错提示: 解决方式: 方式一: 直接设置Remote Rendering即可 (使用服务器地址) 无特殊要求可直接使用默认提供的服务地址,也可自行搭建服务替换地址。 自行搭建服务可参考: 在本地Windows 11 系统的桌面…

分布式调度器

xxl-job介绍 xxl-job 是一个轻量级分布式任务调度框架,支持动态添加、修改、删除定时任务,支持海量任务分片执行,支持任务执行日志在线查看和分页查询,同时支持任务失败告警和重试机制,支持分布式部署和高可用。xxl-j…

中文编程入门(Lua5.4.6中文版)第十三章 Lua 文件操作

在《Lua世界》的冒险旅途中,勇士们时常需要与神秘的文本卷轴打交道。为了更好地掌握这些知识宝藏,Lua I/O库提供了两种强大的探索模式:简单模式和完全模式,助你轻松应对各类文献挑战。 简单模式:初识卷轴 简单模式如…

结构体及应用;结构体指针及应用;union、enum、typedef三个关键字

结构体及应用 参考文章链接:https://blog.csdn.net/zw1996/article/details/53844585结构体的声明 结构体的初始化 注意如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了。 /这样是可以的,在定义变量的时候就初始化了…

顺序表(增删减改)+通讯录项目(数据结构)+顺序表专用题型

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下,就像大家去吃饭,然后左边是苍蝇馆子,右边是修饰过的苍蝇馆子,但是那个好看的苍蝇馆子一看,这不行啊&a…

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…

Ethereum WebSocket接口实践

之前在学习Ethereum的infura API时候看到有WebSocket,但是翻了很久都没找到很完整的接口文档和实践文档。当时比较迷,没太在意,以为是区块链接口的性能还用不上WebSocket,HTTP完全支持没问题。 后面在更深入学习了jsonrpc协议之后…

面试官:一个Java对象占用多大内存?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

校园智能水电预付费管理系统

校园智能水电预付费管理系统是一种专为学校水电资源管理而设计的智能化系统,旨在提供全面的水电资源管理解决方案,满足校园管理者对水电资源管理的需求。该系统整合了先进的智能技术和云计算,为校园管理者提供了实时监控、自动计费、节能管理…

Windows 部署ChatGLM3大语言模型

一、环境要求 硬件 内存:> 16GB 显存: > 13GB(4080 16GB) 硬盘:60G 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本,以获得最佳的推理性能 二、部…

docker安装EelasticSearch、目录权限修改、并安装IK 中文分词器

文章目录 docker安装EelasticSearch、目录权限修改、并安装IK 中文分词器1、docker安装ES2、docker ps发现容器没有正常启动,docker logs 容器id 查看日志发现是挂载目录的权限不足3、修改目录的权限4、使用docker restart 容器id重新启动刚才没有启动成功的容器5、…

人工智能揭示矩阵乘法的新可能性

人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时,即使像乘法矩阵(二维数字表)这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性,但也很诱人。除了魔方…

嵌入式工程师如何摸鱼?

有老铁问我,做嵌入式开发要加班吗? 也不知道搞什么鬼,现在的年轻人对加班这么抵触。 我刚做开发那会,啥也不懂,每天基本都要加班到晚上7-9点不等,我并不抵触加班,因为早早回家,也没什…

【文献分享】PCCP:机器学习 + 分子动力学 + 第一性原理 + 热学性质 + 微观结构

分享一篇关于机器学习 分子动力学 第一性原理 热学性质(密度、粘度、扩散系数) 微观结构的文章。 感谢论文的原作者! 关键词: 1. Machine learning, 2. Deep potential, 3. Molecular dynamics 4. Molten salt, 5. Thermo…

10-菜刀连接木马

找到了漏洞后,并且上传了木马之后才能使用的两款工具 中国菜刀和冰蝎 想办法获取别人的cookie,cookie中有session-id 一、中国菜刀 1、必须提前已经完成木马植入然后才能使用 2、木马必须是POST请求,参数自定义,在菜刀里给出…

苹果系统如何使用CorelDRAW?coreldraw苹果版使用指南

有不少粉丝使用的是苹果的电脑或者笔记本,想要利用最新的M系列芯片带来的长续航便利,实现外出时进行创意设计的工作。 那如何才能在苹果系统使用CorelDRAW?2个方法分享给大家: 一、购买Mac版CorelDRAW 从2020版开始&#xff0c…

预分region解决热点问题(面试题)

一、题目:如何解决hbase中遇到的热点问题? 1、问题引入 在默认的拆分策略中 ,region的大小达到一定的阈值以后才会进行拆分,并且拆分的region在同一个regionserver中 ,只有达到负载均衡的时机时才会进行region重分配!并且开始如果有大量的数据进行插入操…

【HormonyOS4+NEXT】TypeScript基础语法详解

🙋‍ 一日之际在于晨 ⭐本期内容:TypeScript基础语法详解 🏆系列专栏:鸿蒙HarmonyOS4NEXT:探索未来智能生态新纪元 文章目录 前言变量与类型函数类与接口类(Class)接口(Interface&am…

基于51单片机点滴输液控制系统LCD显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机点滴输液控制系统LCD显示 1. 主要功能:2. 讲解视频:3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机点滴输液控制系统LCD显示( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上…

Ubuntu上安装Chrome浏览器

安装步骤 1.下载安装chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb2.安装Chrome浏览器 sudo dpkg -i google-chrome-stable_current_amd64.debsudo apt-get -f install3.启动Chrome浏览器 查看收藏夹里的Chrome图标 单击C…