【问题标题】:Pytest parametrize a test using a fixturePytest 使用夹具参数化测试
【发布时间】:2019-08-04 18:02:05
【问题描述】:

我试图更好地理解如何使用pytest 进行彻底的单元测试,但遇到了一种我不确定如何最好地解决的情况。我在 SO 上发现了关于参数化装置本身的类似问题,但我认为这不是我想要在这里做的。但也许我并没有完全了解灯具本身?

这里是一些示例代码:

应用代码:

class Person:
    def __init__(self, fname: str, lname: str):
        self.fname = fname
        self.lname = lname

    def upper_fullname(self):
        return f'{self.fname} {self.lname}'.upper()

测试:

import pytest

@pytest.fixture(scope="module")
def fixture_mm(conf={"fname": "mickey", "lname": "mouse"}):
    return Person(**conf)

@pytest.fixture(scope="module")
def fixture_bb(conf={"fname": "bugs", "lname": "bunny"}):
    return Person(**conf)

@pytest.mark.parametrize(
    'person, expected_result',
    [(fixture_mm, "MICKEY MOUSE"), (fixture_bb, "BUGS BUNNY")])
def test_uppernames(person, expected_result):
    assert person.upper_fullname() == expected_result

我希望这两个测试都能通过,但我收到一条错误消息,提示 AttributeError: 'function' object has no attribute 'upper_fullname'。我在这里错过了什么?

谢谢。

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    您收到错误是因为 fixture_mm 是一个函数。您需要调用一个函数来获取一个值 (fixture_mm()),但这不适用于固定装置。

    但我认为您甚至不需要这里的固定装置。你可以把它们变成普通函数并像这样使用它们:

    def person_mm(conf={"fname": "mickey", "lname": "mouse"}):
        return Person(**conf)
    
    def person_bb(conf={"fname": "bugs", "lname": "bunny"}):
        return Person(**conf)
    
    @pytest.mark.parametrize(
        'person, expected_result',
        [(person_mm(), "MICKEY MOUSE"), (person_bb(), "BUGS BUNNY")])
    def test_uppernames(person, expected_result):
        assert person.upper_fullname() == expected_result
    

    警告:由于夹具参数是​​在模块编译时评估的,如果函数需要一些设置,这可能会导致问题。另一方面,如果您的函数像本例中一样简单,您甚至可以将这些对象保存为常量:

    PERSON_MM = Person(fname="mickey", lname="mouse")
    PERSON_BB = Person(fname="bugs", lname="bunny")
    

    【讨论】:

    • 谢谢,这行得通。但是我仍然无法完全理解固定装置,并且希望获得更多有关“认为您甚至不需要在这里固定装置”的决心的信息。
    • @user9074332 这里的实际问题是夹具必须进入测试方法的参数,这不是您想要的。通常,它们用于设置/拆除测试环境(例如,创建和清理数据库)或引入一些必须在测试方法中构建的资源(例如,一些复杂的对象,例如您正在尝试的对象)在这里做)。
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2015-11-23
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多