pytest学习和使用10-Pytest中的测试用例如何跳过执行?

简介: pytest学习和使用10-Pytest中的测试用例如何跳过执行?

1 引入

  • 有时候我们需要对某些指定的用例进行跳过,或者用例执行中进行跳过,在Unittest中我们使用skip()方法;
  • Pytest中如何使用呢?
  • Pytest中也提供了两种方式进行用例的跳过 skip、skipif

2 Unittest中的用例跳过

# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_unittest_skip.py
# 作用:验证unittest的skip
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import unittest

class TestCase(unittest.TestCase):
    def test_1(self):
        print("用例1")

    def test_2(self):
        print("用例2")

    @unittest.skip("该用例不执行,没用")
    def test_3(self):
        print("用例3")


if __name__ == '__main__':
    unittest.main()
======================== 2 passed, 1 skipped in 0.05s =========================

进程已结束,退出代码 0
PASSED                           [ 33%]用例1
PASSED                           [ 66%]用例2
SKIPPED (该用例不执行,没用)     [100%]
Skipped: 该用例不执行,没用

3 pytest.mark.skip

  • pytest.mark.skip 可标记无法运行的测试功能,或者您希望失败的测试功能;
  • 简单说就是跳过执行测试用例;
  • 可选参数reason:是跳过的原因,会在执行结果中打印;
  • 可以使用在函数上,类上,类方法上;
  • 使用在类上面,类里面的所有测试用例都不会执行;
  • 作用范围最小的是一个测试用例;
  • 这个功能和unittest基本是一样的。
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_skip.py
# 作用:验证pytest的skip功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest

@pytest.fixture(scope="module")
def start():
    print("打开浏览器,输入用户名和密码登陆")
    # yield
    # print("关闭浏览器")

def test_1(start):
    print("用例1......")

def test_2(start):
    print("用例2......")

@pytest.mark.skip(reason="用例3不用执行")
def test_3(start):
    print("用例3......")

class TestA():

    def test_4(self):
        print("用例4......")

    @pytest.mark.skip(reason="用例5不用执行")
    def test_5(self):
        print("用例5......")

@pytest.mark.skip(reason="该类中的用例不用执行")
class TestB():
    def test_6(self):
        print("用例6......")


if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_skip.py"])
test_pytest_skip.py::test_1              打开浏览器,输入用户名和密码登陆
PASSED                                   [ 16%]用例1......

test_pytest_skip.py::test_2 PASSED       [ 33%]用例2......

test_pytest_skip.py::test_3 SKIPPED      (用例3不用执行)  [ 50%]
                                          Skipped: 用例3不用执行

test_pytest_skip.py::TestA::test_4 PASSED  [ 66%]用例4......

test_pytest_skip.py::TestA::test_5 SKIPPED (用例5不用执行)  [ 83%]
                                            Skipped: 用例5不用执行

test_pytest_skip.py::TestB::test_6 SKIPPED (该类中的用例不用执行)   [100%]
                                            Skipped: 该类中的用例不用执行


======================== 3 passed, 3 skipped in 0.04s =========================

4 pytest.skip()

  • pytest.skip()不同于pytest.mark.skippytest.mark.skip是作用于整个测试用例;
  • pytest.skip()是测试用例执行期间强制跳过不再执行剩余内容;
  • Python中break 跳出循环类似,如下:
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_skip1.py
# 作用:验证pytest的skip()函数功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import time

@pytest.fixture()
def start():
    print("打开浏览器,输入用户名和密码登陆")
    yield
    print("关闭浏览器")

def test_1(start):
    print("用例1......")
    i = 1
    while True:
        print(time.time())
        i += 1
        if i == 6:
            pytest.skip("打印5次时间后,第六次不再打印了~")

if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_skip1.py"])
test_pytest_skip1.py::test_1 打开浏览器,输入用户名和密码登陆
SKIPPED (打印5次时间后,第六次不再打印了~)  [100%]用例1......
1668677189.0525532
1668677189.0525532
1668677189.0525532
1668677189.0525532
1668677189.0525532

Skipped: 打印5次时间后,第六次不再打印了~
关闭浏览器


============================= 1 skipped in 0.02s ==============================
  • pytest.skip(msg="",allow_module_level=True )时,设置在模块级别跳过整个模块,如下:
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_skip2.py
# 作用:验证pytest的skip()参数allow_module_level=True功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import time
import sys

if sys.platform.startswith("win"):
    pytest.skip("跳过Windows平台的用例", allow_module_level=True)

@pytest.fixture()
def start():
    print("打开浏览器,输入用户名和密码登陆")
    yield
    print("关闭浏览器")

def test_1(start):
    print("用例1......")
    i = 1
    while True:
        print(time.time())
        i += 1
        if i == 6:
            pytest.skip("打印5次时间后,第六次不再打印了~")


if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_skip2.py"])
collected 0 items / 1 skipped

============================= 1 skipped in 0.02s ==============================

5 pytest.mark.skipif()

  • 在条件满足时,跳过某些用例;
  • 参数为pytest.mark.skipif(condition, reason="")
  • condition需要返回True才会跳过。
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_skipif.py
# 作用:验证pytest的skipif()功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import time
import sys

@pytest.mark.skipif(sys.platform == "win32", reason="Windows平台不执行")
class TestA():
    @pytest.fixture()
    def start(self):
        print("打开浏览器,输入用户名和密码登陆")
        yield
        print("关闭浏览器")

    def test_1(self, start):
        print("用例1......")
        i = 1
        while True:
            print(time.time())
            i += 1
            if i == 6:
                pytest.skip("打印5次时间后,第六次不再打印了~")


if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_skipif.py"])
test_pytest_skipif.py::TestA::test_1 SKIPPED (Windows平台不执行)         [100%]
Skipped: Windows平台不执行


============================= 1 skipped in 0.02s ==============================

6 跳过标记

  • 简单理解为把pytest.mark.skippytest.mark.skipif 赋值给一个标记变量;
  • 不同模块之间共享这个标记变量;
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_skipif1.py
# 作用:验证pytest的skipif()功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import time
import sys

mark1 = pytest.mark.skipif(sys.platform == "win32", reason="Windows平台不执行")
mark2 = pytest.mark.skip("不用执行这个用例")

@mark1
class TestA():
    @pytest.fixture()
    def start(self):
        print("打开浏览器,输入用户名和密码登陆")
        yield
        print("关闭浏览器")

    def test_1(self, start):
        print("test case 1 ......")

@mark2
def test_2(self, start):
    print("test case 2 ......")


if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_skipif1.py"])
test_pytest_skipif1.py::TestA::test_1 SKIPPED (Windows平台不执行)        [ 50%]
Skipped: Windows平台不执行

test_pytest_skipif1.py::test_2 SKIPPED (不用执行这个用例)                [100%]
Skipped: 不用执行这个用例


============================= 2 skipped in 0.02s ==============================

7 pytest.importorskip

  • 参数为:( modname: str, minversion: Optional[str] = None, reason: Optional[str] = None )
参数 说明
modname 模块名
minversion 版本号
reason 原因
  • 作用为:如果缺少某些导入,则跳过模块中的所有测试;
  • pip list下,我们找一个存在的版本的包试试:

在这里插入图片描述

  • 比如attrs,版本为20.3.0,代码如下:
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_importskip.py
# 作用:验证pytest的importskip功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import amqp

attrs = pytest.importorskip("attrs", minversion="20.3.0")
@attrs
def test_1():
    print("=====模块不存在")

def test_2():
    print("=====模块存在")

if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_importskip.py"])
Skipped: could not import 'attrs': No module named 'attrs'
collected 0 items / 1 skipped

============================= 1 skipped in 0.05s ==============================
  • 再比如sys,版本为1.1.1,引入包后,显示如下:
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_pytest_importskip1.py
# 作用:验证pytest的importskip功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest
import sys

sys1 = pytest.importorskip("sys", minversion="1.1.1")

@sys1
def test_1():
    print(sys.platform)
    print("=====模块存在")


if __name__ == '__main__':
    pytest.main(["-s", "test_pytest_importskip1.py"])
Skipped: module 'sys' has __version__ None, required is: '1.1.1'
collected 0 items / 1 skipped

============================= 1 skipped in 0.03s ==============================
目录
相关文章
|
27天前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
42 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
27天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
129 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
9天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
24 2
|
10天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
19 2
|
27天前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
49 1
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
49 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
10天前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
10天前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
10天前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS