当我创建一个unittest.TestCase
时,我可以定义一个setUp()
函数,该函数将在该测试用例中的每个测试之前运行。是否可以跳过setUp()
单个特定测试?
想要跳过setUp()
给定的测试可能不是一个好习惯。我对单元测试相当陌生,欢迎任何有关该主题的建议。
当我创建一个unittest.TestCase
时,我可以定义一个setUp()
函数,该函数将在该测试用例中的每个测试之前运行。是否可以跳过setUp()
单个特定测试?
想要跳过setUp()
给定的测试可能不是一个好习惯。我对单元测试相当陌生,欢迎任何有关该主题的建议。
您可以使用 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
从文档(斜体我的):
unittest.TestCase.setUp()
调用方法来准备测试夹具。这是在调用测试方法之前立即调用的;此方法引发的任何异常都将被视为错误而不是测试失败。 默认实现什么也不做。
因此,如果您不需要任何设置,请不要覆盖unittest.TestCase.setUp
.
但是,如果您的test_*
一种方法不需要设置而其他方法需要设置,我建议将其放在单独的类中。
在setUp()
中,self._testMethodName
包含将要执行的测试的名称。当然,最好将测试放在不同的类或其他东西中,但它就在那里。
用户根据文档字符串跳过一些测试方法是可行的,举个例子如下:
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 的比较满足该方法,则可以直接返回。