使用self vs cls访问unittest中的变量

问题描述 投票:1回答:1

让我说我有一个简单的类对象,看起来像某种Counter(当然它有其他功能,但它超出了这个问题的范围):

from collections import Counter

class Vocabulary:
    def __init__(self, words):
        self.vocab = Counter(words)

并将Vocabulary类添加到单元测试中,我可以使用setUpClass类方法:

import unittest

class VocabularyTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])


    def test_counts_set_correctly(self):
        self.assertEqual(cls.vocab["a"], 2)

或者我可以只使用self

class VocabularyTests(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(VocabularyTests, self).__init__(*args, **kwargs)
        self.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])

    def test_counts_set_correctly(self):
        self.assertEqual(self.vocab["a"], 2)

以上两种都可以正常工作。但是如果我有一种unpythonic模式呢:

import unittest

class VocabularyTests(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])


    def test_counts_set_correctly(self):
        self.assertEqual(self.vocab["a"], 2)

根据What is the 'cls' variable used for in Python classes?,它只是一个编码惯例,但是单元测试的第3版与@classmethodself.vocab的用法以及前两个惯用测试有什么区别吗?

python unit-testing self class-method
1个回答
2
投票

对于unittest.TestCase子类,不要在__init__中进行任何测试设置。这不是它的用途。如果您希望每个测试方法执行一次设置,请将其放在此处:

def setUp(self):
    ...

如果您希望每个测试类执行一次安装,请将其放在此处:

@classmethod
def setUpClass(cls):
    ...

最后让我们解决一个误解。这在技术上没有区别:

@classmethod
def setUpClass(cls):
    ...

还有这个:

@classmethod
def setUpClass(self):
    ...

第二个是写第一个更混乱/坏的方式。

© www.soinside.com 2019 - 2024. All rights reserved.