我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。
目录
1.fxiture参数化入门
1.1介绍
fixture函数可以被参数化, 在这种情况下他们可以被多次调用,每次执行一组依赖测试,即依赖于这个fixture的测试.测试函数通常不需要知道它们的重新运行.fixture参数化有助于为组件编写详细的功能测试,这些组件本身可以通过多种方式进行配置.
1.2示例代码
文件名: test_demo.py
import pytest
@pytest.fixture(params=["杨过", "小龙女", "黄蓉"])
def login(request):
# 通过request.param获取当前参数
print("用户" + request.param + ": 进行登录")
def test_demo(login):
print("测试用例")
1.3运行结果
1.4分析结果
通过上述例子,我们可以看出fixture参数化后,有多少个参数就会进行几组依赖测试.然后我们可以通过request.param获取当前的参数.
2.为fixture各参数设置ID
2.1介绍
pytest 将构建一个字符串,该字符串是参数化夹具中每个夹具值的测试 ID,比如我们上述图片中,左侧那些乱码(其实就是我们的参数值,只不过是中文,所以出现了乱码),如果我们没有设置ID,那么pytest默认就使用参数值,如果我们设置了ID,那么就会用我们的ID.如果我们在黑窗口(cmd)中显示ID,那么我们在执行的时候需要增加pytest运行参数: pytest --collect-only将显示生成的ID.
2.2示例代码
文件名: test_demo.py
import pytest
@pytest.fixture(params=["杨过", "小龙女", "黄蓉"], ids=["yg", "xln", "hr"])
def login(request):
print("用户" + request.param + ": 进行登录")
def test_demo(login):
print("测试用例")
2.3运行结果
2.4结果分析
我们设置了ID后,可以看到左侧的列表,fixture执行的每组用例,都有我们设置上去的ID.
注意: 我们使用ID后,一定要跟前面的参数对应,不然会报错.
import pytest
@pytest.fixture(params=["杨过", "小龙女", "黄蓉"], ids=["yg"])
def login(request):
print("用户" + request.param + ": 进行登录")
def test_demo(login):
print("测试用例")
3.使用带有参数化fixture的标记
3.1介绍
pytest.param()可用于在参数化夹具的值集中应用标记,其方式与可与@pytest.mark.parametrize一起使用的方式相同。
3.2示例代码
文件名: test_demo.py
import pytest
@pytest.fixture(params=[0, 1, pytest.param(2, marks=pytest.mark.skip)])
def login(request):
print("用户" + request.param + ": 进行登录")
def test_demo(login):
print("测试用例")
3.3运行结果
3.4分析结果
我们通过在fixtrue参数中标记,然后完成了跳过第三次执行.
4.配置fixture参数化自动分组测试
4.1介绍
pytest 在测试运行期间最大限度地减少活动夹具的数量。如果您有一个参数化的夹具,那么使用它的所有测试将首先使用一个实例执行,然后在创建下一个夹具实例之前调用终结器。除此之外,这简化了对创建和使用全局状态的应用程序的测试。
4.2示例代码
文件名: test_demo.py
import pytest
@pytest.fixture(scope="module", params=["mod1", "mod2"])
def modarg(request):
param = request.param
print(" SETUP modarg", param)
yield param
print(" TEARDOWN modarg", param)
@pytest.fixture(scope="function", params=[1, 2])
def otherarg(request):
param = request.param
print(" SETUP otherarg", param)
yield param
print(" TEARDOWN otherarg", param)
def test_0(otherarg):
print(" RUN test0 with otherarg", otherarg)
def test_1(modarg):
print(" RUN test1 with modarg", modarg)
def test_2(otherarg, modarg):
print(" RUN test2 with otherarg {} and modarg {}".format(otherarg, modarg))
4.3运行结果
4.4分析结果
上面这个例子是官网的例子,里面内容比较多,也不太容易观察,首先有两个点,一个是test0是最先执行的,它的fixture函数是函数级别的,所以正常的执行了两次.但是test1和test2就不同了,它这里是需要理解几个地方.
首先,他执行test1,然后执行了模块级别的fixture(modarg),然后这里的执行顺序就改变了,这样改变的方式会让我们尽可能的少的激活资源.然后它的执行顺序就是:
(最外层第一轮分组)前置mod1->test_1Run->前置otherarg1->test_2Run->后置otherarg1->前置otherarg2->test_2Run->后置otherarg2->后置mod1->
(最外层第二轮分组)前置mod2->test_1Run->前置otherarg1->test_2Run->后置otherarg1->前置otherarg2->test_2Run->后置otherarg2->后置mod2
通过上述的顺序,相信大家应该明白了标题所说的自动分组测试了吧,其实就是范围较大的fixture只会在范围较小的fixture参数化执行完后在执行范围较大的fixture的第二轮.
可能大家又会问为什么在test_2上面的modarg没有执行,那是因为modarg是模块级别,在这个模块的周期中只会执行一次.