我正在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):
...
答案 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
。剩下的就是单纯的测试。
希望有所帮助。 对于社区的其他人,如果有任何问题,或者有更好的方法,请纠正我。