python应用(六、自动化测试框架-pytest)

6.自动化测试框架-pytest
官网:https://pytest.org
传说中的python 鄙视链:pytest 鄙视 > unittest 鄙视 > robotframework 。

6.1 pytest简介
pytest是python的第三方单元测试框架,比自带unittest更简洁和高效,插件丰富,同时兼容 unittest 框架。
1)pytest主要特点有以下几点:
(1)简单灵活,容易上手,文档丰富;
(2)支持参数化,可以细粒度地控制要测试的测试用例;
(3)能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest + requests);
(4)pytest具有很多第三方插件,并且可以自定义扩展。流行插件:

较好用还有:
pytest-selenium(集成selenium)、
pytest-html(完美html测试报告生成)、
pytest-rerunfailures(失败case重复执行)
(5)测试用例的skip和xfail处理;
(6)可以很好的和CI工具结合,例如jenkins

2)编写pytest测试编写规则:
(1)测试文件以test_开头或以_test结尾;
(2)测试类以Test开头,并且不能带有_init_方法
(3)测试函数以test_开头
(4)断言使用基本的assert即可

6.2 安装pytest
1)pip install -U pytest # 安装pytest,如果已安装升级到最新版
2)pytest –version # 查看pytest版本,验证安装成功

6.3 两种运行方式
1)编写main(),在pycharm中运行

2)在cmd窗口,使用命令行

参数说明:
(1)-v:pytest -v 说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

(2)-s:pytest -s 说明:输入我们用例中的调式信息,比如print的打印信息等

(3)-m:pytest -m ”标记“ 说明:执行特定的测试用例。
(4)-k:pytest -k "关键字" 说明:执行用例包含“关键字”的用例
(5)-q:pytest -q 说明:简化控制台的输出,可以看出输出信息和上面的结果都不一样, 下图中有两个..点代替了pass结果

6.4 pytest前置和后置
1)类之外的前置和后置
(1)setup_module eardown_module:模块级,运行在文件始末,只运行一次
(2)setup_function eardown_function:函数级,在每个函数(用例)前后运行
(3)setup eardown:运行在调用函数的前后,setup在setup_function之后运行,teardown 在teardown_function之前运行(类中生效、类外有函数时生效)

运行结果:

2)类之内的前置和后置
(1)setup_class/teardown_class:类级,只在类中前后运行一次。
(2)setup_method/teardown_method:方法级,在每个方法(用例)前后运行
(3)setup/teardown:运行在调用方法的前后,setup在setup_method之后运行,teardown 在teardown_method之前运行(类中生效、类外有函数时生效)

运行结果:

6.5 pytest.ini配置文件
在想要pytest.ini生效的项目或目录中新建pytest.ini文件


执行结果(cmd和pycharm运行结果基本一致):

6.6 断言:assert
pytest里面的断言实际上就是python里面的assert断言方法。
  assert xx:判断xx为真
assert not xx:判断xx不为真
assert xx and yy:判断xx和yy都为真
assert xx or yy:判断xx或yy为真
  assert a in b:判断b包含a
  assert a == b:判断a等于b
assert a != b:判断a不等于b

6.7 标记:@pytest.mark.xxx装饰器
pytest可以支持自定义标记,自定义标记可以把一个web项目划分多个模块,然后指定模块名称执行。


pytest -v -m tt01 # 执行用例test_1
pytest -v -m tt # 执行用例test_1和test_2
pytest -v -m "not tt" # 执行用例test_3
pytest -v -m "tt01 or tt03" # 执行用例test_1和test_3

6.8 跳过:@pytest.mark.skip装饰器
1)@pytest.mark.skip(reason=None)
(1)默认reason为空,@pytest.mark.skip()

(2)可以装饰方法,也可装饰类。装饰类时,类中的所有方法都会跳过

2)@pytest.mark.skipif(condition, reason=None)
(1)condition为真时,跳过;为假时,执行。
(2)填写condition后,reason必填。
(3)不填condition,默认跳过

6.9 参数化:@pytest.mark.parametrize()装饰器
1)传入单个参数,@pytest.mark.parametrize(变量名,变量值)
变量名为字符串;
变量值为可迭代类型,一般使用列表

运行结果:

2)传入多个参数,@pytest.mark.parametrize(元组,元组组成的列表)

执行结果:

6.10 测试报告插件pytest-html
1)安装pytest-html插件
pip install pytest-html

2)使用pytest-html插件
在配置文件(pytest.ini)中的命令行参数中,增加:
--html=用户路径/report.html

运行测试文件后,出现测试报告:

查看测试报告:

6.11 失败重试插件pytest-rerunfailures
1)安装pytest-rerunfailures插件
pip install pytest-rerunfailures

2)使用pytest-rerunfailures插件
在配置文件(pytest.ini)中的命令行参数中,增加:
--reruns n # n是重试次数
--reruns-delay n # n是出错后,重试前的等待时间(单位:s)

测试报告中,也可以看到重试了2次

此时,三条测试用例,执行了0.12秒:

增加重试时延:
执行结果和上面相同,增加重试时延后,运行时间延长到4.15秒

6.12 案例应用
以后勤管理系统的接口测试为例,用pytest编写测试用例


测试结果:

测试报告:

6.13 pycharm 部分测试用例不执行解决方法
在pycharm中运行pytest测试用例,部分测试用例没有运行或运行后控制台没有显示pytest结果样式,可以改这里试试:
1)编辑配置
在要运行的用例中,下拉选择中点击【Edit Configuration...】

2)删除所有配置信息
点击【-】删除掉【Python tests】下面所有内容,保存退出。

原文地址:https://www.cnblogs.com/bdzxh/p/14185269.html