代码之家  ›  专栏  ›  技术社区  ›  alvas

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

  •  1
  • alvas  · 技术社区  · 6 年前

    假设我有一个简单的类对象,看起来像 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)
    

    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? ,这只是一个编码约定,但是unittest的第三个版本和 @classmethod 使用 self.vocab 还有前两个习语测试?

    1 回复  |  直到 6 年前
        1
  •  4
  •   wim    6 年前

    为了 unittest.TestCase 子类, 不要在中进行任何测试设置 __init__ . 不是为了这个。如果希望每次测试执行一次设置 方法 ,放在这里:

    def setUp(self):
        ...
    

    如果希望每次测试执行一次安装程序 ,放在这里:

    @classmethod
    def setUpClass(cls):
        ...
    

    定义设置类(cls):
    

    还有这个:

    @classmethod
    def setUpClass(self):
        ...
    

    第二种只是第一种更令人困惑/糟糕的写作方式。