Sta*_*ale 21 python unit-testing
我的测试文件基本上是:
class Test(unittest.TestCase):
def testOk():
pass
if __name__ == "__main__":
expensiveSetup()
try:
unittest.main()
finally:
cleanUp()
Run Code Online (Sandbox Code Playgroud)
但是,我确实希望通过Netbeans测试工具运行我的测试,为此,我需要不依赖于在main中完成的环境设置的单元测试.综观单元测试使用Python安装程序的缓存结果() -它建议使用鼻子.但是,我不认为Netbeans支持这一点.我没有找到任何表明它的信息.另外,我是这里唯一一个实际编写测试的人,所以除非需要,否则我不想为其他2个开发人员引入额外的依赖项.
对于TestSuite中的所有测试,如何进行一次设置和清理?
这里昂贵的设置是创建一些带有虚拟数据的文件,以及设置和拆除一个简单的xml-rpc服务器.我还有2个测试类,一个在本地测试,另一个在xml-rpc上测试所有方法.
Mek*_*ekk 25
如果你使用Python> = 2.7(或者unittest2 for Python> = 2.4&<= 2.6),最好的方法是使用
def setUpClass(cls):
# ...
setUpClass = classmethod(setUpClass)
Run Code Online (Sandbox Code Playgroud)
为属于给定类的所有测试执行一次初始化.
要执行清理,请使用:
@classmethod
def tearDownClass(cls):
# ...
Run Code Online (Sandbox Code Playgroud)
另请参阅setUpClass和tearDownClass classmethods上的unittest标准库文档.
这就是我做的:
class TestSearch(unittest.TestCase):
"""General Search tests for...."""
matcher = None
counter = 0
num_of_tests = None
def setUp(self): # pylint: disable-msg=C0103
"""Only instantiate the matcher once"""
if self.matcher is None:
self.__class__.matcher = Matcher()
self.__class__.num_of_tests = len(filter(self.isTestMethod, dir(self)))
self.__class__.counter = self.counter + 1
def tearDown(self): # pylint: disable-msg=C0103
"""And kill it when done"""
if self.counter == self.num_of_tests:
print 'KILL KILL KILL'
del self.__class__.matcher
Run Code Online (Sandbox Code Playgroud)
可悲的是(因为我确实希望我的测试是独立的和确定的),我做了很多(因为系统测试花费不到5分钟也很重要).
expensiveSetup()无论是否运行,您都可以保存状态。
__expensiveSetup_has_run = False
class ExpensiveSetupMixin(unittest.TestCase):
def setUp(self):
global __expensiveSetup_has_run
super(ExpensiveSetupMixin, self).setUp()
if __expensiveSetup_has_run is False:
expensiveSetup()
__expensiveSetup_has_run = True
Run Code Online (Sandbox Code Playgroud)
或者是这个的某种变体。也许 ping xml-rpc 服务器并创建一个新服务器(如果它没有响应)。
但据我所知,单元测试的方式是在每个单元测试中进行设置和拆卸,即使它很昂贵。