我正在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"""
...
Run Code Online (Sandbox Code Playgroud)
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):
...
Run Code Online (Sandbox Code Playgroud)
小智 5
虽然我不熟悉 keras lib,但我认为您可以通过结合使用 MagicMock 和模块修补来测试工作。
mymodule.py:
import keras
class MyClass(object):
def __init__(self):
"""I use load_model here"""
self.example = keras.models.load_model()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我得到了预期的结果:
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.016s
OK
Run Code Online (Sandbox Code Playgroud)
我会尝试解释更多(我不是单元测试或模拟方面的专家)。首先,您会注意到我已经更改了 keras 库的导入。这只是为了避免keras嘲笑。我将 MagicMock 添加到我的可用模块中(我没有安装它)。MagicMock至于要在导入之前,我先介绍一下导入之前的情况。keras.modelskeras.models.load_modelkerasmymodule
之后,我keras.models.load_model为我的单元测试打补丁test_my_super_test。您收到模拟方法作为测试的属性,我已将该属性命名为mock_load_model。您可以使用此模拟方法来定义其返回值。这就是我在网上所做的mock_load_model.return_value = fake_return_value。当我调用 load_model 时,该方法将返回fake_return_value。剩下的就是简单的单元测试。
希望有帮助。对于社区的其他人,如果有问题或者有更好的方法,请纠正我。
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |