【问题标题】:running with pytest parametrize fixture I am getting `self` is not defined使用 pytest 参数化夹具运行我得到“自我”未定义
【发布时间】:2017-01-26 08:30:25
【问题描述】:

我有这门课:

接受.py

class AcceptC(object):

    def __init__(self):
        self.minimum = 30
        self.maximum = 40

和单元测试:

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()

使用 pytest 运行时出现错误:

NameError: name 'self' 未定义

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

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

expected_min = self.accept.minimum
expected_max = self.accept.maximum

并立即使用self.accept.minimum?

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

找不到夹具'self'

【问题讨论】:

  • def test_init_returns_correct_results 不在任何类中,因此未定义“self”
  • 这是因为 self 如果没有定义你在哪里使用它。这就是全部答案。仅使用已定义的名称。
  • @ZiTAL:你是对的。我错过了缩进。但我仍然有错误消息..

标签: python pytest


【解决方案1】:

问题仅仅是因为:

class TestAcceptC(unittest.TestCase):

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

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

【讨论】:

    【解决方案2】:

    您的方法中缺少self 参数列表(假设它是一个方法,如果它是一个函数,那么您需要首先使其成为TestAcceptC 的方法)参数列表:

    def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max):
    

    应该是(我做了一些额外的更改;远离unittest 和更多pytest-like):

    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
    

    【讨论】:

    • 如果我使用 self 作为参数,它会返回 fixture 'self' not found
    • 这是你TestAcceptC类的方法,对吧?如果它想访问它的属性,它应该是。
    • 我正在测试AcceptC类的init方法。而test_init..是TestAcceptC的一个方法,和我上面的2个文件一样。跨度>
    • 嗯,我的缩进错误,这就是我收到上一个错误的原因。但是,使用 self 作为参数给了我TypeError: test_init_method_returns_correct_results() missing 4 required positional arguments: 'minimum', 'maximum', 'expected_min', and 'expected_max'
    • 我认为夹具无法理解测试函数中的 self 参数,它期望有一个值?这就是为什么我有这个错误
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2021-02-05
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多