使用 pytest 参数夹具运行我得到的“self”未定义

Geo*_*rge 6 python pytest

我有这门课:

接受.py

class AcceptC(object):

    def __init__(self):
        self.minimum = 30
        self.maximum = 40
Run Code Online (Sandbox Code Playgroud)

和单元测试:

accept_test.py

import unittest
import pytest

from app.accept import AcceptC


class TestAcceptC(unittest.TestCase):

    def setUp(self):
        self.accept = AcceptC()


@pytest.mark.parametrize(
    "minimum, maximum, expected_min, expected_max", [
        ("13", "5", 30, 40),
        ("30", "40", 30, 40),
    ])
def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max):
    expected_min = self.accept.minimum
    expected_max = self.accept.maximum
    self.assertEqual(minimum, expected_min)
    self.assertEqual(maximum, expected_max)


if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

使用 pytest 运行时,出现错误:

NameError: 名称 'self' 未定义

我还看到我不能self在测试函数中用作参数。

最后,有没有办法避免使用:

expected_min = self.accept.minimum
expected_max = self.accept.maximum
Run Code Online (Sandbox Code Playgroud)

并立即使用self.accept.minimum

如果我self用作测试函数的参数,它将返回:

未找到固定装置“自我”

小智 7

问题很简单,因为:

class TestAcceptC(unittest.TestCase):
Run Code Online (Sandbox Code Playgroud)

unittest.TestCase 的这种继承将打破关于 pytest 固定装置的“自我”。

信息:https : //docs.pytest.org/en/3.0.1/unittest.html


MSe*_*ert 4

您的方法中缺少self(假设它是一个方法,如果它是一个函数,则需要将其设为TestAcceptC第一个方法)参数列表:

def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max):
Run Code Online (Sandbox Code Playgroud)

应该是(我做了一些额外的改变;远离unittest并且pytest更像):

class TestAcceptC():  # no need to subclass unittest

    @classmethod
    def setup_class(cls):
        # Called when setting up the class
        cls.accept = AcceptC()

    @pytest.mark.parametrize(
        ["minimum", "maximum", "expected_min", "expected_max"], [
            ("13", "5", 30, 40),
            ("30", "40", 30, 40),
        ])
    def test_init_returns_correct_results(self, minimum, maximum, expected_min, expected_max):
        # difference is here -------------^^^^
        # pytest can use normal asserts here.
        assert self.accept.minimum == expected_min
        assert self.accept.maximum == expected_max
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我的缩进错误,这就是为什么我收到之前的错误。但是,使用 self 作为参数会给我`TypeError: test_init_method_returns_ Correct_results() 缺少 4 个必需的位置参数:'minimum'、'maximum'、'expected_min' 和 '预期最大'` (2认同)