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


文章目录

      • 前言
      • 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("执行成功")

执行结果

请添加图片描述

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

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

相关文章

深入解析Rivest Cipher 4:理论与实践

title: 深入解析Rivest Cipher 4:理论与实践 date: 2024/4/17 20:30:58 updated: 2024/4/17 20:30:58 tags: 密码学RC4算法流密码密钥调度安全分析优缺点应用实践 第一章:引言 密码学简介: 密码学是研究如何保护通信和信息安全的学科。它涉…

国内外AI programmer 大全集--持续更新

国内: 通义灵码: 公司:阿里巴巴集团旗下的阿里云发布年份:未明确指出具体年份,但已在2024年4月3日前入职并上岗一段时间名称:通义灵码工号:AI001 iFlyCode: 公司:科大…

RabbitMQ-核心特性

已经不需要为RabbitMQ交换机的离去而感到伤心了,接下来登场的是RabbitMQ-核心特性!!! 文章目录 核心特性消息过期机制消息确认机制死信队列 核心特性 消息过期机制 官方文档:https://www.rabbitmq.com/ttl.html 可以给每条消息指定一个有效期&#xf…

git 分支-变基

在git中,将一个分支的更改集成到另一个分支有两种主要方式:合并(merge)和变基(rebase)。在本节中,将学习什么是变基,如何执行变基操作,为什么它是一个非常强大的工具&…

C++ 一个有关类模板、构造函数、析构函数、拷贝构造、重载等的数组案例分析

文章目录 概要根据代码和输出进行分析(看注释和图示)个人小结 概要 案例描述: 实现一个通用的数组类,要求如下: 可以对内置数据类型以及自定义数据类型的数据进行存储;将数组中的数据存储到堆区;构造函数…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 ,使用QTCreator打开项目pro文件,编译报出很多系统库 及本地文件中的一些问题,具体如图: 后续,我以为…

【b站李同学的Lee】Part 2 模块化开发 NodeJS+Gulp基础入门+实战

课程地址:【NodeJSGulp基础入门实战】 https://www.bilibili.com/video/BV1aE411n737/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 4 Node.js模块化开发 4.1 JavaScript开发弊端 4.1.1 文件依赖 4.1.2 命名冲突 4.2 生活中的…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项,带大家入门~(多图预警,建议收藏~) 一、入门及常见玩法 1、注册并添加服务器(会的童鞋可跳过~) …

DC-9渗透测试复现

DC-9渗透测试复现 目的: 获取最高权限以及flag 过程: 信息打点--sql注入- 文件包含漏洞-Knockd开门开启ssh连接-hyjra爆破-sudo提权(文件追加) 环境: 攻击机:kali(192.168.85.137) 靶机:DC_3(192.168.85.141) …

GPT状态和原理 - 解密OpenAI模型训练

目录 1 如何训练 GPT 助手 1.1 第一阶段 Pretraining 预训练 1.2 第二阶段:Supervised Finetuning有监督微调 1.3 第三阶段 Reward Modeling 奖励建模 1.4 第四阶段 Reinforcement Learning 强化学习 1.5 总结 2 第二部分:如何有效的应用在您的应…

【Linux】Linux信号

目录 信号的概念 生活中的信号 Linux中的信号 kill命令 kill 命令的使用 常见的信号 命令行代码示例 注意事项 信号的处理方式 产生信号 信号的捕捉 信号捕捉示意图 内核如何实现信号捕捉 信号的捕捉与处理 小结 阻塞信号 信号在内核中的表示图 信号集操作函数…

如何学习嵌入式Linux?

如何去学习嵌入式 Linux 呢?嵌入式底层开发毫无疑问是一项极为关键重要的技术,其被广泛地应用于形形色色的嵌入式系统之中。伴随科技的迅猛飞速发展,嵌入式系统已然成为了我们生活中不可或缺的一个组成部分,这也极为凸显出了嵌入式…

基于 Bazel 的 iOS Monorepo 工程实践

在之前很长一段时间里,哔哩哔哩 iOS 工程是使用 Polyrepo(或者说 Multirepo,即多仓库)的传统模式进行开发。但是随着业务的发展,我们的代码仓库的数量也随之膨胀,我们慢慢发现 Polyrepo 模式并不一定是适合…

DDoS攻击愈演愈烈,谈如何做好DDoS防御

DDoS攻击是目前最常见的网络攻击方式之一,各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲,每次DDoS攻击的平均成本为20万美元。可见,我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外,更重要…

手机副业赚钱秘籍:让你的手机变成赚钱利器

当今社会,智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步,手机不再仅仅是通讯工具,而是化身为生活伴侣与工作助手。在这个信息爆炸的时代,我们时常会被一种焦虑感所困扰:如何能让手机超越消磨时光的定…

关于Git的一些基础用法

关于Git的一些基础用法 1. 前言2. 使用GitHub/gitee创建项目2.1 创建账号2.2 创建项目2.3 下载仓库到本地2.4 提交代码到远端仓库2.5 查看日志2.6 同步远端仓库和本地仓库 1. 前言 首先说一个冷知识(好像也不是很冷),Linux和git的创始人是同…

CC254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公…

C++:类型转换

目录 1、C语言中的类型转换 2、C的四种类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3 RTTI 1、C语言中的类型转换 如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值…

TexStudio + MikTex 手动安装宏包

遇到上面这个 “宏包安装” 提示窗口后,设置来源为本地,随后在这个网址 https://mirrors.ustc.edu.cn/CTAN/systems/win32/miktex/tm/packages/ 下载所需的宏包,放到本地仓库里,即可 有三个宏包是必须要有的,它们是索…

上下文输入无限制,谷歌发布Infini-Transformer

去年,百川智能发布号称全球最长的上下文窗口大模型Baichuan2-192K,一次性可输入35万字,超越GPT-4。 今年3月,Kimi智能助手宣布在上下文窗口技术上突破200万字。 紧追其后,国内各大互联网巨头纷纷布局升级自家大模型产…