自动化测试框架:fixture的介绍与用法,让你的工作更灵活!

1、fixture的介绍与用法

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装饰器来标记固定的工厂函数,在其他函数、类、模块或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。

源码:

 
  1. def fixture(  # noqa: F811

  2.     fixture_function: Optional[FixtureFunction] = None,

  3.     *,

  4.     scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" = "function",

  5.     params: Optional[Iterable[object]] = None,

  6.     autouse: bool = False,

  7.     ids: Optional[

  8.         Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]]

  9.     ] = None,

  10.     name: Optional[str] = None,

  11. ) -> 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需要进行前置登录,后置退出

 
  1. """Pytest单元测试框架"""

  2. import pytest

  3. import time

  4. # 语法格式:@pytest.fixture(scope="function",params="",autouse="True",ids="",name="")

  5. # 语法格式:@pytest.fixture(scope="class",autouse="True")

  6. # def demo_fixture():

  7. #     print("前置方法,可以实现部分及全部用例的前置")

  8. #     yield

  9. #     print("后置方法,可以实现部分及全部用例的后置")

  10. @pytest.fixture(scope="function",params=['刘备','关羽','张飞','诸葛亮'])

  11. def demo_web_fixture(request):

  12.     print("前置方法,可以实现部分及全部用例的前置:登录")

  13.     yield request.param

  14.     print("后置方法,可以实现部分及全部用例的后置:退出")

  15. class TestLogin:

  16.     def test_Login_01(self):

  17.         time.sleep = 3

  18.         print("Hello,I'm 996 ITBrickMover\n")

  19.     def test_Login_02(self,demo_web_fixture):

  20.         time.sleep = 3

  21.         print("Hello,I'm 997 ITBrickMover\n")

  22.         print("-------------"+str(demo_web_fixture))

  23.     def test_Login_03(self):

  24.         time.sleep = 3

  25.         print("Hello,I'm 998 ITBrickMover\n")

  26.     def test_Login_04(self):

  27.         time.sleep = 3

  28.         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就可以根据需要自定义测试用例的前置和后置操作。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值