Допустим, у меня есть простой объект класса, который выглядит как какой-то Counter
(конечно, у него есть другие функции, но он не подходит для этого вопроса):
from collections import Counter
class Vocabulary:
def __init__(self, words):
self.vocab = Counter(words)
И добавив класс Vocabulary
к unittest, я мог бы использовать setUpClass
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)
Согласно " Что такое переменная" cls ", используемая в классах Python? , это просто соглашение о кодировании, но есть ли разница между третьей версией unittest с @classmethod
с использованием self.vocab
и первых двух более идиоматических тестов?
Для подклассов unittest.TestCase
не выполняйте никаких тестовых настроек в __init__
. Это не для чего. Если вы хотите, чтобы установка выполнялась один раз для тестового метода, поместите ее здесь:
def setUp(self):
...
Если вы хотите, чтобы установка выполнялась один раз на тестовый класс, поместите ее здесь:
@classmethod
def setUpClass(cls):
...
Наконец, позвольте обратиться к заблуждению. Технически нет никакой разницы между этим:
@classmethod
def setUpClass(cls):
...
И это:
@classmethod
def setUpClass(self):
...
Второй - просто более запутанный/плохой способ написания первого.
NameError
, потому что внутриtest_counts_set_correctly
образом имяcls
не будет связано, насколько я могу судить.