【问题标题】:How to call objects' attributes in Pytest parametrize feature如何在 Pytest 参数化功能中调用对象的属性
【发布时间】:2020-09-21 12:39:45
【问题描述】:

我有一些只返回一个类的对象的装置。这些对象包含我试图在 pytest 中验证的该类的属性,因此代码如下所示:

from main import My_class
import pytest

@pytest.fixture()
def fixt1():
    object1 = My_class("atr1", "atr2")
    return object1

@pytest.fixture()
def fixt2():
    object2 = My_class("atr3", "atr4")
    return object2

@pytest.mark.parametrize('inputs, results',
                         [
                            (fixt1, 10.0),
                            (fixt2, 22.5)
                         ]
                         )
def test_fixts(inputs, results):
    assert inputs.price == results

此代码将始终返回属性错误:

AttributeError: 'function' object has no attribute 'price'

但是,尝试通过像这样的简单测试来测试这些属性是可行的:

def test_simple(fixt1):
    assert fixt1.price == 10.0

我能否就这个问题获得一些建议,因为我在任何地方都找不到关于如何在参数化中正确调用对象属性的说明?

非常感谢!

【问题讨论】:

  • 您不能使用夹具作为参数值 - 只需使用函数即可。 Fixtures 必须用作测试参数,就像您的 test_simple 示例中一样。
  • 感谢@MrBeanBremen!我注意到,正如您提到的,fixture 不适用于参数化,但奇怪的是函数也不起作用。如果我只是启动我想在体外使用的对象一个函数/夹具,它确实有效,如下所示:object1 = My_class("atr1", "atr2"),但如果它是由函数返回的,则不会
  • 如果函数在加载时拥有所有需要的信息(而不是方法,因为它们在加载时未知),则它们应该可以工作。
  • 你是对的!这是我的错,我没有正确命名我的函数。
  • 对不起@MrBeanBremen,我是菜鸟,我想将您的答案标记为解决方案,但“答案旁边的标记”根本没有让我切换它。

标签: python pytest parametrized-testing


【解决方案1】:

Fixtures 不能像函数一样使用——它们必须在测试函数或其他 Fixtures 中用作参数。在mark.parametrize的参数中可以使用普通函数代替:

def param1():
    return My_class("atr1", "atr2")

def param2():
    return My_class("atr3", "atr4")

@pytest.mark.parametrize('inputs, results',
                         [
                            (param1(), 10.0),
                            (param2(), 22.5)
                         ]
                         )
def test_fixts(inputs, results):
    assert inputs.price == results

请注意,您只能使用可在加载时执行的函数,因为 mark.parametrize 装饰器是在加载时评估的,因此它不能依赖于任何运行时更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2017-08-08
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    相关资源
    最近更新 更多