26

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

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

4

4 回答 4

14

您可以使用 Django 的 @tag 装饰器作为在 setUp 方法中使用的条件,以便在必要时跳过。

# import tag decorator
from django.test.utils import tag

# 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
于 2019-06-21T22:06:18.897 回答
13

文档(斜体我的):

unittest.TestCase.setUp()

调用方法来准备测试夹具。这是在调用测试方法之前立即调用的;此方法引发的任何异常都将被视为错误而不是测试失败。 默认实现什么也不做

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

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

于 2013-06-07T19:57:44.320 回答
9

setUp()中,self._testMethodName包含将要执行的测试的名称。当然,最好将测试放在不同的类或其他东西中,但它就在那里。

于 2014-06-19T20:41:37.530 回答
2

用户根据文档字符串跳过一些测试方法是可行的,举个例子如下:

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() 方法用于除了一个异常之外的大多数测试方法,如果基于 docstring 的比较满足该方法,则可以直接返回。

于 2018-11-28T14:24:42.553 回答