是否可以跳过python的unittest中特定测试的setUp()?

时间:2013-06-07 19:48:41

标签: python unit-testing testing python-unittest

当我创建unittest.TestCase时,我可以定义一个setUp()函数,该函数将在该测试用例中的每个测试之前运行。是否可以跳过setUp()进行单个特定测试?

对于给定的测试,想要跳过setUp()可能不是一个好习惯。我对单元测试相当新,欢迎任何有关该主题的建议。

4 个答案:

答案 0 :(得分:10)

来自docs(斜体矿):

  

unittest.TestCase.setUp()

     

调用准备测试夹具的方法。在调用测试方法之前立即调用它;提出的任何例外   此方法将被视为错误而非测试失败。   默认实现不执行任何操作

因此,如果您不需要任何设置,请不要覆盖unittest.TestCase.setUp

但是,如果您的某个test_*方法不需要设置而其他方法不需要,我建议将其放在单独的类中。

答案 1 :(得分:8)

在setUp()中,self._testMethodName包含将要执行的测试的名称。当然,把测试放到不同的课程或其他什么东西可能会更好,但它就在那里。

答案 2 :(得分:0)

用户可以根据其文档字符串跳过某些测试方法,例如以下示例:

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()方法用于除一个例外之外的大多数测试方法,则可以根据文档字符串的比较直接返回是否满足该方法。

答案 3 :(得分:0)

您可以使用Django的@tag装饰器作为跳过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

除了跳过之外,您还可以使用标签进行不同的设置。

P.S。如果您不使用Django,那么该装饰器的source code确实很简单:

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