python的pytest框架
pytest和unittest的区别:
1.安装需求不同。pytest为第三方单元测试库,需额外安装;unittest为标准库,无需额外安装。
2.用例编写规则不同。pytest编写规则较为简单,兼容性较好;unittest需按照固定的格式编写,较为复杂。
pytest优点:
能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
测试用例的skip和xfail处理(执行测试过程中可以将某些测试跳过,或者对某些预期失败的case标记成失败)
可以很好的和jenkins集成
report框架----allure 也支持了pytest
支持运行由nose, unittest编写的测试case
Pytest 是 python2 自带的自动化测试框架,python3 的版本的话 pytest 框架独立出来,需要 pip 进行安装
官方文档:https://docs.pytest.org/en/latest/contents.html
pip install -u pytest
1、测试文件以 test_xx.py 命名需要以 test_开头(或_test 结尾);
2、测试类以 Test_开头,并且不能带有 init 方法;
3、测试函数或方法以 test_xx 开头;
一、编写测试用例:
pytest 执行时默认是执行指定路径下以test_开头或者以_test 结尾的文件里的测试类或者方法,默认是执行以 Test_开头的类和 test_开头的方法。
用例前置后置方法(可用fixture替代):
与unittest类似,执行前后会执行setup,teardown来增加用例的前置和后置条件。pytest框架使用setup,teardown更为灵活,按照用例运行级别可以分为以下几类
- setup_module/teardown_module 模块级别,在模块始末调用
- setup_function/teardown_function 函数级别,在函数始末调用(在类外部)
- setup_class/teardown_class 类级别,每个类里面执行前后分别执行
- setup_method/teardown_method 方法级别,在方法始末调用(在类中)
- setup/teardown 方法级别,在方法始末调用(在类中)
调用顺序:setup_module>setup_class>setup_method>setup>teardown>teardown_method>teardown_class>teardown_module
二、断言
pytest 一共有五种断言:
assert xx 判断 xx 为真
assert not xx 判断 xx 不为真
assert a in b 判断 b 包含 a
assert a == b 判断 a 等于 b
assert a !=b 判断 a 不等于 b
三、用例执行
使用命令行执行
cmd 窗口,然后执行 pytest 文件路径/测试文件名例如 pytest ./test_tt.py
如果当前路径已经是放测试用例文件的文件夹下,想要测试文件,则直接可以 输入pytest 测试文件名 即可:
如果只输入 pytest,则会默认执行当前文件夹下所有以 test_开头(或_test 结尾)的文件
如果提示pytest不是内部或者外部命令 在cmd下输入:pip install -U pytest 即可
运行参数详解:
a、无参数
读取路径下符合条件的所有类、函数、方法全部执行
b、-v
打印详细运行日志
c、-s
pytest test_se.py -s
打印print输出
d 、-k
跳过运行某个或某些用例
pytest -k '类名'
pytest -k '方法名
pytest -k '类名 and not 方法名' #运行类里所有方法,不包含某个方法
e、-x
遇到用例失败立即停止运行
f、 --maxfail
用例失败数达到某个设定的值停止运行
pytest --maxfail=[num]
pytest --maxfail =2 #出现两次失败停止执行
g、 -m
运行所有@pytest.mark.[标记名] 标记的用例
可在pycharm中使用参数
pytest.main("-s test_demo1.py")
IDE(PyChram)执行
执行当前文件所在路径下的文件,指定文件名则执行指定的文件,若没指定,执行所有 test_开头或者_test 结尾的文件。
当使用了pytest框架时,而且py文件是以test_xxx.py格式保存的,那Pycharm会以pytest形式进行运行程序,不过在这里要对pycharm进行一个设置。选择Settings-Tools-Python Integrated Tools
,然后选择Pytest点击确定即可
Pytest Exit Code 含义清单:
Exit code 0 所有用例执行完毕,全部通过
Exit code 1 所有用例执行完毕,存在Failed的测试用例
Exit code 2 用户中断了测试的执行
Exit code 3 测试执行过程发生了内部错误
Exit code 4 pytest 命令行使用错误
Exit code 5 未采集到可用测试用例文件
控制测试用例执行:
以下命令在cmd中输入:
1、在第N个用例失败后,结束测试执行
pytest -x # 第01次失败,就停止测试
pytest --maxfail=2 # 出现2个失败就终止测试
2、指定测试模块
pytest test_demo1.py
3、指定测试目录
pytest testing/
4、通过关键字表达式过滤执行
pytest -k "Test_dd"
这条命令会匹配文件名、类名、方法名匹配表达式的用例
5.通过 node id 指定测试用例
nodeid由模块文件名、分隔符、类名、方法名、参数构成,举例如下:
pytest test_mod.py::test_func
pytest test_mod.py::TestClass::test_method
6.通过标记表达式执行
pytest -m slow
这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例
7、通过包执行测试
pytest --pyargs Case1
这条命令会自动导入包Case1,并使用该包所在的目录,执行下面的用例
多进程运行用例
安装pytest-xdist
pip install -U pytest-xdist
pytest test_demo1.py -n NUM 其中NUM填写并发的进程数
pytest test_demo1.py -n 5
重试运行用例
在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。
安装pytest-rerunfailures
pip install -U pytest-rerunfailures
pytest test_se.py --reruns NUM NUM填写重试的次数
pytest test_se.py --reruns 3
四、fixture用途:
pytest fixture 与setup,teardown功能一样,但比之更加灵活,完全可以代替setup,teardown
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
fixture(scope="function", params=None, autouse=False, ids=None, name=None)
#默认为scope='function'
fixture自动调用(autouse=True)
autouse设置为True,自动调用fixture功能,无需额外继承
fixture参数化(params)
@pytest.fixture有一个params参数,接受一个列表,列表中每个数据都可以作为用例的输入。也就说有多少数据,就会形成多少用例。可以通过'''request.param'''来获取该次调用的参数
fixture返回值
五、参数化
pytest参数化Pytest是使用@pytest.mark.parametrize装饰器来实现数据驱动测试的
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为一个时 格式:[value]
当参数个数大于一个时,格式为:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
️ 参数值为N个,测试方法就会运行N次
以上是直接传参
数据短小还好说,如果数据比较长而复杂的话,那么就会很难看。
@pytest.mark.parametrize()
还提供了第三个 ids
参数来自定义显示结果
六、参数化与fixture结合(indirect=True)
#参数化结合fixture使用
#情况一:传入值和数据
#情况二:传入一个fixture方法,将数据传入到fixture方法中,fixture使用request参数来接受这组数据,在方法体中使用request.param来接受这个数据
conftest.py
1.conftest.py文件名字是固定的,不可以做任何修改
2.文件和用例文件在同一个目录下,那么conftest.py作用于整个目录
3.conftest.py文件不能被其他文件导入
4.所有同目录测试文件运行前都会执行conftest.py文件
七、Pytest配置文件
pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令行运行时会使用该配置文件中的配置
八、pytest测试报告
pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告。兼容Python 2.7,3.6
安装方式:pip install pytest-html
通过命令行方式,生成xml/html格式的测试报告,存储于用户指定路径。
使用方法: 命令行格式:pytest --html=用户路径/report.html
pytest --html=./report.html
九、跳过测试函数
根据特定的条件,不执行标识的测试函数.
方法:
skipif(condition, reason=None)
参数:
condition:跳过的条件,必传参数
reason:标注原因,必传参数
使用方法:
@pytest.mark.skipif(condition, reason="xxx")
如果不满足条件,则不回跳过函数,正常执行
十、标记预期失败函数
标记测试函数为失败函数
方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因,必传参数
使用方法:
@pytest.mark.xfail(condition, reason="xx")