【pytest官方文档】解读Skipping test functions,跳过测试用例详解

简介: 【pytest官方文档】解读Skipping test functions,跳过测试用例详解

有时候,为了满足某些场景的需要,我们知道有些测试函数在这时候肯定不能执行,或者执行了也会失败。那么我们

可以选择去跳过这个测试函数,这样也就不会影响整体的测试函数运行效果,不至于在你运行的众多绿色通过的测试

用例中,给你加点红色的failed或者error。


举个例子,有些测试函数只能在windows上运行,那么换了个Linux平台就不可以,就需要跳过这个测试函数。再比如,

有些测试用例会有一些外部资源的依赖,像数据库,那么当数据库资源不可用的时候,也需要去跳过这个测试函数。


在pytest中提供了这样一个机制来跳过测试函数。


一、skip


用法很简单,只要在需要跳过的测试函数上面安上@pytest.mark.skip()即可。可以传递一个参数reason,填写

跳过的理由,不填也可以。


@pytest.mark.skip(reason="没啥理由,就不想执行")
def test_the_unknown():
    ...


运行结果:


test_skipif.py                                                          [100%]
============================= 1 skipped in 0.02s ==============================s
Skipped: 没啥理由,就不想执行
Process finished with exit code 0


可以看到,这个测试用例被成功跳过,并且还有reason的输出。不过pytest默认情况下,不会显示跳过的测试函数的详细信息,

避免输出与正常的混在一起,太乱。


二、pytest.skip(reason)


1. 在测试函数或者fixture函数里使用


除了上述用法,还可以用pytest.skip(reason)函数,在测试函数中或者setup函数里进行跳过。比如,当有些参数不符合你

的预期,那么就跳过后面的执行。


上示例代码:


import pytest
@pytest.fixture()
def demo_fixture(request):
    test_input = request.param
    if test_input == 3:
        pytest.skip("传入的值等于3就跳过执行")
@pytest.mark.parametrize("demo_fixture", [1, 3], indirect=True)
def test_the_unknown3(demo_fixture):
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_skipif.py"])


在上述代码里,我在测试函数test_the_unknown3里做了一个参数化,并且在fixture函数demo_fixture拿到这个参数。


按理来说,参数化了1和3,所以测试函数会执行2次。


我在fixture函数里加了判断,当拿到的参数,等于3的时候,就跳过执行。所以最终的运行结果应该是,1执行,3跳过。


test_skipif.py                                                         [100%]
======================== 1 passed, 1 skipped in 0.09s =========================.s
Skipped: 传入的值等于3就跳过执行
Process finished with exit code 0


结果符合预期。


这个用法,刚好解决了我一个实际问题。


那就是别的小组有不少人写case用的测试数据,是会通过别的case或者别的接口调用后传递过来的,那么当这些依赖有问题的时候

case运行就会有问题,导致误报。如果使用pytest.skip(reason)这个函数,那么可以有效缓解case误报的问题。


2. allow_module_level=True跳过整个模块


如果你需要判断某些条件符合时候,就要整个模块都跳过,就可以加上这个参数allow_module_level=True


import pytest
a = 1
if a != 3:
    pytest.skip("a不等于3就跳过整个文件模块", allow_module_level=True)
@pytest.fixture()
def demo_fixture(request):
    test_input = request.param
    if test_input == 3:
        pytest.skip("传入的值等于3就跳过")
@pytest.mark.parametrize("demo_fixture", [1, 3], indirect=True)
def test_the_unknown1(demo_fixture):
    ...
def test_the_unknown2():
    ...
def test_the_unknown3():
    ...


运行一下:


============================= 1 skipped in 0.02s ==============================
Skipped: a不等于3就跳过整个文件模块
Process finished with exit code 0


三、skipif


1. skipif有条件的跳过


上面提到了在函数里写判断,当满足某个条件时通过pytest.skip函数来跳过,其实还可以直接用skipif,同样可以

达到有条件地跳过某些内容的目的。


import sys
@pytest.mark.skipif(sys.version_info < (4, 0), reason="版本4.0以下就跳过执行")
def test_function():
    print(sys.version_info)


运行结果:


test_module1.py                                                         [100%]
============================= 1 skipped in 0.02s ==============================s
Skipped: 版本4.0以下就跳过执行
Process finished with exit code 0


2.模块之间共享skip标记


比如说,我现在有2个测试模块,分别是test_module1.pytest_module2.py

我在test_module1.py当中,定义一个skipif作为marker 共享,也就是not_equal_5


那么在test_module2.py当中导入这个marker,就可以直接使用了,看代码效果:


# content of test_module1.py
import pytest
import sys
version_judge = pytest.mark.skipif(
    sys.version_info < (4, 0), reason="版本4.0以下就跳过执行"
)
@version_judge
def test_the_unknown2():
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_module1.py"])


test_module2.py中导入marker使用,运行后的预期结果,应该是test_the_unknown1跳过执行。


# content of test_module2.py
import pytest
from interface.demo.test_module1 import version_judge
@version_judge
def test_the_unknown1():
    ...
def test_the_unknown2():
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_module2.py"])


运行下test_module2.py:


test_module2.py                                                        [100%]
======================== 1 passed, 1 skipped in 0.08s =========================s
Skipped: 版本4.0以下就跳过执行
.
Process finished with exit code 0


四、跳过类或模块下的所有测试函数


1. 跳过类下的所有测试函数


如果把skipif放在类上,这个类下面的所有测试函数都会跳过。


import pytest
import sys
version_judge = pytest.mark.skipif(
    sys.version_info < (4, 0), reason="版本4.0以下就跳过执行"
)
@version_judge
class TestDemo():
    def test_the_unknown2(self):
        ...
    def test_the_unknown3(self):
        ...
def test_the_unknown1():
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_module1.py"])


运行结果,类TestDemo下的2个测试方法都会被跳过。


test_module1.py                                                       [100%]
======================== 1 passed, 2 skipped in 0.09s =========================s
Skipped: 版本4.0以下就跳过执行
s
Skipped: 版本4.0以下就跳过执行
.
Process finished with exit code 0


2.跳过模块下的所有测试函数


如果想跳过模块的所有测试函数,可以使用全局变量pytestmark:


import pytest
import sys
pytestmark = pytest.mark.skipif(sys.version_info < (4, 0), reason="版本4.0以下就跳过执行")
class TestDemo():
    def test_the_unknown2(self):
        ...
    def test_the_unknown3(self):
        ...
def test_the_unknown1():
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_module1.py"])


运行,模块下的3个测试都会被跳过


test_module1.py                                                       [100%]
============================= 3 skipped in 0.02s ==============================s
Skipped: 版本4.0以下就跳过执行
s
Skipped: 版本4.0以下就跳过执行
s
Skipped: 版本4.0以下就跳过执行
Process finished with exit code 0


另外,如果多个skipif装饰器应用于同一个测试函数,只要任何一个条件为真,该函数将被跳过。


五、跳过文件或目录


有时可能需要跳过一整个文件或目录。例如,有文件里的代码你不想去执行。在这种情况下,必须从pytest搜集到的集合中排除文件和目录。


有关更多信息,请参阅自定义测试集合,后续看情况单独分享。


六、导入依赖失败跳过


当有些依赖的包导入失败的时候,可以通过pytest.importorskip这个函数来跳过。同样,可以用在模块级别,fixture函数或者测试函数里。


import pytest
# docutils = pytest.importorskip("docutils")
class TestDemo():
    def test_the_unknown2(self):
        ...
    def test_the_unknown3(self):
        pytest.importorskip("docutils")
def test_the_unknown1():
    ...
if __name__ == "__main__":
    pytest.main(["-s", '-r' "test_module1.py"])


运行结果,应该是跳过一个,执行2个:


test_module1.py                                                       [100%]
======================== 2 passed, 1 skipped in 0.09s =========================.s
Skipped: could not import 'docutils': No module named 'docutils'
.
Process finished with exit code 0


代码里的docutils是一个第三方库,你也可以根据库的版本号跳过:


docutils = pytest.importorskip("docutils", minversion="0.3")


版本将从指定模块的__version__属性中读取,如果不符合条件,也会跳过。


七、总结


  1. 无条件跳过模块中的所有测试


pytestmark = pytest.mark.skip("all tests still WIP")


  1. 基于某些条件跳过模块中的所有测试


pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="tests for linux only")


  1. 如果缺少某些导入,则跳过模块中的所有测试


pexpect = pytest.importorskip("pexpect")


相关文章
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
149 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
21 2
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
69 6
基于Python访问Hive的pytest测试代码实现
|
2月前
|
测试技术
软件测试用例设计之微信群抢红包经典用例
作者在浏览招聘网站时遇到为微信群发和抢红包设计测试用例的问题,作为软件测试新手,作者通过实际体验并撰写测试案例来加深对业务的理解,并分享了测试案例表格。需要注意的是,该用例未考虑添加银行卡支付、红包类型选择及红包描述。
82 5
软件测试用例设计之微信群抢红包经典用例
|
2月前
|
人工智能 测试技术 Python
基于 LangChain 的自动化测试用例的生成与执行
本章节详细介绍了如何利用人工智能技术自动化完成Web、App及接口测试用例的生成与执行过程,避免了手动粘贴和调整测试用例的繁琐操作。通过封装工具包与Agent,不仅提升了测试效率,还实现了从生成到执行的一体化流程。应用价值在于显著节省时间并提高测试自动化水平。
|
2月前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
3月前
|
前端开发 关系型数据库 测试技术
django集成pytest进行自动化单元测试实战
在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试框架,Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。
49 3
django集成pytest进行自动化单元测试实战
|
3月前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
|
3月前
|
传感器 算法 Ubuntu
大疆M2006电机测试文档
本文是关于大疆RoboMaster M2006电机的测试文档,介绍了在Ubuntu20.04环境下通过ROS读取电机反馈信息、控制电机移动,并利用PID控制算法实现速度闭环的测试流程,涵盖了测试材料、接线方法、电机校准、CAN通讯测试以及在ROS中的移植和PID调节的详细步骤和方法。
156 0
大疆M2006电机测试文档
|
3月前
|
人工智能 自然语言处理 测试技术
基于LangChain手工测试用例转接口自动化测试生成工具
本文介绍利用大语言模型自动生成接口自动化测试用例的方法。首先展示传统通过HAR文件生成测试用例的方式及其局限性,随后提出结合自然语言描述的测试需求与HAR文件来生成更全面的测试脚本。通过LangChain框架,设计特定的提示词模板,使模型能够解析测试需求文档和HAR文件中的接口信息,并据此生成Python pytest测试脚本。示例展示了正常请求、非法请求及无效路径三种测试场景的自动化脚本生成过程。最终,整合流程形成完整代码实现,帮助读者理解如何利用大模型提高测试效率和质量。

热门文章

最新文章