我目前有一个看起来像的unittest.TestCase ..
class test_appletrailer(unittest.TestCase): def setup(self): self.all_trailers = Trailers(res = "720", verbose = True) def test_has_trailers(self): self.failUnless(len(self.all_trailers) > 1) # ..more tests..
这工作正常,但Trailers()
调用大约需要2秒才能运行..鉴于setUp()
在每次测试运行之前调用,测试现在需要大约10秒才能运行(只有3个测试函数)
self.all_trailers
在测试之间缓存变量的正确方法是什么?
删除setUp函数,并执行..
class test_appletrailer(unittest.TestCase): all_trailers = Trailers(res = "720", verbose = True)
..works,但它声称"在0.000s中进行3次测试"这是不正确的..我能想到的另一种方法是拥有一个cache_trailers全局变量(它工作正常,但相当可怕):
cache_trailers = None class test_appletrailer(unittest.TestCase): def setUp(self): global cache_trailers if cache_trailers is None: cache_trailers = self.all_trailers = all_trailers = Trailers(res = "720", verbose = True) else: self.all_trailers = cache_trailers
cdleary.. 14
使用只被初始化一次的类成员怎么样?
class test_appletrailer(unittest.TestCase): all_trailers = None def setup(self): # Only initialize all_trailers once. if self.all_trailers is None: self.__class__.all_trailers = Trailers(res = "720", verbose = True)
引用的查找self.all_trailers
将转到MRO的下一步- self.__class__.all_trailers
它将被初始化.
使用只被初始化一次的类成员怎么样?
class test_appletrailer(unittest.TestCase): all_trailers = None def setup(self): # Only initialize all_trailers once. if self.all_trailers is None: self.__class__.all_trailers = Trailers(res = "720", verbose = True)
引用的查找self.all_trailers
将转到MRO的下一步- self.__class__.all_trailers
它将被初始化.
建议的解决方案的替代方案是使用像Nose这样功能更强大的测试运行器.使用Nose,您可以拥有模块级设置功能,这些功能将针对测试模块运行一次.由于它与unittest完全兼容,因此您无需更改任何代码.
从鼻子手册:
nose支持包,模块,类和测试用例级别的夹具,因此 可以 尽可能不频繁地进行昂贵的初始化.
这里详细描述了固定装置.当然,除了满足您的用例之外,我还强烈建议将其作为一般测试工具.没有它,我的项目都不会离开家.
如果您使用的是Python> = 2.7,则可以使用setUpClass
仅为整个单元测试调用一次的方法.
import unittest from trailers import Trailers class AppleTrailerTestCase(unittest.TestCase): @classmethod def setUpClass(cls): # only initialize all_trailers once cls.all_trailers = Trailers(res='720', verbose=True) @classmethod def tearDownClass(cls): # drop the reference explicitly to let the Trailers object be garbage # collected cls.all_trailers = None def test_one(self): # ... def test_two(self): # ...