详细介绍pytest单元测试框架,这篇文章,准备了好长的时间。写得很全面、介绍得很彻底,我很确定,一定会给你很大的收获。
作者是一个互联网行业的小测试,只为将自已学过的,工作中运用到的,及之前碰到的疑难问题且得到解决方面,和大家分享。作者将从UI自动化测试、接口自动化、简易Web开发框架、各种测试工具、基础运维小知识等方面,跟各位大神一起探讨。
一、pytest简介
1.1 简述pytest
稍微有一点基础的测试,或者接触过python语言,首先想到的肯定是unittest。但是,今天我们再来详细掌握另一款单元测试框架–pytest。
官网中是这样描述pytest的:
pytest: helps you write better programs。
CET-4翻译:pytest:帮你们写更好的程序。
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.
CET-4翻译:pytest框架让我们更轻松的写更小型的测试,但是它支持扩展应用程序和库的复杂功能测试。
1.2 pytest插件安装
正如上面官网中描述的一样,它有着强大的插件,那先介绍几个基本的插件:
- pytest-html -->生成html格式的测试报告
- pytest-xdist -->测试用例分布式执行
- pytest-ordering -->改变测试用例的执行顺序
- pytest-rerunfailures -->用例失败后重新运行
- allure-pytest -->生成测试报告
开始安装上述插件,以往我们都是一个一个通过pip install安装,但是,太慢了。现在换一种方式,全部一次性安装。
- 首先,在D盘根目录,新建一个txt文件,将上面5个复制到文件中,去掉空格和中文
- 打开cmd,输入如下命令:
pip install -r d:\py.txt
cmd中安装效果如下:
1.3 查看是否安装成功
cmd中,直接输入命令:pip list
pip list
如上图,还多帮我们装了两个。代表安装成功。如不放心,还可通过pip show pytest-html 查看。
pip show pytest-html
二、pytest的应用
2.1 pytest的使用规则
2.1.1 模块名必须以test_开头或者_test结尾
2.1.2 测试类必须以Test开头,且不能有init方法
2.1.3 测试方法必须以test开头
发现没?这一点,和unittest是一样的。
2.1.4 测试执行顺序
- 默认从上到下,与unittest不一样。用例中使用test_01如果不是第一条用例,则不会第一执行它。
- 如果想要改变它的执行顺序,可通过pytest独有的方式,来改变执行顺序。
函数前加:@pytest.mark.run(order=1),则首先执行该函数。(如未安装,则需要安装插件:pytest-ordering,但我们刚才已经批量安装过了)
2.2 pytest演示
A. 新建一个pytest_pro项目
B. pytest_pro目录中再新建一个testcase的目录
C. testcase目录中新建一个test_demo.py文件
D. test_demo.py文件中,代码如下(-vs:显示详细信息):
2.3 pytest的运行
2.3.1 普通线性运行代码
- 代码中,直接右键选择run 文件名
- 命令行中运行
命令行中又分为直接在IDE中终端运行和cmd中运行。
A. pycharm终端–>Terminal运行:
=============================================================== 1 passed in 0.07s ================================================================
B. 进入cmd中,切换到当前目录运行
2.3.2 多线程运行
仍以上面例子为例,增加至四条用例,每条用例等待2秒钟:
正常来说,运行时间至少是8秒钟。
但是,现在,我们可以通过(-n times)多线程来运行,快速运行用例。
-
代码中直接运行:
-
IDE终端运行:
pytest -vs ./test_demo.py -n 2
-
cmd中运行
python test_demo.py -n 2
很明显,比之前的线性执行更快。-n 后面的数字,根据你的需求进行更改即可。
2.3.3 失败用例的重跑
- 将第3条用例,改成失败用例,运行。
以pycharm终端运行为例:
pytest -vs ./test_demo.py --reruns 3
–reruns 3:代表失败用例的重新运行次数
2.4 通过ini配置文件运行
2.4.1 编码格式:ANSI
2.4.2 可以改变pytest默认的规则
如更改test_开头的函数
2.4.2 运行时读取ini文件
在项目目录中,新建一个ini文件,可根据自已喜好,更改默认的姿势。详情见下图:
如果需要更改,不以test开头的文件,则将:testpath= 后面接所需的名称即可。
2.5 分组执行
可将用例,添加一个类似tag的标记,执行用例的时候,可指定这些标记来执行。先将配置文件增加标记:
固定格式:**@pytest.mark.[标识]
运行结果如下:
结果中可看出,会显示运行了几个,未选中几个。
当然,也可以同时运行几个标记的用例,用or连接即可。如下图
2.6 跳过用例
2.6.1. 直接跳过
方法中添加命令:
@pytest.mark.skip
2.6.2. 根据条件跳过
添加代码:
@pytest.mark.skipif(条件,reason='XXX')
假如条件成功,则跳过。
2.7 pytest的前置和后置
1. setup与teardown,setup_class与teardown_class
1. setup与teardown
pytest与unittest类似,都有setup与teardown,但是不同的是,unittest中setUp与tearDown有大写,而pytest都是小写。如下:
2. setup_class与teardown_class
每个测试类的开始和结束
2.8 全局的前置和后置
2.8.1 conftest.py文件
- 新建一个confftest.py文件,固定名字。
import pytest
@pytest.fixture(scope='function',params=['irving','james','paul'])
def pz(request): #pz为自定义名
print('全局前置')
yield request.param
print('全局后置')
- 再在需要全局变量的用例中,添加pz函数名
如,只在test_01_hua1用例中添加了全局装置pz
运行后,查看结果:
运行结果中可以看出,只有添加了全局函数的test_01_hua用例中,才有全局前置与后置,其他的用例中则没有。
2.9 数据驱动
代码格式:
@pytest.mark.parametrize(参数名,数据)
示例:
@pytest.mark.parametrize('name,age',[['irving','28'],['james','36']])
def test_02_hua2(self,name,age):
print('this is test two------>')
print(name,age)
运行结果如下:
会执行2次。这就实现了日子基本的数据驱动,或者说参数化。
三、生成测试报告
1. 通过pytest-html生成测试报告
1.1 配置文件中增加报告路径配置
1.2 运行后查看报告
终端运行后,查看报告路径中的报告,用浏览器打开,如下图:
很显示,不是一般的丑。看不下去,接下来,介绍第二种漂亮的报告。
2. 通过pytest+allure生成报告
1. 下载allure
下载allure又需要以下几步来实现:
- 下载allure库,上面已经安装过了,不再重复。
- 下载allure工具,点击这里下载,如果github打不开,可以联系我。
点击下载
2. 环境变量
- 下载到本地后,不需要再安装,直接解压即可。将bin目录添加到环境变量path中
- 查看是否成功
cmd中输入:
allure --version
当然,全局成功,经常会出现在pycharm终端报错的情况,我们也可以在pycharm中输入allure --version验证
出现这种报错的时候,不要慌,是因为你需要重启IDE工具,重启一下pycharm,再输入命令,就OK了
ok了。我们生成报告了。
3. 生成allure测试报告
-
在全局中添加参数
-
生成json昨日报告
在用例中运行后,会在临时文件中生成json文件
-
生成allure报告
在运行文件中,添加参数os.system(‘allure generate ./temp -o ./report --clean’)
allure generate: pytest 规定
./temp: json临时报告路径
-o:output
./report:报告路径
–clean:清空原数据
运行后查看:
已经生成 了一个测试报告,我们通过谷歌打开查看成果:
我们已经生成了一个漂亮的报告:可以从中看到运行时间、测试套件、包名等信息。
OK,至此pytest已经详细安排上了。从头到尾下来,想念可以给你很多收获。