【发布时间】:2019-02-17 16:28:02
【问题描述】:
假设我有一个简单的类对象,它看起来像某种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)
以上两种方法都可以正常工作。但是,如果我有一种非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 的第三版单元测试与前两个更惯用的测试之间有什么区别吗?
【问题讨论】:
-
第一个和第三个相同,第二个不同。
-
第一个会创建一个
NameError,因为据我所知,test_counts_set_correctly内部的名称cls不会被绑定。 -
@wim 哦,没注意到。是的,那会失败
标签: python unit-testing self class-method