2017-10-10 60 views
0

我正在编写MyClass的单元测试mymodule,它使用 keras.models.load_model。每当我运行我的单元测试时,导入keras库需要几秒钟,然后输出消息:“使用TensorFlow后端。” 这样的行为很烦人。是否有可能阻止在python2.7中导入 模块(并改为使用Mock())?如何在python2.7中防止导入(并获取模块,而不是模块)

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

虽然我不熟悉的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添加到我的可用模块(我没有安装它)。 MagicMock至于在导入keras之前,我是你的情况下才导入mymodule

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

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

+0

非常感谢。 我以前试过'sys.modules ['keras'] = MagicMock()'但是这会引发一个错误。 不改变mymodule.py我宁愿模拟所有keras子模块,像这样: 'sys.modules中[ 'keras'] = MagicMock()'' sys.modules中[ 'keras.models'] = MagicMock( )' 'sys.modules ['keras.models.load_model'] = MagicMock()' –

+0

不错,这也是可行的,因为我在说。如果您没有其他问题,请将您的问题解决。 – wilfriedrt

相关问题