一.mark的用法
概念:Pytest提供的mark标记,允许我们标记测试函数,测试类和整个模块。通过不同的标记实现不同的运行策略,如标记冒烟测试用例。
1.注册标记
可以在pytest.ini文件注册自定义标记
除了自己注册的标记外,pytest还内置了一些标记:跳过,预期失败,参数化,调用fixture
第三方插件,也会内置一些标记:执行顺序,执行依赖,失败重试
2.贴上标记(装饰器)
-
使用装饰器@pytest.mark.markname标记测试函数,测试类。
-
一个mark可以标记多个测试函数,一个测试函数可以使用多个mark可以
import pytest
可标记多个
@pytest.mark.api
@pytest.mark.ui
def test01(): # 函数(写在类外边是函数)
assert 1 == 1 # 测试通过class Test:
@pytest.mark.e2e
def test01(self):
# 方法(写在类里边带有self传递的是方法)
assert 1 == 2 # 测试失败
3.筛选标记
①仅执行api标记的用例 / 仅执行api或e2e标记的用例
②pytest --markers 可以查看所有的mark标签,包括内置标记和自定义标记
pytest -m api #执行单个
pytest -m 'api or ui' # 执行两个
pytest --markers # 查看所有标记
二.fixture
1.概念:自动的在用例之前,之后完成,用于测试环境的构建和销毁;使用生成器实现前置,后置的分离
2.两种实现方式:
-
一种是xunit-style,跟unittest框架的机制非常相似,即setup/teardown系列
-
一种是它自己的fixture机制,以@pytest.fixture装饰器来申明
3.fixture与unnitest的传统单元测试(setup/teardown)区别:
- 有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
- 按模块化的方式实现,每个fixture都可以互相调用。
- fixture的范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围。
4.用法:
@pytest.fixture()
def begin():
print('123') # 前置代码,在用例之前自动执行
yield
print('456') # 后置代码,在用例执行之后自动执行
调用
import pytest
@pytest.mark.api
@pytest.mark.ui
def test01(begin): # 函数(写在类外边是函数)/使用fixture
assert 1 == 1 # 测试通过
class Test:
@pytest.mark.e2e
@pytest.mark.api
def test01(self,begin): # /使用fixture
# 方法(写在类里边带有self传递的是方法)
assert 1 == 2 # 测试失败
5.fixture的作用范围:
①支持5级范围
②同一个范围内的用例,共享fixture
③conftest.py创建全局范围fixture
三.hook
概念:Hook函数又称为钩子函数:当pytest在合适的时机,允许进入或退出pytest核心内部
目的:改变pytest原有的处理方式,运行模式;通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预。