【pytest-fixture】十一、覆盖各个级别的fixture

我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。

在大项目中,会有很多的fixture,这时候你可能需要覆盖一个全局或者根目录下的fixture,以保持局部fixture测试代码的可读性和可维护性.

1.通过局部conftest.py覆盖全局fixture

1.1介绍

在项目运行做,我们根目录下的conftest.py文件会定义一些fixture,但我们有的时候可能用不上,或者我们需要获取返回值在重新包装一下,这时候我们可以在新建一个目录,在此目录下在编写一个conftest.py来完成我们要的二次封装.

1.2示例代码

文件结构:
tests
    conftest.py

import pytest

@pytest.fixture
def username():
    return 'username'

    test_something.py

def test_username(username):
    assert username == 'username'

    subfolder/
        conftest.py

import pytest

@pytest.fixture
def username(username):
    return 'overridden-' + username

        test_something.py

def test_username(username):
    assert username == 'overridden-username'

1.3运行结果

在这里插入图片描述

1.4分析结果

可以看到我们的断言是成功的,所以我们的覆盖起了效果,不然在subfolder\test_something.py::test_username就会断言失败.

2.通过模块fixture覆盖全局fixtrue

2.1介绍

我们可以在当前测试模块中定义同名fixture函数去覆盖全局的fixture

2.2实例代码

文件结构:
tests/
    conftest.py

import pytest


@pytest.fixture
def username():
    return 'username'

    test_something.py

import pytest

@pytest.fixture
def username(username):
    return 'overridden-' + username

def test_username(username):
    assert username == 'overridden-username'

2.3运行结果

在这里插入图片描述

2.4结果分析

断言成功,说明我们的模块fixture成功的覆盖了全局fixtrue.

3.使用测试参数化覆盖全局fixture

3.1介绍

我们可以通过@pytest.mark.parametrize()参数化,来实现覆盖全局fixture

3.2示例代码

文件结构:
tests/
    conftest.py

import pytest


@pytest.fixture
def username():
    return 'username'

    test_something.py

import pytest

@pytest.fixture
def username(username):
    return 'overridden-' + username

@pytest.mark.parametrize('username', ['weiguang'])
def test_username(username):
    assert username == 'weiguang'

3.3测试结果

在这里插入图片描述

3.4结果分析

断言成功了,说明参数化覆盖了全局fixture和模块fixture,因为如果没有覆盖的话,断言内容就是’overridden-username’ == 'weiguang’所以会断言失败.既然断言成功说明我们的断言内容就是"weiguang" == "weiguang"所以断言成功.

4.外部引入的fixture覆盖全局fixture

4.1介绍

前面我们讲了fixture的模块化,这里我们同样可以用引入的fixtrue去覆盖全局的fixture

4.2示例代码

文件结构:
tests/
    conftest.py

import pytest


@pytest.fixture
def username():
    return 'username'

    fixtures/
        username.py

import pytest


@pytest.fixture
def username():
    return 'fixtures/username'

    test_demo.py

from tests.fixtures.username import username


def test_demo(username):
	assert username == "fixtures/username"

4.3运行结果

在这里插入图片描述

4.4结果分析

断言成功,说明我们外部引入的fixture覆盖了全局的fixture,因为username返回的是"fixtures/username"才会断言成功

5.非参数化的fixture覆盖参数化的fixture(反之亦然)

5.1介绍

有时候我们全局的fixture是参数化的,但我们不想让他参数化,那我们就本地使用未参数化的fixture去覆盖它

5.2示例代码

文件结构:
tests/
    conftest.py

import pytest


@pytest.fixture(params=['one', 'two', 'three'])
def parametrized_username(request):
    return request.param

    test_demo.py

import pytest


@pytest.fixture
def parametrized_username():
    return 'overridden-username'


def test_demo(parametrized_username):
    assert parametrized_username == "overridden-username"

5.3运行结果

在这里插入图片描述

5.4分析结果

可以看到我们断言成功了,且只执行了一次,说明我们本地的fixture覆盖了全局的fixture,参数化的fixture被本地非参数化的fixture覆盖了.同样的,如果本地是参数化的fixtrue也会覆盖全局非参数化的fixture

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytest-playwright是一个用于Python测试框架pytest的插件,它结合了Pytest和Playwright这两个工具。Playwright是一个由Google开发的开源库,提供了跨浏览器(Chrome, Firefox, WebKit)的自动化测试API。pytest-playwright则将Playwright的强大功能与pytest的断言和组织结构无缝集成,使得编写Web应用程序的端到端(E2E)测试变得更加容易和高效。 使用pytest-playwright夹具,你可以: 1. **快速启动浏览器**: 在测试套件中自动打开并配置浏览器实例,如`browser`, `context`, 或`page`,避免手动创建和管理。 2. **执行页面操作**: 如导航、填充表单、点击元素、检查元素状态等,可以直接在测试用例中进行。 3. **隔离和重用资源**: 可以创建复用的页面初始化设置,减少测试代码的重复。 4. **处理异步任务**: Playwright的强大之处在于它可以处理JavaScript的异步行为,包括等待页面加载完成或特定事件触发。 5. **跨浏览器一致性测试**: 由于Playwright支持多种浏览器,pytest-playwright方便地在不同浏览器间进行测试,确保兼容性。 相关问题: 1. pytest-playwright主要解决什么样的测试难题? 2. 它如何与pytestfixture概念结合? 3. 我们可以在pytest-playwright中如何编写一个页面初始化的fixture? 4. 使用pytest-playwright如何处理复杂的异步测试场景? 5. 它是否支持持续集成/持续部署(CI/CD)环境?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值