如何在python2.7

时间:2017-10-10 12:37:29

标签: python-2.7

我正在MyClass中使用mymodule编写单元测试 keras.models.load_model。每次运行我的单元测试时,导入keras库花了几秒钟打印消息:“使用TensorFlow后端”。 这样的行为很烦人。是否有可能阻止进口 python2.7中的模块(并改为获取Mock())?

mymodule.py:

from keras.models import load_model

class MyClass:
    def __init__(self):
    """I use load_model here"""
...

test_mymodule.py

import unittest

from mock import Mock, MagicMock, patch

from mymodule import MyClass

class MyClassInitializationTestCase(unittest.TestCase):
    def test_my_super_test(self):
...

1 个答案:

答案 0 :(得分:0)

虽然我不熟悉keras lib,但我认为你可以通过结合使用MagicMock和模块修补来测试你的工作。

mymodule.py:

import keras


class MyClass(object):
    def __init__(self):
        """I use load_model here"""
        self.example = keras.models.load_model()

test_mymodule.py:

import unittest
import sys
from mock import Mock, MagicMock, patch

sys.modules['keras'] = MagicMock() # as to be done before importing mymodules
from mymodule import MyClass

class MyClassInitializationTestCase(unittest.TestCase):

    @patch('keras.models.load_model')
    def test_my_super_test(self, mock_load_model):
        """ super test """
        fake_return_value = "bar"
        mock_load_model.return_value = fake_return_value
        foo = MyClass()
        self.assertEqual(foo.example, fake_return_value)
        mock_load_model.assert_called_once()

当我进行测试时,我得到了预期的结果:

$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK

我会尝试解释一下(我不是单位测试或嘲笑的专家)。首先,您会注意到我已经更改了您的keras库的导入。这只是为了避免模仿keras,然后是keras.models,最后是keras.models.load_model。我将MagicMock添加到我的可用模块中(我没有安装它)。导入keras之前的MagicMock,我是在导入mymodule之前的情况。

之后,我为我的unittest keras.models.load_model修补test_my_super_test。您收到模拟方法作为测试属性,我已将该属性命名为mock_load_model。您可以使用此模拟方法来定义其返回值。这就是我在第mock_load_model.return_value = fake_return_value行上所做的。当我调用load_model时,该方法将返回fake_return_value。剩下的就是单纯的测试。

希望有所帮助。 对于社区的其他人,如果有任何问题,或者有更好的方法,请纠正我。