setUp()
和setUpClass()
有什么区别?为什么会在其中一个方法中处理设置?我想了解在
setUp()
和setUpClass()
函数中分别完成了哪些设置,以及tearDown()
和tearDownClass()
的作用。setUp()
和setUpClass()
有什么区别?为什么会在其中一个方法中处理设置?setUp()
和setUpClass()
函数中分别完成了哪些设置,以及tearDown()
和tearDownClass()
的作用。当您的类中有多个测试方法时,差异就会显现出来。 setUpClass
和 tearDownClass
只在整个类执行一次;setUp
和 tearDown
在每个测试方法之前和之后执行。
例如:
class Example(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass")
def setUp(self):
print("setUp")
def test1(self):
print("test1")
def test2(self):
print("test2")
def tearDown(self):
print("tearDown")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
当你运行此测试时,它会打印:
setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass
(当一个测试通过时,“.”是unittest
的默认输出。)请注意,setUp
和tearDown
出现在test1
和test2
之前和之后,而setUpClass
和tearDownClass
只出现一次,在整个测试用例的开头和结尾。
unittest
框架中的 setUp()
和 setUpClass()
有什么区别?主要区别(如 Benjamin Hodgson 的答案所述)在于 setUpClass
只会在所有测试之前调用一次,而 setUp
会在每个测试之前立即调用。 (注意:其他 xUnit 测试框架的等效方法也是如此,不仅仅是 Python 的 unittest
。)
来自unittest
文档:
setUpClass()
在运行类中的测试之前调用的类方法。 setUpClass 以类作为唯一参数进行调用,并必须被装饰为 classmethod():
@classmethod
def setUpClass(cls):
...
和:
setUp()
准备测试夹具的方法。在调用测试方法之前立即调用此方法;除了AssertionError或SkipTest之外,由此方法引发的任何异常都将被视为错误而不是测试失败。默认实现什么也不做。
这个问题的这部分尚未得到回答。根据我对Gearon答案的评论,setUp
方法是为了处理所有测试共通的夹具元素(避免在每个测试中重复该代码)。我发现这通常很有用,因为消除重复通常可以提高可读性并减少维护负担。
setUpClass
方法用于昂贵的元素,您希望只需执行一次,例如打开数据库连接、在文件系统上打开临时文件、加载用于测试的共享库等。在每个测试之前执行这些操作会使测试套件变慢,因此我们只需在所有测试之前执行一次。这是测试独立性的轻微降级,但在某些情况下是必要的优化。可以说,在单元测试中不应该这样做,因为通常可以模拟数据库/文件系统/库/任何内容而不使用真实的东西。因此,我发现很少需要使用setUpClass
。但是,在必须测试上述示例(或类似情况)时,它很有用。
setUp()
和setUpClass()
方法用于在运行测试之前设置测试环境。这两种方法之间的主要区别是:setUp()
方法:在每个测试方法运行之前调用,为每个单独的测试方法设置测试环境。
- setUpClass()
方法:在整个类中的所有测试运行之前调用一次,为整个类设置测试环境。setUpClass()
而不是setUp()
的示例:setUpClass()
来执行只需要在类中的所有测试运行之前执行一次的任务。你应该使用setUp()
来执行在每个单独的测试方法运行之前需要执行的任务。
tearDown()
和tearDownClass()
方法用于在测试运行后拆除测试环境。tearDown()
方法在每个测试方法运行后调用,tearDownClass()
方法在类中的所有测试运行后调用。这些方法用于清理测试所使用的任何资源,例如数据库连接或网络驱动程序,并将测试环境重置为初始状态。
unittest
认为测试只有在其tearDown
顺利完成后才算通过。 - Benjamin Hodgson