程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在python中,在setup / teardown中使用上下文管理器是否有一个很好的习惯用法

发布于2019-08-25 21:57     阅读(737)     评论(0)     点赞(3)     收藏(0)


我发现我在Python中使用了大量的上下文管理器。但是,我一直在测试使用它们的一些东西,我经常需要以下内容:

class MyTestCase(unittest.TestCase):
  def testFirstThing(self):
    with GetResource() as resource:
      u = UnderTest(resource)
      u.doStuff()
      self.assertEqual(u.getSomething(), 'a value')

  def testSecondThing(self):
    with GetResource() as resource:
      u = UnderTest(resource)
      u.doOtherStuff()
      self.assertEqual(u.getSomething(), 'a value')

当这得到很多测试时,这显然会变得无聊,所以本着SPOT / DRY的精神(单点真相/不要重复自己),我想将这些位重构为测试setUp()tearDown()方法。

然而,试图这样做会导致这种丑陋:

  def setUp(self):
    self._resource = GetSlot()
    self._resource.__enter__()

  def tearDown(self):
    self._resource.__exit__(None, None, None)

必须有更好的方法来做到这一点。理想情况下,在每个测试方法setUp()/ tearDown()不重复位中(我可以看到如何重复每个方法上的装饰器可以做到这一点)。

编辑:将底层对象视为内部GetResource对象,将对象视为第三方对象(我们不会更改)。

我已经重命名GetSlotGetResourcehere-这比特定情况更通用 - 其中上下文管理器是对象打算进入锁定状态的方式。


解决方案


unittest.TestCase.run()如下所示覆盖怎么样这种方法不需要调用任何私有方法或对每个方法执行某些操作,这就是提问者想要的。

from contextlib import contextmanager
import unittest

@contextmanager
def resource_manager():
    yield 'foo'

class MyTest(unittest.TestCase):

    def run(self, result=None):
        with resource_manager() as resource:
            self.resource = resource
            super(MyTest, self).run(result)

    def test(self):
        self.assertEqual('foo', self.resource)

unittest.main()

TestCase如果要在TestCase那里修改实例此方法还允许将实例传递给上下文管理器



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/59742/eb08b41929a91ff4fdf7/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)