当前位置:  开发笔记 > 编程语言 > 正文

使用Python unittest缓存setUp()的结果

如何解决《使用Pythonunittest缓存setUp()的结果》经验,为你挑选了3个好方法。

我目前有一个看起来像的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它将被初始化.



1> cdleary..:

使用只被初始化一次的类成员怎么样?

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它将被初始化.


@Tal如果你使用Python> = 2.7,你可以在`setUpClass(cls)`中创建`all_trailers`并在`tearDownClass(cls)`classmethods中删除对它的引用.见http://docs.python.org/library/unittest.html#setupclass-and-teardownclass
在完成所有课堂测试后(假设我需要),如何销毁"预告片"?

2> Ali Afshar..:

建议的解决方案的替代方案是使用像Nose这样功能更强大的测试运行器.使用Nose,您可以拥有模块级设置功能,这些功能将针对测试模块运行一次.由于它与unittest完全兼容,因此您无需更改任何代码.

从鼻子手册:

nose支持包,模块,类和测试用例级别的夹具,因此 可以 尽可能不频繁地进行昂贵的初始化.

这里详细描述了固定装置.当然,除了满足您的用例之外,我还强烈建议将其作为一般测试工具.没有它,我的项目都不会离开家.



3> chiborg..:

如果您使用的是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):
        # ...

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有