Подтвердить что ты не робот

Можно ли пропустить setUp() для конкретного теста в python unittest?

Когда я создаю unittest.TestCase, я могу определить функцию setUp(), которая будет выполняться перед каждым тестом в этом тестовом случае. Можно ли пропустить setUp() для одного конкретного теста?

Возможно, что желание пропустить setUp() для данного теста не является хорошей практикой. Я новичок в модульном тестировании, и любые предложения по этому вопросу приветствуются.

4b9b3361

Ответ 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