python自动化测试框架——pytest
本文介绍了Pytest测试框架的核心功能及扩展应用。主要内容包括:1) Fixture的使用方法、作用域控制(function/class/module/session)、yield关键字实现setup/teardown逻辑,以及通过conftest.py共享Fixture;2) Mark标记系统的应用,如skip/skipif/xfail参数化测试等,并说明自定义标记的配置方法;3) 常用插件介
一、固件Fixture
1.Fixture使用
需要将哪一个方法作为fixture使用,就在该方法前添加装饰器@pytest.fixture(),
@pytest.fixture(scope='function',params=None,autouse=False,ids=None,name=None)
调用Fixture:
当测试用例需要调用Fixture时可以通过直接在用例里加Fixture参数;
如果一个测试类中所有的测试用例都需要用到Fixture,每个用例需要传参很麻烦,这时候选择在类上添加装饰器@pytest.mark.userfixtures(),使整个类都调用Fixture
注意: 如果Fixture有返回值,那就不能适用usefixtures,因为usefixtures调用的是代码逻辑
import pytest
#test_01.py
@pytest.fixture()
def fixture_prepare():
print('this is fixture prepare')
def test_fixture1(fixture_prepare):
print('test_fixture1')
def test_fixture2(fixture_prepare):
print('test_fixture2')
if __name == '__main__':
pytest.main(['-vs','test_01.py'])
2.Fixture的作用域
指定固件的使用范围,可通过scope参数声明
function: 函数级别,默认级别,每个测试方法执行前都会执行一次
class: 类级别,每个测试类执行前执行一次
module: 模块级别,每个模块执行前执行一次,即每个.py文件执行前执行一次
session:会话级别,一次测试只执行一次,即多个文件调用一次
3.autouser自动使用
提供两个布尔值,True和False(默认),当autouse=True时可以自动就爱那个测试固件Fixture自动添加到测试用例上,这样就不需要每次必须传参即可使用测试固件。
4.yield的使用
使用yield关键字可以把同一组的准备、销毁工作编写在一起,yield后面的内容相当于测试框架中的tearDown的收尾工作。
使用yield关键字注意一下几点:
(1)如果测试用例中的代码出现异常或者断言失败,并不会影响固件中yield后面代码的执行
(2)如果固件中yield之前的代码出现异常,那么测试方法不会继续执行,关键字yield后面的代码也不会再执行
(3)yield后面或前面的代码执行几次取决于Fixture装饰器给出的参数作用域
5.共享Fixture功能
如果每执行一个测试用例都要复写一遍登录显然是不合理的,因此需要将登录写成一个方法,然后共享给所有需要使用的测试用例即可达到复用的目的,在Pytest框架下提供一个共享Fixture的功能,只需要创建一个名为conftest.py的文件,将需要共享的功能在此定义,其他测试文件会自动查找。
使用conftest.py文件需要注意以下几点:
(1)conftest.py文件名称固定,不能更改
(2)conftest.py需要与运行的用例文件在同一个package下,并且存在__init__.py文件
(3)使用conftest.py时不需要import导入,pytest用例会自动识别
(4)如果conftest.py放在项目的根目录下,则对全局生效。如果放在某个package下则只对package下的用例文件有效,允许存在多个conftest.py文件
(5)conftest.py文件不能被其他文件导入
(6) 所有同目录测试文件运行前都会执行conftest.py文件
二、Mark标记
1.@pytest.mark.skip(reason=None)
@pytest.mark.skip(reason="功能暂未实现")
def test_unimplemented():
assert False # 不会执行
2.@pytest.mark.skipIf(condition)
@pytest.mark.skipif(sys.version_info < (3, 8), reason="需 Python 3.8+")
def test_python38_feature():
assert sys.version_info >= (3, 8)
3.@pytest.mark.xfail(condition,reason=None,...)
x标识预期断言结果为错误,执行后结果是失败的;X表示预期断言结果为错误,执行后结果是成功的
4.@pytest.mark.parametrize(argnames,argvalues)
5.@pytest.mark.usefixtures(fixturename1,fixtruename2,...)
@pytest.fixture
def db_conn():
return Database()
@pytest.mark.usefixtures("db_conn") # 自动应用 db_conn fixture
class TestDB:
def test_query(self):
assert self.db_conn.query("SELECT 1") is not None
6.@pytest.mark.tryfirst
7.@pytest.mark.trllast
8.@pytest.mark.filterwarnings(warning)
9.mark自定义标记
需要再pytest.ini中预先声明标记,避免运行时警告
[pytest]
markers =
slow: 标记为慢速测试(可添加描述)
smoke: 冒烟测试
windows_only: 仅限 Windows 平台运行
linux_only: 仅限 Linux 平台运行
命令行运行特定标记的测试
pytest -m smoke # 只运行标记为 smoke 的测试
pytest -m "slow and not windows_only" # 慢速且非 Windows 专属测试
pytest -m "smoke or linux_only" # 冒烟测试或 Linux 专属测试
pytest --markers 查看所有标记
三、pytest插件
1.插件的安装与卸载
pip install pytest-NAME NAME为插件名
pip uninstall pytest-NAME 卸载
2.查看活动插件
pytest --trace-config
3.插件注销
pytest -p no: NAME NAME为插件名
4.实用的插件
pytest-sugar 增加进度条并立即显示失败的测试
pytest-xdist 允许开启多个进程,同时执行多个测试用例
pytest-allure-adaptor 生成漂亮的测试报告
pytest-instafail 在测试运行期间报告失败
pytest-rerunfailures 失败用例重跑
pytest-ordering 可以指定一个测试套中的所有用例执行顺序
pytest-cov 覆盖率报告
四、Allure测试报告
1.安装allure,网站https://github.com/allure-framework/allure2/release进行下载,下载allure2.10.0
2.命令行运行pip install pytest-allure-adaptor命令
3.命令行中运行pytest --alluredir ./result/ 报告数据生成,在result文件夹中存放运行后产生的测试数据json文件
4.命令行运行 allure generate ./result/ -output ./report/ --clean 生成HTML格式的测试报告,--clean清除allure报告路径后再生成一个新的报告,-output生成报告的路径
更多推荐
所有评论(0)