搜索

查看: 3111|回复: 11

[Python] pytest中的fixture基本用法

[复制链接]
发表于 2023-5-4 17:18:49 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:18:49 3111 11 看全部
目录
  • 简介:
  • fixture的功能
  • 特点及优势
  • 基本用法
  • fixture在自动化中的应用--作用域
  • fixture在自动化中的应用-yield关键字
  • fixture在自动化中的应用--数据共享
  • fixture在自动化中的应用-自动应用
  • fixture在自动化中的应用-参数化
    简介:
      fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进:
      1.有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
      2.按模块化的方式实现,每个fixture都可以互相调用。
      3.fixture的范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围。

    fixture的功能
    fixture是pytest特有的功能,用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
    主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。
    从功能上看来,与setup、teardown相似,但是优势明显:
    命名方式灵活,不局限于setup和teardown这几个命名
    conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
    scope="module" 每一个.py文件调用一次
    scope="session" 可以实现多个.py跨文件使用一个session来完成多个用例

    特点及优势
    1、命令灵活:对于setup.teardown,可以不起这两个名字
    2、数据共享:在conftest.py配置里写的方法可以实现数据共享,不需要import导入,可以跨文件共享
    3、scope的层次及神奇的yield组合相当于各种setup和teardown
    4、实现参数化

    基本用法
    @pytest.fixture()
    import pytest
    @pytest.fixture()
    def login():
        print("完成登录操作")
    def test_search():
        print("搜索功能,此方法不需要完成登录即可执行")
    def test_cart(login):
        print("加入购物车,需要完成登录才可以")

    2023022410313353.jpg

    2023022410313353.jpg


    fixture在自动化中的应用--作用域
    @pytest.fixture(scope='module')

    取值
    范围
    说明
    function
    函数级
    每个函数或方法都会调用
    class
    类级别
    每个测试类只运行一次
    module
    模块级别
    每一个.py文件只调用一次
    package
    包级
    没一个python包至调用一次
    session
    会话级
    每次会话只需要运行一次,会话内所有方法及类、模块都共享这个方法


    import pytest
    @pytest.fixture(scope='module')
    def login():
        print("完成登录操作")
    def test_search(login):
        print("搜索功能,此方法不需要完成登录即可执行")
    def test_cart(login):
        print("加入购物车,需要完成登录才可以")

    2023022410313354.jpg

    2023022410313354.jpg


    fixture在自动化中的应用-yield关键字
    场景:你已经可以将测试方法【前要执行的或依赖的】解决了,测试方法后销毁清除数据的要如何进行呢?
    解决:通过在fixture函数中加入yield关键字,yield是调用第一次返回结果,第二次执行他下面的语句返回。
    步骤:在@pytest.fixture(scope=module),在登录的方法中加yield,之后加销毁清楚的步骤。
    import pytest
    @pytest.fixture(scope='module')
    def login():
        # setup操作
        print("完成登录操作")
        token = 1
        yield token  # 相当于return的操作
        # teardown操作
        print("完成登出操作")

    def test_search(login):
        # print("搜索功能,此方法不需要完成登录即可执行")
        print(f"token = {login}")

    def test_cart(login):
        # print("加入购物车,需要完成登录才可以")
        print(f"token = {login}")

    2023022410313355.jpg

    2023022410313355.jpg


    fixture在自动化中的应用--数据共享
    场景:与其他测试工程师合作一起开发时,公共的模块要在不同的文件中,要在大家都能访问到的地方
    解决:使用conftest.py这个文件进行数据共享,并且他可以放在不同位置骑着不同的范围共享作用
    前提:
    conftest文件名是不能换的
    放在项目下是全局的数据共享的地方
    执行:
    系统执行到参数login时,先从本模块中查找是否有这个名字的变量
    之后在conftest.py中找是否有
    步骤:
    将登录模块带@pytest.fixture写在conftest.py中

    2023022410313356.jpg

    2023022410313356.jpg


    2023022410313357.jpg

    2023022410313357.jpg


    fixture在自动化中的应用-自动应用
    场景:不想原测试方法有任何改动,或全部都自动实现自动应用,没特例,也都不需要返回值时可以选择自动应用
    解决:使用fixture中参数autouse=True实现
    步骤:在方法上面加@pytest.fixture(autouse=True)

    2023022410313358.jpg

    2023022410313358.jpg


    2023022410313459.jpg

    2023022410313459.jpg


    fixture在自动化中的应用-参数化
    场景:测试离不开数据,为了数据灵活,一般数据都是用过参数传的
    解决:fixture通过固定参数requests传递
    步骤:在fixture中增加@pytest.fixture(params=[1,2,3,'tom'])
    在方法参数写request,方法体里面使用request.param接收参数
    import pytest
    @pytest.fixture(params=[1, 2, 3, "测试"])
    def login(request):
        print(f"数据名称为:{request.param}")
        return request.param
    def test_search(login):
        print(f"{login}")

    2023022410313460.png

    2023022410313460.png


    到此这篇关于pytest中的fixture基本用法的文章就介绍到这了,更多相关pytest fixture用法内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-29 14:58:31 | 显示全部楼层
    无人岛屿颈 2023-6-29 14:58:31 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 21:57:37 | 显示全部楼层
    麻辣鸡翅 2023-6-29 21:57:37 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 23:36:52 | 显示全部楼层
    123456823 2023-6-29 23:36:52 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 09:40:46 | 显示全部楼层
    落败的青春阳落s 2023-6-30 09:40:46 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 10:54:44 | 显示全部楼层
    Gordon520 2023-6-30 10:54:44 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-30 12:07:10 | 显示全部楼层
    小妖花满楼满fx 2023-6-30 12:07:10 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-30 21:42:31 | 显示全部楼层
    知足常乐77 2023-6-30 21:42:31 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-7-3 17:32:09 | 显示全部楼层
    十二音阶囤 2023-7-3 17:32:09 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-7-4 04:00:37 | 显示全部楼层
    123456819 2023-7-4 04:00:37 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表