fixture是pytest用于将测试前后进行预置、清理工作的代码处理机制。
Fixture是通过yield来区分前后置的,前后置均可以单独存在,fixture如果有后置,前置不报错就都会执行,前置报错后置就不会执行。
如果我们只希望部分测试用例执行某个固件,通过set和teardown是实现不了的。但通过fixture就可以根据需要自定义测试用例的前置和后置操作。
Fixture相较于setup和teardown而言,有以下几点优势:
(1)fixture命名更加灵活,局限性较小。与set、teardown类似,fixture提供了测试执行前和测试执行后的处理,但是又比set、teardown更灵活好用,fixture命令更加灵活,不局限于set和teardown。
(2)conftest.py配置里面可以实现数据共享。不需要import就能自动找到一些配置。
1.1 fixture的介绍
fixture装饰器来标记固定的工厂函数,在其他函数、类、模块或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
源码:
def fixture( # noqa: F811
fixture_function: Optional[FixtureFunction] = None,
*,
scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" = "function",
params: Optional[Iterable[object]] = None,
autouse: bool = False,
ids: Optional[
Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]]
] = None,
name: Optional[str] = None,
) -> Union[FixtureFunctionMarker, FixtureFunction]:
语法格式:
@pytest.fixture(scope="function",params="",autouse="False",ids="",name="")
常用参数说明:
(1)Scope:被@pytest.fixture标记的方法的作用域,默认是functioon,还可以是class、module、package、session。
(2)Params:用于给fixture传参,可以实现数据基于fixture的数据驱动,接收一个可以迭代的对象,例如列表[],元组(),字典列表{[],[],[]},字典元组{(),(),()},提供参数数据供调用 fixture的用例使用;传进去的参数,可以用request.param调用。
(3)Autouse:是否自动运行,是一个布尔值,默认为False不会自动运行,需要手动调用;当为True时,作用域内的测试用例都会自动调用该fixture。
(4)Ids:用例标识ID,每个ids和params一一对应,如果没有id,将从params自动产生。
(5)Name:给被@pytest.fixture标记的方法取一个别名,如果使用了name,只能将name传入,函数名不再生效。
1.2 fixture的使用
使用方法1:自定义测试用例的前置和后置操作,实现部分用例的前后置
示例代码:仅test_Login_02需要进行前置登录,后置退出
"""Pytest单元测试框架"""
import pytest
import time
# 语法格式:@pytest.fixture(scope="function",params="",autouse="True",ids="",name="")
# 语法格式:@pytest.fixture(scope="class",autouse="True")
# def demo_fixture():
# print("前置方法,可以实现部分及全部用例的前置")
# yield
# print("后置方法,可以实现部分及全部用例的后置")
@pytest.fixture(scope="function",params=['刘备','关羽','张飞','诸葛亮'])
def demo_web_fixture(request):
print("前置方法,可以实现部分及全部用例的前置:登录")
yield request.param
print("后置方法,可以实现部分及全部用例的后置:退出")
class TestLogin:
def test_Login_01(self):
time.sleep = 3
print("Hello,I'm 996 ITBrickMover\n")
def test_Login_02(self,demo_web_fixture):
time.sleep = 3
print("Hello,I'm 997 ITBrickMover\n")
print("-------------"+str(demo_web_fixture))
def test_Login_03(self):
time.sleep = 3
print("Hello,I'm 998 ITBrickMover\n")
def test_Login_04(self):
time.sleep = 3
print("Hello,I'm 999 ITBrickMover\n")
运行结果:
D:\project\Pytest\PytestDemo\venv\Scripts\python.exe "C:/Program Files/JetBrains/PyCharm 2023.2/plugins/python/helpers/pycharm/_jb_pytest_runner.py" --path D:\project\Pytest\PytestDemo\scripts\test_login.py
Testing started at 20:45 ...
Launching pytest with arguments D:\project\Pytest\PytestDemo\scripts\test_login.py --no-header --no-summary -q in D:\project\Pytest\PytestDemo\scripts
============================= test session starts =============================
collecting ... collected 7 items
test_login.py::TestLogin::test_Login_01 Hello,I'm 996 ITBrickMover
PASSED
test_login.py::TestLogin::test_Login_02[\u5218\u5907]前置方法,可以实现部分及全部用例的前置:登录
Hello,I'm 997 ITBrickMover
-------------刘备
PASSED后置方法,可以实现部分及全部用例的后置:退出
test_login.py::TestLogin::test_Login_02[\u5173\u7fbd]前置方法,可以实现部分及全部用例的前置:登录
Hello,I'm 997 ITBrickMover
-------------关羽
PASSED后置方法,可以实现部分及全部用例的后置:退出
test_login.py::TestLogin::test_Login_02[\u5f20\u98de]前置方法,可以实现部分及全部用例的前置:登录
Hello,I'm 997 ITBrickMover
-------------张飞
PASSED后置方法,可以实现部分及全部用例的后置:退出
test_login.py::TestLogin::test_Login_02[\u8bf8\u845b\u4eae]前置方法,可以实现部分及全部用例的前置:登录
Hello,I'm 997 ITBrickMover
-------------诸葛亮
PASSED后置方法,可以实现部分及全部用例的后置:退出
test_login.py::TestLogin::test_Login_03 Hello,I'm 998 ITBrickMover
PASSED
test_login.py::TestLogin::test_Login_04 Hello,I'm 999 ITBrickMover
PASSED
============================== 7 passed in 0.03s ==============================
Process finished with exit code 0
截图说明:
本章总结
Fixture是通过yield来区分前后置的,前后置均可以单独存在。fixture如果有后置,前置不报错就都会执行,前置报错后置就不会执行。
如果我们只希望部分测试用例执行某个固件,通过set和teardown是实现不了的。但通过fixture就可以根据需要自定义测试用例的前置和后置操作。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。