使用 self vs cls 访问单元测试中的变量
Using self vs cls to access variable in unittest
假设我有一个简单的 class 对象,看起来像某种 Counter
(当然它还有其他功能,但超出了这个问题的范围):
from collections import Counter
class Vocabulary:
def __init__(self, words):
self.vocab = Counter(words)
并将 Vocabulary
class 添加到单元测试中,我可以使用 setUpClass
class 方法:
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)
以上两种方法都可以正常工作。但是,如果我有一种非 pythonic 模式怎么办:
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?,这只是一个编码约定,但是使用@classmethod
的单元测试的第三个版本与self.vocab
的用法和前两个版本之间有什么区别吗?惯用测试?
对于 unittest.TestCase
subclasses,不要在 __init__
中进行任何测试设置。这不是它的目的。如果您希望每个测试 方法 执行一次设置,请将其放在这里:
def setUp(self):
...
如果您希望每个测试执行一次设置 class,请将其放在这里:
@classmethod
def setUpClass(cls):
...
最后让我们解决一个误解。这在技术上没有区别:
@classmethod
def setUpClass(cls):
...
还有这个:
@classmethod
def setUpClass(self):
...
第二个只是第一个更confusing/bad的写法。
假设我有一个简单的 class 对象,看起来像某种 Counter
(当然它还有其他功能,但超出了这个问题的范围):
from collections import Counter
class Vocabulary:
def __init__(self, words):
self.vocab = Counter(words)
并将 Vocabulary
class 添加到单元测试中,我可以使用 setUpClass
class 方法:
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)
以上两种方法都可以正常工作。但是,如果我有一种非 pythonic 模式怎么办:
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?,这只是一个编码约定,但是使用@classmethod
的单元测试的第三个版本与self.vocab
的用法和前两个版本之间有什么区别吗?惯用测试?
对于 unittest.TestCase
subclasses,不要在 __init__
中进行任何测试设置。这不是它的目的。如果您希望每个测试 方法 执行一次设置,请将其放在这里:
def setUp(self):
...
如果您希望每个测试执行一次设置 class,请将其放在这里:
@classmethod
def setUpClass(cls):
...
最后让我们解决一个误解。这在技术上没有区别:
@classmethod
def setUpClass(cls):
...
还有这个:
@classmethod
def setUpClass(self):
...
第二个只是第一个更confusing/bad的写法。