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

本文最后更新于:2022年7月6日 下午

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 框架,可以通过命令进行升级安装
1
pip install -U pytest
  • 验证安装
1
pytest --version

输出 pytest 版本表明安装成功

1
2
C:\Users\Administrator>pytest --version
pytest 6.2.5

运行方式

测试类主函数模式

  • 可以在 python 中执行 pytest 命令
  • 引入 pytest 包,在python 中执行代码
1
pytest.main("-s test_abc.py")

命令行模式

  • 直接执行命令 pytest 文件路径/测试文件名
1
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

函数数据参数化

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

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

  • 参数传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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:

1
pip install -U pytest-xdist
  • 运行方法
1
pytest test_se.py -n NUM

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

参考资料


Python 测试框架 pytest —— 使用教程
https://www.zywvvd.com/notes/coding/python/python-pytest/python-pytest/
作者
Yiwei Zhang
发布于
2022年6月16日
许可协议