Python(unittest)超类方法应该如何引用其调用子类中的变量?

Python(unittest)超类方法应该如何引用其调用子类中的变量?,python,unit-testing,Python,Unit Testing,我在Python OO编程方面经验不足,不知道如何做到这一点:如果我有几个类是unittest.TestCase子类的子类。当子类调用这些方法时,超类的方法应该如何引用子类的变量?让我试着用这个可能是错误的例子来说明: import unittest class TestSuper(unittest.TestCase): def test_method(self): # do something, e.g. pass class TestSub1(T

我在Python OO编程方面经验不足,不知道如何做到这一点:如果我有几个类是
unittest.TestCase
子类的子类。当子类调用这些方法时,超类的方法应该如何引用子类的变量?让我试着用这个可能是错误的例子来说明:

import unittest

class TestSuper(unittest.TestCase):

    def test_method(self):
        # do something, e.g.
        pass

class TestSub1(TestSuper):

    def setUp(self):
        self.some_parameter = 1

class TestSub2(TestSuper):

    def setUp(self):
        self.some_parameter = 2

if __name__ == '__main__':
    unittest.main()
现在,当从子类中调用
TestSuper.test\u方法时,我不知道如何分别更正引用
TestSub1.parameter
TestSub2.parameter


我的灵感来自于,但在这里我试图实现多个测试用例,它们做的相同,但只是在设置上有所不同。当然,我可以通过复制粘贴我的测试用例定义来实现这一切,但我发现这是一种糟糕的编码实践。

只需使用
self。一些参数
self
始终绑定到此处的正确实例

但是,考虑到
unittest.main()
将在*所有三个测试用例(包括基类)上运行
test\u方法,因此必须为基类上的
some\u参数提供默认值

如果您不想将
TestSuper
视为测试用例,请不要从
unittest.TestCase
继承。将其用作混合:

import unittest

class TestMixin(object):
    def test_method(self):
        # do something, e.g.
        pass

class TestSub1(unittest.TestCase, TestMixin):
    def setUp(self):
        self.some_parameter = 1

class TestSub2(unittest.TestCase, TestMixin):
    def setUp(self):
        self.some_parameter = 2

if __name__ == '__main__':
    unittest.main()

现在
unittest.main()
将只找到两个测试用例(
TestSub1
TestSub2
),并仅在这些用例上运行
test\u方法。

只需使用
self.some\u参数即可
self
始终绑定到此处的正确实例

但是,考虑到
unittest.main()
将在*所有三个测试用例(包括基类)上运行
test\u方法,因此必须为基类上的
some\u参数提供默认值

如果您不想将
TestSuper
视为测试用例,请不要从
unittest.TestCase
继承。将其用作混合:

import unittest

class TestMixin(object):
    def test_method(self):
        # do something, e.g.
        pass

class TestSub1(unittest.TestCase, TestMixin):
    def setUp(self):
        self.some_parameter = 1

class TestSub2(unittest.TestCase, TestMixin):
    def setUp(self):
        self.some_parameter = 2

if __name__ == '__main__':
    unittest.main()

现在
unittest.main()
将只找到两个测试用例(
TestSub1
TestSub2
),并仅在这些用例上运行
test\u方法。

,我有点害怕mixin方法,因为@vadim-p建议将基类隐藏在非TestCase类中,以便跳过基类中的测试:@ThomasArildsen:在基类和mixin中没有提供相同的方法。不过,正确地使用混合器并不难。另请参阅,以获得有关多重继承的详细解释。@ThomasArildsen:隐藏的“hack”是一个hack,不需要。它会造成混乱,降低可读性。嗯,我不明白这一点。在我稍微复杂一些的真实测试中,隐藏hack可以工作,但是mixin不能。在后一种情况下,错误消息似乎表明Python希望self引用TestMixin,因此它无法找到TestSub1中的参数,例如,我有点害怕mixin方法,因为@vadim-p建议将基类隐藏在非TestCase类中,以便跳过基类中的测试:@ThomasArildsen:在基类和mixin中没有提供相同的方法。不过,正确地使用混合器并不难。另请参阅,以获得有关多重继承的详细解释。@ThomasArildsen:隐藏的“hack”是一个hack,不需要。它会造成混乱,降低可读性。嗯,我不明白这一点。在我稍微复杂一些的真实测试中,隐藏hack可以工作,但是mixin不能。在后一种情况下,错误消息似乎表明Python希望self引用TestMixin,因此它找不到TestSub1中的参数。