本文节选自霍格沃玆测试学院内部教材,文末链接进阶学习。
在上一篇文章中分享了 pytest 的基本用法,本文进一步介绍 pytest 的其他实用特性和进阶技巧。
pytest fixtures
pytest 中可以使用 @pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中。可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数。
将 fixture 作为函数参数
通常使用 setup 和 teardown 来进行资源的初始化。如果有这样一个场景,测试用例 1 需要依赖登录功能,测试用例 2 不需要登录功能,测试用例 3 需要登录功能。这种场景 setup,teardown 无法实现,可以使用 pytest fixture 功能,在方法前面加个 @pytest.fixture 装饰器,加了这个装饰器的方法可以以参数的形式传入到方法里面执行。
例如在登录的方法,加上 @pytest.fixture 这个装饰器后,将这个用例方法名以参数的形式传到方法里,这个方法就会先执行这个登录方法,再去执行自身的用例步骤,如果没有传入这个登录方法,就不执行登录操作,直接执行已有的步骤。
创建一个文件名为“test_fixture.py”,代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture()
def login():
print("这是个登录方法")
return ('tom','123')
@pytest.fixture()
def operate():
print("登录后的操作")
def test_case1(login,operate):
print(login)
print("test_case1,需要登录")
def test_case2():
print("test_case2,不需要登录 ")
def test_case3(login):
print(login)
print("test_case3,需要登录")
在上面的代码中,测试用例 test_case1 和 test_case3 分别增加了 login 方法名作为参数,pytest 会发现并调用 @pytest.fixture 标记的 login 功能,运行测试结果如下:
plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, \
ordering-0.6, forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 3 items
test_fixture.py::test_case1 这是个登录方法
登录后的操作
PASSED [ 33%]('tom', '123')
test_case1,需要登录
test_fixture.py::test_case2 PASSED \
[ 66%]test_case2,不需要登录
test_fixture.py::test_case3 这是个登录方法
PASSED [100%]('tom', '123')
test_case3,需要登录
============================== 3 passed in 0.02s ===============================