Python 测试框架 pytest —— 使用教程

2022-08-10 14:25:36 浏览数 (1)

pytest是一个非常成熟的全功能的Python测试框架 。文本记录该框架的使用方法。

简介

  • pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:
    • 简单灵活,容易上手
    • 支持参数化
    • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest requests)
    • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
    • 测试用例的skip和xfail处理
    • 可以很好的和jenkins集成
    • report框架----allure 也支持了pytest
  • 官方文档: https://docs.pytest.org/en/latest/contents.html

pytest 规范

  • pytest 在自动测试时需要遵循一定规则,这些规则可以修改,默认情况为:
    • 所有的单测文件名都需要满足test_*.py格式或*_test.py格式。
    • 在单测文件中,测试类以Test开头,并且不能带有 __init__ 方法 注意:定义class时,需要以大写T开头
    • 在单测类中,可以包含一个或多个test_开头的函数。
    • 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。

安装

  • 默认情况下 python 自带 pytest 框架,可以通过命令进行升级安装
代码语言:javascript复制
pip install -U pytest

  • 验证安装
代码语言:javascript复制
pytest --version

输出 pytest 版本表明安装成功

代码语言:javascript复制
C:UsersAdministrator>pytest --version
pytest 6.2.5

运行方式

测试类主函数模式
  • 可以在 python 中执行 pytest 命令
  • 引入 pytest 包,在python 中执行代码
代码语言:javascript复制
pytest.main("-s test_abc.py")

命令行模式
  • 直接执行命令 pytest 文件路径/测试文件名
代码语言:javascript复制
pytest ./test_abc.py

  • console中的指令

指令含义

指令

用于详细显示日志信息

-v

测试结果的简单统计

-rA

只显示整体测试结果

-q

帮助

-h

显示print打印信息

-s

输出html格式报告

–html=path输出路径

生成log报告

–resultlog=./log.txt (6.1 版本之后被删除)

生成xml报告

–junitxml=./log.xml

当错误达到num时,停止测试

–maxfail=num

只运行有MARKEXPR(自定义)标记的测试

-m MARKEXPR

生成简略的指定需求的报告

-r option

函数数据参数化

  • 方便测试函数对参数的调用:
代码语言:javascript复制
@pytest.mark.parametrize(argnames,argvalues, indirect=False, ids=None, scope=None)
argnames:参数名
argvalues:参数对应值,可传多个值,类型必须为list [(values1,values2,…),(value1,value2,…)]

pytest 会将定义好的参数列表逐个填入到参数位置中执行代码,有多少个执行多少遍

  • 参数传递
代码语言:javascript复制
import pytest

'''
parametrize
'''

class Test02:
    def setup_class(self):
        print("---------setup_class----------")
    def teardown_class(self):
        print("------------teardown_class-------------")

    # 传递单参数
    @pytest.mark.parametrize("a",[3,6])
    def test_09(self,a):
        print("a = %d" % a)
        assert a%3 == 0

    # 传递多参数
    @pytest.mark.parametrize('a,b',[(0,3),[1,2]])
    def test_10(self,a,b):
        print("%d   %d = %d" % (a,b,a b))
        assert a b == 3




if __name__ == "__main__":
    pytest.main(['-s','-v','test_case05.py::Test02::test_10'])

多进程运行cases

  • 当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。
  • 安装pytest-xdist:
代码语言:javascript复制
pip install -U pytest-xdist

  • 运行方法
代码语言:javascript复制
pytest test_se.py -n NUM

其中NUM填写并发的进程数。

参考资料

  • https://zhuanlan.zhihu.com/p/356599211
  • https://blog.csdn.net/IT_LanTian/article/details/121356143
  • https://blog.csdn.net/weixin_42724501/article/details/116562575

0 人点赞