目录
前言:
对于做自动化测试的同学,基本都知道python的单元测试框架unitest,因其为python的内置库,曝光度较高,使用较广泛,进而广为人知, 只要有点开发基础的同学,都可以比较容易上手学习并进行二次开发,那就有人就问了,为什么还要学习pytest呢? 其实可以用一个简单的比喻来形容,为什么现在手机经常换呢?答案是显而易见,技术的更新,使得功能更强大、使用更便捷。接下来重点讲解一下自己在学习pytest过程中的一些学习心得。
附pytest官方文档:https://docs.pytest.org/en/latest/contents.html
1、虚拟环境准备
前提:windows10,python3.7(已安装并加入环境变量)
进入命令行窗口执行如下指令:
python -m venv F:/my_venv(安装目录)
2、安装pytest
2.1 pycharm内安装
1、filesettingProjectProject Interpreter进入如下图页面,点击 +
2、在弹出的页面搜索pytest,并选择你想要的版本,点击 Install Package 按钮即可
2.2 命令行安装
1) 打开命令行窗口,进入步骤 1安装的虚拟环境目录下的Scripts目录中
2) 执行activate
3) pip3 install pytest==(版本号), 版本号可不填写 直接执行pip3 install pytest
4)关闭虚拟环境, 执行deactivate
3、pytest使用约束
3.1 文件命名约束
测试文件名必须以test_开头、或者以_test.py结尾
3.2 测试类
以Test开头,并且无init方法,需要测试的类方法,以test_开头命名
3.3 测试函数
以test_开头命名
4、执行方式
4.1 函数方式
pytest.main("test_zhc.py")
4.2 命令行方式
pytest test_zhc.py 执行单个测试文件
pytest F:/TEST 执行测试文件夹(批量测试文件)
5、pytest常用运行参数介绍
pytest help 查看帮助文档
-v 打印详细运行日志
-s 打印代码里面print 输出语句
-k 跳过过运行某个或者某些用例,
荔枝 pytest -k '类名'
pytest -k '方法名'
pytest -k "类名 and not 方法名" //运行类里所有的方法,不包含某个方法
-x 遇到用例失败立即停止运行
maxfail=[num] 用例失败个数达到阀值停止运行, 荔枝:pytest maxfail=5 //用例失败数达到5个即停止运行
-m [标记名] 运行做标记的用例, 配合@pytest.mark.[标记名] 使用 荔枝:pytest -m slow
6、解决大批量执行测试case问题多进程
安装pytest-xdist
pytest test_zhc.py -n 6(进程数)
7、失败重跑机制(以下两种均可)
使用场景:一些系统性因素导致结果未匹配期望值,引起测试case的失败,比如网络波动、断电等,给与重试机制以避免偶发性结果
7.1 插件pytest-repeat
命令行使用方法:pytest reruns=num1 count=num2
参数说明:reruns 指失败后重跑次数,被测case直到成功或者达到num1次数重跑停止,
count 指重复执行次数(与失败与否无关)
荔枝: pytest reruns=5 count=2 test_zhc.py
说明:test_zhc.py 该测试脚本中的测试函数 或者方法 会重复执行count=2次,
另外每次执行时,当某个函数或方法执行错误时,都会重试reruns=5次,即最坏的情况会重试2*(5+1),加1是指程序默认执行的一次
发散运用:结合前面学到的 -x 遇到用例失败立即停止运行,我们可以解决实际测试中遇到的偶发失败情景
荔枝:pytest -s count=100000 -x test_zhc.py 重复执行1W次直至失败结束
标记使用:
@pytest.mark.repeat(3)
标记某个测试方法,使其重复运行
7.2 插件pytest-rerunfailures
命令行使用方法:pytest reruns 5 reruns-delay 10 -s
装饰器使用方法:@pytest.mark.flaky(reruns=5, reruns_delay=10)
参数介绍:
reruns 失败后重跑次数
reruns-delay 失败后等待重跑秒数
8、前置动作、后置动作功能(预处理功能)
8.1 setup_function()、teardown_function()
函数级别,即执行一次测试函数,setup_function()函数都会执行,并先于测试函数执行,
同理teardown_function()也会执行一次,并后于测试函数执行
8.2 setup_class()、teardown_class()
类级别,即执行一次测试类,setup_class()函数都会执行,并先于测试类执行,
同理teardown_class()也会执行一次,并后于测试类执行
8.3 setup_method()、teardown_method ()
类方法级别,即执行一次测试类方法,setup_method()函数都会执行,并先于测试类方法执行,
同理teardown_method()也会执行一次,并后于测试类方法执行
8.4 setup_module()、teardown_module ()
模块级别,即执行一次模块,setup_module()函数都会执行,并先于模块执行,
同理teardown_module()也会执行一次,并后于测试模块执行
9、pytest配置文件之pytest.ini
当测试文件比较多时,可以建立测试文件夹,并把需要的配置文件放于测试文件夹根目录,命名为pytest.ini(存放位置和文件命名可以自定义)
命令行模式 pytest -c 配置文件
荔枝:pytest -c f:/Test/zhc.ini
配置文件如下图所示:
10、测试报告
10.1 pytest-html
需要额外安装 pip3 install pytest-html
使用方法:pytest -s test_zhc.py html="f:/report.html"
10.2 allure-pytest
可与jenkins集成,报告内容更丰富多样
需要额外安装 pip3 install allure-pytest
使用方法:
生成测试数据:pytest -s test_zhc.py alluredir ./result/
根据数据生成报告:allure generate ./result/ -o ./report/
11、pytest之精髓fixture(个人观点)
介绍:fixture作为测试前的初始化操作,前置条件,参数传递等,比如数据库连接,测试数据准备
11.1 fixture的使用方式
定义fixture
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
被装饰函数
荔枝:
scope:被装饰方法的作用阈,参数可选如下
function(默认值), 作用于测试方法,即每个测试方法都会运行一次fixture
class, 作用于测试类,即每个测试类都会运行一次fixture
module,作用于模块,即模块里所有的用例执行前会运行一次fixture
session,作用于会话,多个py文件调用一次fixture
使用fixture
1、函数或类里面方法直接传fixture的函数参数名称
2、使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
11.2、scope='function'
输出结果
11.3、scope='class' 输出结果
11.4 scope='module'输出结果
11.5 scope='session'
11.6、params之参数传递
介绍:params参数类型为list,即列表中的每一个数据会当做用例数据输入,
可用于批量输入数据的测试
使用方法:@pytest.fixture(params=[1, 3]), @pytest.fixture(params=[(1, 3), (4, 5)])
荔枝:
12、skipif跳过执行
介绍: 跳过被标识的测试函数。 使用场景:被测功能未开发完毕、测试平台环境不容许
使用方法:skipif(condition, reason)
参数condition:跳过的原因,参数类型为str、bool,当为字符串时,reason可以不填写,当为bool时必须填写reason
参数reason:跳过原因,类参数类型为str
荔枝:
13、xfail标记为预期失败
介绍: 指定被标识的测试函数失败, 被标记的case,后续代码不会被执行。 使用场景:功能依赖,例如前置功能失败,影响后续功能
使用方法:xfail(condition=None, reason=None, raises=None, run=True, strict=False)
参数condition:预期失败除法条件,参数类型为str、bool,当为字符串时,reason可以不填写,当为bool时必须填写reason:
参数reason:失败原因,参数类型为str
参数raises:具体阐释失败原因,raises可以指定具体的异常类,例如
参数run:默认为True, 当为False时,被标记的case不会被执行
参数strict:默认为False, 当为True时,保证测试为XPASS时,测试记录为FAILED
荔枝:
14、parametrize
介绍:测试用例参数化,有点类似于fixture中的params参数。 使用场景:同一case,执行大批量测试数据
使用方法:parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名,参数类型为str, 单个参数"a", 多个参数 "a, b, c"
argvalues:参数值,参数类型为list, 单个参数[1], 多个参数[(1, 2, 3), (2, 3, 4)] 列表长度决定测试方法运行的次数
荔枝:
15、统计代码覆盖率 pytest-cov
使用方法:pytest cov=参数1 cov-report=html cov-config=参数2
参数1:被测文件路径
参数2: 配置文件, 默认为 .coveragerc, 使用举例:跳过某些测试文件,
不统计覆盖率
荔枝: