类和模块级脚手架在TestSuite
中实现。当测试套件遇到来自新类的测试时,将调用前一个类(如果有的话)中的tearDownClass()
,然后调用新类中的setUpClass()
。
同样地,如果测试来自与前一个测试不同的模块,则运行前一个模块的tearDownModule
,然后运行新模块的setUpModule
。
在运行所有测试之后,运行最终的tearDownClass
和tearDownModule
。
请注意,共享脚手架与[潜在]功能(如测试并行化)不能很好地兼容,并且会破坏测试隔离。应小心使用它们。
unittest测试加载器创建的测试的默认顺序是将来自相同模块和类的所有测试组合在一起。这将导致每个类和模块只调用一次setUpClass
/setUpModule
(诸如此类)。如果随机化顺序,以便来自不同模块和类的测试彼此相邻,则可以在单个测试运行中多次调用这些共享脚手架函数。
共享脚手架不适用于非标准订购的套件。对于不希望支持共享脚手架的框架,仍然存在BaseTestSuite
。
如果在其中一个共享脚手架功能期间抛出任何异常,则将测试报告为错误。由于没有相应的测试实例,因此会创建_ErrorHolder
对象(具有与TestCase
相同的接口)来表示错误。如果你只是使用标准的unittest测试运行器,那么这个细节并不重要,但如果你是框架作者,它可能是相关的。
9.1 setUpClass和tearDownClass
这些必须作为类方法实现:
import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls._connection = createExpensiveConnectionObject()
@classmethod
def tearDownClass(cls):
cls._connection.destroy()
如果你想在被调用的基类上使用setUpClass
和tearDownClass
,那么你必须自己调用它们。TestCase
这部分的实现是空的。
如果在setUpClass
期间引发异常,则不会运行类中的测试,并且不会运行tearDownClass
。跳过的类不会运行setUpClass
或tearDownClass
。如果异常是SkipTest
异常,则该类将被报告成已跳过而不是错误。
9.2 setUpModule和tearDownModule
这些应该作为功能实现:
def setUpModule():
createConnection()
def tearDownModule():
closeConnection()
如果在setUpModule
中引发异常,则模块中的所有测试都不会运行,并且不会运行tearDownModule
。如果异常是SkipTest
异常,则模块将被报告为已跳过而不是错误。