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

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytest是一种基于Python的测试框架,提供了一些简单易用的语法和强大的扩展性,可以用于各种类型的测试,包括Web自动化测试。pytest框架具有以下特点: 1. 语法简单:pytest提供了简单的语法,例如使用 `assert` 语句进行断言、使用 `fixture` 机制来管理测试环境等。 2. 支持插件:pytest具有丰富的插件机制,可以方便地扩展和定制测试框架功能,例如支持HTML测试报告、支持分布式测试等。 3. 支持参数化:pytest提供了 `parametrize` 装饰器,可以方便地实现测试用例的参数化,避免重复编写相似的测试用例。 4. 支持并发执行:pytest支持多线程和分布式测试,并可以在测试过程动态调整并发数,提高测试效率。 在使用pytest进行Web自动化测试时,需要配合使用Selenium等工具来操作浏览器和网页元素。pytest提供了 `fixture` 机制,可以在测试函数使用预先定义的fixture来创建和管理测试环境,例如创建浏览器实例、打开网页、执行操作等。 下面是一个使用pytest和Selenium进行Web自动化测试的示例代码: ```python import pytest from selenium import webdriver @pytest.fixture(scope="module") def driver(): # 创建浏览器实例 driver = webdriver.Chrome() # 打开测试网页 driver.get("http://example.com") yield driver # 关闭浏览器 driver.quit() def test_example(driver): # 在网页查找元素 elem = driver.find_element_by_tag_name("h1") # 判断元素文本是否正确 assert elem.text == "Example Domain" ``` 在上面的示例,我们使用 `fixture` 机制创建了一个Chrome浏览器实例,并在测试函数使用该实例进行Web自动化测试。在测试函数,我们使用Selenium提供的方法来查找网页元素并进行断言。 需要注意的是,pytest需要安装在Python环境,可以使用pip命令进行安装,例如: ``` pip install pytest ``` 希望这些信息能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值