前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >pytest文档67-在 pytest.mark.parametrize 中使用 fixture

pytest文档67-在 pytest.mark.parametrize 中使用 fixture

作者头像
上海-悠悠
发布2020-12-17 14:17:12
发布2020-12-17 14:17:12
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

前言

测试用例参数化的时候,使用 pytest.mark.parametrize 参数化传测试数据,如果我们想引用前面 不同fixture 返回的数据当测试用例的入参,目前没好的解决办法。 可以用fixture 参数化 prams 来间接解决这个问题

使用案例

我们需要在测试用例里面参数化,参数化的数据来源于前面不同fixture的返回值,示例

代码语言:javascript
代码运行次数:0
运行
复制
import pytest
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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

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

@pytest.mark.parametrize('arg', [a, b])
def test_foo(arg):
    assert len(arg) == 1

这时候运行会报错

代码语言:javascript
代码运行次数:0
运行
复制
..\test_xx.py F
arg = <function a at 0x000002502E933D08>

    @pytest.mark.parametrize('arg', [a, b])
    def test_foo(arg):
>       assert len(arg) == 1
E       TypeError: object of type 'function' has no len()

D:\test_xx.py:13: TypeError
F
arg = <function b at 0x000002502E933E18>

    @pytest.mark.parametrize('arg', [a, b])
    def test_foo(arg):
>       assert len(arg) == 1
E       TypeError: object of type 'function' has no len()

关于此问题的讨论可以看github 上的issue Using fixtures in pytest.mark.parametrize #349

使用 fixture 参数化

可以使用 fixture 的参数化来解决上面的问题,通过 request.getfixturevalue(“fixture name”) 方法来获取fixture的返回值 有些文档看到的是 request.getfuncargvalue 那是早期的版本,目前新版本改名换成了 request.getfixturevalue getfixturevalue 的作用是获取 fixture 的返回值

代码语言:javascript
代码运行次数:0
运行
复制
import pytest
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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

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

@pytest.fixture(params=['a', 'b'])
def arg(request):
    return request.getfixturevalue(request.param)

def test_foo(arg):
    assert len(arg) == 1

这样运行就不会有问题了

实例场景

web自动化的时候,想在 chrome 和 firefox 浏览器上测试同一功能的测试用例

代码语言:javascript
代码运行次数:0
运行
复制
import pytest
from selenium import webdriver
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

@pytest.fixture
def chrome():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()


@pytest.fixture
def firefox():
    driver = webdriver.Firefox()
    yield driver
    driver.quit()

@pytest.fixture(params=['chrome', 'firefox'])
def driver(request):
    '''启动浏览器参数化'''
    return request.getfixturevalue(request.param)

def test_foo(driver):
    '''测试用例'''
    driver.get("https://www.cnblogs.com/yoyoketang/")

这样就可以分别打开 chrome 和 fixfox 执行测试用例了 关于此问题的更多讨论可以看github 上的issue Using fixtures in pytest.mark.parametrize #349

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 使用案例
  • 使用 fixture 参数化
  • 实例场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档