我在写单元测试用于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):
...
尽管我不熟悉keras库,但我认为可以结合使用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添加到我的可用模块中(我没有安装它)。至于MagicMock,在导入之前keras
,我要在导入之前进行说明mymodule
。
在那之后,我修补keras.models.load_model
我的单元测试test_my_super_test
。您将嘲笑的方法作为测试的属性,我将其命名为attribute mock_load_model
。您可以使用此模拟方法定义其返回值。那就是我在网上所做的mock_load_model.return_value = fake_return_value
。当我调用load_model时,该方法将返回fake_return_value
。其余的都是简单的单元测试。
希望对您有所帮助。对于社区的其他人,如果这有什么不对劲或有更好的解决方法,请纠正我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句