Можно ли пропустить setUp() для конкретного теста в python unittest?
Когда я создаю unittest.TestCase
, я могу определить функцию setUp()
, которая будет выполняться перед каждым тестом в этом тестовом случае. Можно ли пропустить setUp()
для одного конкретного теста?
Возможно, что желание пропустить setUp()
для данного теста не является хорошей практикой. Я новичок в модульном тестировании, и любые предложения по этому вопросу приветствуются.
Ответы
Ответ 1
Из docs (курсив мой):
unittest.TestCase.setUp()
Метод, вызываемый для подготовки испытательного прибора. Это вызывается непосредственно перед вызовом метода тестирования; любое исключение, вызванное этот метод будет считаться ошибкой, а не ошибкой теста. Реализация по умолчанию ничего не делает.
Итак, если вам не нужна настройка, не переопределяйте unittest.TestCase.setUp
.
Однако, если один из ваших методов test_*
не нуждается в настройке и другие, я бы рекомендовал поместить это в отдельный класс.
Ответ 2
В setUp() self._testMethodName содержит имя теста, который будет выполнен. Конечно, лучше поставить тест на другой класс или что-то, конечно, но оно там.
Ответ 3
Пользователь может пропустить некоторые методы тестирования, основанные на его строке документации, например, как показано ниже:
import unittest
class simpleTest2(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
name = self.shortDescription()
if name == "add":
self.a = 10
self.b = 20
print name, self.a, self.b
if name == "sub":
self.a = 50
self.b = 60
print name, self.a, self.b
def tearDown(self):
print '\nend of test',self.shortDescription()
def testadd(self):
"""add"""
result = self.a+self.b
self.assertTrue(result == 30)
def testsub(self):
"""sub"""
result = self.a-self.b
self.assertTrue(result == -10)
if __name__ == '__main__':
unittest.main()
Если метод setup() используется для большинства методов тестирования, за исключением одного исключения, вы можете вернуться напрямую, если этот метод выполняется на основе сравнения строки документации.
Ответ 4
Вы можете использовать Django @tag decorator в качестве критерия для пропуска setUp
#The test which you want to skip setUp
@tag('skip_setup')
def test_mytest(self):
assert True
def setUp(self):
method = getattr(self,self._testMethodName)
tags = getattr(method,'tags', {})
if 'skip_setup' in tags:
return #setUp skipped
#do_stuff if not skipped
Помимо пропуска вы также можете использовать теги для различных настроек.
PS Если вы не используете Django, исходный код этого декоратора очень прост:
def tag(*tags):
"""
Decorator to add tags to a test class or method.
"""
def decorator(obj):
setattr(obj, 'tags', set(tags))
return obj
return decorator