Pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 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
首先使用 pip 安装 pytest
pip3 install pytest
查看 pytest 是否安装成功
pip3 show pytest
Py.test相比unittest只有setUp()和tearDown(),pytest则拥有module级别、class级别、method和function级别的setup()和teardown(),能够更好地控制用例的执行。
-
setup_module()和teardown_module
如果在一个.py文件中有多个测试函数和测试类,并且只想执行执行一次setup和teardown,则可选择在该文件中使用setup_module和teardown_module。
ps:pytest3.0中,“_module”可省略
- 同样地,如果一个测试类中有多个测试方法,并且只想执行一次setup和teardown,则可选择在该类中使用setup_class和teardown_class。
3. Py.test 常用annotation总结如下;
Py.test 框架基础的注解如下;
usefixtures -在测试函数或类上使用fixture
filterwarnings -过滤测试函数的某些警告
skip -总是跳过测试函数
skipif -如果满足某个条件,则跳过测试函数
xfail -如果满足某个条件,则产生“预期失败”结果。
parametrize -对同一测试函数执行多个调用。
ALLURE 常用注解基本特性使用
@allure.feature(‘测试xiadan的撤单’) — 撤单模块
@allure.story(‘多笔撤单功能’) —子功能模块,测试用例类
@allure.step(“测试步骤”) ----引用某个函数作为操作步骤的时候使用
with allure.step(): ---- 写在测试用例函数里面
pass
添加文本说明或者附件
*@allure.title(‘子标题,市价买入页面多笔撤单’) --该用例标题
*@allure.severity(allure.severity_level.BLOCKER) --用例的级别
*@allure.testcase(url=‘https://www.baidu.com’,name=‘用例链接显示的名称’)
*@allure.issue(url=‘https://www.baidu.com’,name=‘bug管理平台’)
*@allure.attach(bady,name.attachment_type) //附加文件信息
*@allure.attach.file(source=‘源文件’,name=显示名称,attachment_type=文件类型)
以上@allure需在def或class前或函数中使用,也可使用allure.dynamic.title('title')在用例中动态添加.
4. 生成测试报告
pytest.main([‘--html=./report.html’,‘模块.py::类::test_a_001'])
运行指定模块指定类指定用例,冒号分割,并生成测试报告
pytest.main(['-x','--html=./report.html','t12est000.py'])
-x出现一条测试用例失败就退出测试
-v: 丰富信息模式, 输出更详细的用例执行信息
-s:显示print内容
-q: 简化结果信息,不会显示每个用例的文件名
pip install pytest-cov # 计算pytest覆盖率,支持输出多种格式的测试报告
pytest --cov-report=html --cov=./ test_code_target_dir