之前做接口自动化测试接触的都是python+unittest+ requests+HTMLTestRunner,现在公司用的是pytest,趁周末的时间先整体熟悉下~

 

一、概述

pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:

  • 1、简单灵活,容易上手,文档丰富;
  • 2、支持参数化,可以细粒度地控制要测试的测试用例;
  • 3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
  • 4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
  • 5、测试用例的skip和xfail处理;
  • 6、可以很好的和CI工具结合,例如jenkins

 

二、安装

1、安装:

pip install pytest

2、验证安装:

pytest --version

 

pytests 测试标题中文乱码 pytest print_用例

 

三、简单使用说明

1、pytest框架约束

所有的单测文件名都需要满足test_*.py格式或*_test.py格式。
在单测文件中,测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的)
在单测类中,可以包含一个或多个test_开头的函数
在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。

 

2、简单示例

下面是最简单的一个示例

pytests 测试标题中文乱码 pytest print_pytests 测试标题中文乱码_02

下面我们以这个最简单的例子来举例

 

3、pytest运行方式

(1)测试函数模式,如上图:

pytest.main(['test_demo.py'])

(2)命令行模式:pytest 文件路径/测试文件名

例如:

pytest pytest_demo.py

 

4、控制测试用例执行

(1)在第N个用例执行失败后,结束测试执行

pytest -x  pytest_demo.py                  # 第01次失败,就停止测试
pytest --maxfail=2  pytest_demo.py         # 出现2个失败就终止测试

(2)指定测试模块

pytest pytest_demo.py

(3)指定测试目录

pytest pytest_test/

(4)通过关键字表达式过滤执行

pytest -k "not 3"  #执行的时候会跳过test_3,只执行test_1和test_2

(5)通过node id指定测试用例

node id由模块名、分隔符、类名、方法名、参数构成,举例:

运行模块中的指定用例: 

pytest test_demo.py::test_1 #只运行test_1

因为上面的例子上没有类,如果存在类的话指定的方法是一致的

(6)通过标记表达式执行

pytest -m slow # 这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例

(7)通过包执行测试

pytest --pyargs pkg.testing # 这条命令会自动导入包 pkg.testing,并使用该包所在的目录,执行下面的用例。

 

5、多进程运行cases

如果cases量比较大的话,运行的时间可能会很长,这时候就需要多进程来运行

安装pytest-xdist:

pip install -U pytest-xdist

运行模式:

pytest test_demo.py -n NUM # 其中NUM填写并发的进程数。


6、重试运行cases

在做接口测试后,503或者网络波动,可能导致case运行失败,此时可以通过重试运行case的方式来解决

安装pytest-rerunfailures:

pip install -U pytest-rerunfailures

运行:

pytest test_se.py --reruns NUM # 其中NUM填写重试的次数


7、如何显示print内容

在运行脚本时,我们会通过print来调试或者打印一些内容,加上-s就可以了。

pytest test_demo.py -s

另外,pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行个进程,又想打印出print的内容。可以用:

pytest test_demo.py -s -n 3