首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python,单元测试和模拟导入

Python,单元测试和模拟导入
EN

Stack Overflow用户
提问于 2018-09-19 04:24:32
回答 2查看 0关注 0票数 0

我在一个项目中,我们开始重构一些庞大的代码库。立即出现的一个问题是每个文件都会导入很多其他文件。我如何以优雅的方式在我的单元测试中模拟这个而不必改变实际的代码,这样我就可以开始编写单元测试了?

作为一个例子:具有我想要测试的函数的文件,导入其他十个文件,这些文件是我们软件的一部分,而不是python核心库。

我希望能够尽可能单独运行单元测试,现在我只测试不依赖于正在导入的文件中的内容的函数。

感谢所有的答案。

我从一开始就不知道自己想做什么,但现在我想我知道了。

问题是一些导入只有在整个应用程序运行时才有可能因为一些第三方自动魔法。所以我必须在我用sys.path指出的目录中为这些模块制作一些存根

现在我可以在我的单元测试文件中导入包含我想要编写测试功能的文件,而不会抱怨缺少模块。

EN

回答 2

Stack Overflow用户

发布于 2018-09-19 13:11:42

如果要在导入模块的同时确保它不导入任何内容,则可以替换__import__内置函数。

例如,使用此类:

代码语言:javascript
复制
class ImportWrapper(object):
    def __init__(self, real_import):
        self.real_import = real_import

    def wrapper(self, wantedModules):
        def inner(moduleName, *args, **kwargs):
            if moduleName in wantedModules:
                print "IMPORTING MODULE", moduleName
                self.real_import(*args, **kwargs)
            else:
                print "NOT IMPORTING MODULE", moduleName
        return inner

    def mock_import(self, moduleName, wantedModules):
        __builtins__.__import__ = self.wrapper(wantedModules)
        try:
            __import__(moduleName, globals(), locals(), [], -1)
        finally:
            __builtins__.__import__ = self.real_import

在您的测试代码中,不要写import myModule,而是写:

代码语言:javascript
复制
wrapper = ImportWrapper(__import__)
wrapper.mock_import('myModule', [])

的第二个参数mock_import是模块名称的列表,你希望内部模块的导入。

此示例可以进一步修改为例如导入除期望之外的其他模块,而不是仅仅导入它,甚至可以使用您自己的某个自定义对象模拟模块对象。

票数 0
EN

Stack Overflow用户

发布于 2018-09-19 13:40:01

“导入很多其他文件”?导入许多其他文件,这些文件是您自定义代码库的一部分?或者导入许多属于Python发行版的其他文件?还是导入了很多其他开源项目文件?

如果您的导入不起作用,则会出现“简单”的PYTHONPATH问题。获取所有PYTHONPATH可用于测试的项目目录。我们有一个相当复杂的路径,在Windows中我们像这样管理它

代码语言:javascript
复制
@set Part1=c:\blah\blah\blah
@set Part2=c:\some\other\path
@set that=g:\shared\stuff
set PYTHONPATH=%part1%;%part2%;%that%

我们将每条路径分开,以便我们(a)知道事物的来源和(b)在我们移动物体时可以管理变化。

由于按PYTHONPATH顺序搜索,我们可以通过调整路径上的顺序来控制使用的内容。

一旦你拥有了“一切”,它就成了一个信任的问题。

  • 你相信某些东西(即Python代码库)并只是导入它。

要么

  • 你不相信某些东西(即你自己的代码)和你
    1. 单独测试它
    2. 嘲笑它进行独立测试。

你会测试Python库吗?如果是这样,你就有很多工作要做。如果没有,那么,你应该只模拟你实际要测试的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档