在 Django TestCase 中多次调用 setUp 函数
setUp function being called multiple times in django TestCase
我是第一次使用 Django 单元测试。以下是我的代码的缩小版本。
我的假设是每个 TestCase 都会调用一次 setUp 函数 class。但是当我 运行 python manage.py 测试命令时,每个测试函数都会调用一次 setUp 函数。
是我做错了什么还是我的假设有问题?
class SampleTest(TestCase):
"""
This class assumes an archiver setup with
add available at localhost:9101
query available at localhost:9105
"""
def __init__(self, *args, **kwargs):
self.init_var = False
super(SampleTest, self).__init__(*args, **kwargs)
def setUp(self):
""""""
print "setup called"
self.init_var = True
def test_1(self):
print "Test 1", self.init_var
def test_2(self):
print "Test 2", self.init_var
是的,你的假设是错误的。测试用例中的每个测试都应该是独立的;所以 setUp
(和 tearDown
) 为他们每个人调用一次。
如果你真的需要在整个过程中只做一次 class,请使用 setUpClass
;但请注意,您不应该在那里做诸如设置数据之类的事情。
这是因为每次调用测试用例时都会调用setUp
。如果你只想调用它一次,你必须使用 setUpClass
和 @classmethod
装饰器,如下所示:
class SampleTest(TestCase):
@classmethod
def setUpClass(cls):
super(SampleTest, cls).setUpClass()
# your code
我自己一直对此感到有些沮丧。通常需要完成所有测试都依赖的设置。但是,如果您要修改在该设置期间创建的数据,您可能真的会把自己搞砸。如果您绝对确定这就是您想要做的,您可以使用以下作为基础 class 而不是标准测试用例。然后,不要使用 setUp
来设置测试,而是根据需要使用 before_running_all_tests
或 before_running_each_test
。
class TestCasePlus(TestCase):
_one_time_setup_complete = False
def before_running_all_tests(self):
pass
def before_running_each_test(self):
pass
def setUp(self):
if not self._one_time_setup_complete:
self.before_running_all_tests()
self.before_running_each_test()
我是第一次使用 Django 单元测试。以下是我的代码的缩小版本。
我的假设是每个 TestCase 都会调用一次 setUp 函数 class。但是当我 运行 python manage.py 测试命令时,每个测试函数都会调用一次 setUp 函数。
是我做错了什么还是我的假设有问题?
class SampleTest(TestCase):
"""
This class assumes an archiver setup with
add available at localhost:9101
query available at localhost:9105
"""
def __init__(self, *args, **kwargs):
self.init_var = False
super(SampleTest, self).__init__(*args, **kwargs)
def setUp(self):
""""""
print "setup called"
self.init_var = True
def test_1(self):
print "Test 1", self.init_var
def test_2(self):
print "Test 2", self.init_var
是的,你的假设是错误的。测试用例中的每个测试都应该是独立的;所以 setUp
(和 tearDown
) 为他们每个人调用一次。
如果你真的需要在整个过程中只做一次 class,请使用 setUpClass
;但请注意,您不应该在那里做诸如设置数据之类的事情。
这是因为每次调用测试用例时都会调用setUp
。如果你只想调用它一次,你必须使用 setUpClass
和 @classmethod
装饰器,如下所示:
class SampleTest(TestCase):
@classmethod
def setUpClass(cls):
super(SampleTest, cls).setUpClass()
# your code
我自己一直对此感到有些沮丧。通常需要完成所有测试都依赖的设置。但是,如果您要修改在该设置期间创建的数据,您可能真的会把自己搞砸。如果您绝对确定这就是您想要做的,您可以使用以下作为基础 class 而不是标准测试用例。然后,不要使用 setUp
来设置测试,而是根据需要使用 before_running_all_tests
或 before_running_each_test
。
class TestCasePlus(TestCase):
_one_time_setup_complete = False
def before_running_all_tests(self):
pass
def before_running_each_test(self):
pass
def setUp(self):
if not self._one_time_setup_complete:
self.before_running_all_tests()
self.before_running_each_test()