• pytest框架:mark标记功能详解


    一、mark标记

    在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分的用例时怎么办?

    pytest提供了一个非常好用的mark功能,可以给测试用例打上各种各样的标签,运行用例时可以指定运行某个标签。mark功能作用就是灵活的管理和运行测试用例。

    标签既可以打到方法上,也可以打到类上,标记的两种方式:

    • 直接标记类或方法或函数:@pytest.mark.标签名
    • 类属性:pytestmark = [pytest.mark.标签名, pytest.mark.标签名],需要注意的是属性名称是固定的
    • import pytest
    1. import pytest
    2. @pytest.mark.beta # 可以给类打标签
    3. class TestLogin: # 标记类
    4. @pytest.mark.qc
    5. @pytest.mark.beta # 也可以多个标签
    6. def test_login(self): # 标记方法
    7. pass
    8. @pytest.mark.smoke # 单个标签
    9. def test_register(): # 标记函数
    10. pass
    11. class TestClass:
    12. # 加一个 pytestmark的类属性
    13. pytestmark = [pytest.mark.qc, pytest.mark.beta] # 标签存放在一个列表
    14. pytest.main()

    同时,我也为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接点击文末小卡片免费领取资料文档

    软件测试视频教程观看处:

    华测教育软件测试进阶全套视频教程(2023全网最新版,软件测试进阶自学必备)

    二、注册标签名

    我们要想运行已经打好标记的函数,还需要对标签名进行注册,告诉pytest有哪些标签,如果不进行注册运行时(pytest的高级版本)可能会报警告让你进行注册。

    我们只需要在项目根目录下创建一个pytest.ini文件,注意文件名是不可修改的,否则pytest会找不到。内容格式如下:

    1. # pytest.ini
    2. # 只能修改=右边的值
    3. [pytest]
    4. python_files = demo_*.py # 模块名以demo_开头
    5. python_functions = demo_* # 方法名以demo_开头
    6. python_classes = Demo* # 类名名以Demo开头
    7. # 注册标签
    8. markers =
    9. qc
    10. beta
    11. smoke

    三、运行指定的标签

    通过命令行执行

    单个标签:pytest -m "标签名" (-m意思是执行标签mark),不想执行某个标签可以用not来取反,即pytest -m "not 标签名"

    多个标签:可以加上判断,pytest -m "qc and beta" 或者 pytest -m "qc or beta" 效果是一样的

    注意:标签名一定要加双引号,单引号是会报错的。

    四、通过代码执行

    这里普及一下,main()方法是可以接收不定长参数的,因此可以把要执行的命令放在一个列表中

    1. if __name__ == '__main__':
    2. pytest.main(['-m qc and beta', '-s']) # 标签名不需要加引号

    关于pytest的指令,可以通过控制台执行pytest --help查看,上面举例中-s命令是指打印更加详细的信息,如果程序运行过程当中的print()信息打印不出来,可以加上-s可选参数,它是-- capture=no的缩写。

    五、skip跳过标记

    在维护测试用例的过程中,可能在一个阶段某些用例已经不需要了,或者在指定条件下是不需要运行的,那么我们就可以通过mark.skip跳过这些函数或者类,两种跳过方式:

    • 直接跳过: @pytest.mark.skip(reason = “原因”),这里原因是可选参数
    • 条件跳过,即满足某个条件才跳过:@pytest.mark.skipif(a == 1, reason = “原因”)
    1. db_host = 'localhost'
    2. @pytest.mark.skip("和现在的需求不符合") # 不满足当下了,或别人编写的暂时不能删的
    3. def test_yuz(self):
    4. pass
    5. @pytest.mark.skipif(db_host == 'localhost', reason='只测试线上环境,不测试本地环境')
    6. def test_develop_env(self):
    7. pass

    六、写在最后

    PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。

    ☑ 240集-零基础到精通全套视频课程
    ☑ [课件+源码]-完整配套的教程
    ☑ 18套-测试实战项目源码
    ☑ 37套-测试工具软件包
    ☑ 268道-真实面试题
    ☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)

    这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

  • 相关阅读:
    C++ | 简单线程池的实现
    【AGC】如何快速部署Serverless抽奖模板
    基于HSIC-GL的多元时间序列非线性Granger因果关系分析
    15-Linux部署HBase集群
    整合 Windows 365,Win 11 实现双系统模式
    LeetCode——1417.重新格式化字符串
    PyQT6关联信号槽 (六) 百篇文章学PyQT6
    20 - 欲知JVM调优先了解JVM内存模型
    可视化拖拽组件库一些技术要点原理分析(四)
    JPA常见异常 JPA可能抛出的异常
  • 原文地址:https://blog.csdn.net/HUA1211/article/details/134079931