Разница проявляется, когда у вас есть более одного метода тестирования в вашем классе. setUpClass
и tearDownClass
выполняются один раз для всего класса; setUp
и tearDown
выполняются до и после каждого метода тестирования.
Например:
class Example(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass")
def setUp(self):
print("setUp")
def test1(self):
print("test1")
def test2(self):
print("test2")
def tearDown(self):
print("tearDown")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
Когда вы запускаете этот тест, он печатает:
setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass
(Точки ( .
) являются unittest
«ы выход по умолчанию , когда тест пройден) . Заметим , что setUp
и tearDown
появляются до и после , test1
и test2
, в то время как setUpClass
и tearDownClass
появляются только один раз, в начале и в конце всего теста.
unittest
тест не считается пройденным до тех пор, пока онtearDown
не прошел без происшествий.setUp
иtearDown
выполняются один раз для каждогоtest
метода (всего дважды в этом примере), ноsetUpClass
иtearDownClass
выполняются каждый раз только один раз.В чем разница между фреймворком Python
setUp()
иsetUpClass()
в немunittest
?Основное отличие (как отмечено в ответе Бенджамина Ходжсона) заключается в том, что он
setUpClass
вызывается только один раз, и это перед всеми тестами, аsetUp
вызывается непосредственно перед каждым тестом. (NB: то же самое относится к эквивалентным методам в других тестовых средах xUnit, а не только в Pythonunittest
.)Из
unittest
документации :и:
Почему установка должна выполняться одним методом, а не другим?
На эту часть вопроса пока нет ответа. Согласно моему комментарию в ответ на ответ Gearon,
setUp
метод предназначен для элементов приспособления, которые являются общими для всех тестов (чтобы избежать дублирования этого кода в каждом тесте). Я считаю, что это часто бывает полезно, поскольку удаление дублирования (обычно) улучшает читаемость и снижает нагрузку на обслуживание.Этот
setUpClass
метод предназначен для дорогостоящих элементов, которые вы бы предпочли сделать только один раз, таких как открытие соединения с базой данных, открытие временного файла в файловой системе, загрузка разделяемой библиотеки для тестирования и т. Д. Выполнение таких действий перед каждым тестом замедлит работу набора тестов слишком много, поэтому мы просто делаем это один раз перед всеми тестами. Это небольшое снижение независимости тестов, но в некоторых ситуациях необходима оптимизация. Возможно, не следует делать такие вещи в модульных тестах, поскольку обычно можно имитировать базу данных / файловую систему / библиотеку / что угодно, не используя настоящую вещь. Таким образом, я считаю, чтоsetUpClass
это редко требуется. Однако это полезно, когда возникает необходимость в тестировании приведенных выше (или аналогичных) примеров.источник