py3相对import和mock的问题

Posted end-emptiness

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了py3相对import和mock的问题相关的知识,希望对你有一定的参考价值。

〇、前言

  本文问题核心:在python3 相对路径import的情况下,mock对应的模块,导致对应模块内其他模块导入错误。

一、问题描述

测试用例结构:

技术图片

 

 

a.py:

# -*- coding: utf-8 -*-

import jiliguala

def afunc():
    print("this func a")

b.py:

# -*- coding: utf-8 -*-

from . import a
def bfunc():
    a.afunc()
    print("this func b")

core.py:

# -*- coding: utf-8 -*-

import unittest
import unittest.mock as mock

def test_post(x):
    print("do test http: ", x)

@mock.patch.dict("sys.modules", {
    "test.a": mock.Mock(),
})
class TestCore(unittest.TestCase):
    @mock.patch("a.afunc")
    def test1(self, test_post):
        import test.b as b
        b.bfunc()
        test_post.side_effect = test_post
        b.bfunc()

    @mock.patch("c.cpost")
    def test2(self, test_post):
        import test.c as c
        c.cfunc()
        test_post.side_effect = test_post
        c.cHttp()

  简单介绍一下,a文件是非py服务(用了一些莫名其妙的模块),b依赖于a,因此我在测试b中的代码需要将a进行隔离。

  在core代码中用装饰器的方式,将a模块隔离(from . import a这种写法,在sys.modules中就是test.a的形式),然后重写a.afunc的代码。

  好,看代码逻辑,貌似没什么问题。

结果:

技术图片

   技术图片我把整个a模块都mock了,怎么还会导入a里面的模块?

  写一个空的测试类,看看有没有mock

技术图片

 

结果:

技术图片

 

  成功mock进去了……

  问题猜测:估计是我神奇的写法有问题。

  没错!如果直接mock那个神奇的模块的话,一点问题没有,但是如果确实有这么一个模块,用到了很多其他py命令行无法调用的模块的话,还是这种写法更好一点。

二、系统路径的存放方式

三、mock方法,导入对应路径的方式

主要描述,mock只是在sys.modules里面加了对应的字典值,并附上了Mock实例

四、问题的根本原因

五、解决方法

DLC、py2和py3 import的区别

主要描述为什么py3不支持直接import包内模块

以上是关于py3相对import和mock的问题的主要内容,如果未能解决你的问题,请参考以下文章

相对导入兼容性问题 py2 和 py3

python中常用的mock介绍

java 如何mock参数

python接口自动化测试 - mock模块基本使用介绍

`from ... import`与`import .` [重复]

Spock框架Mock对象方法经验总结#yyds干货盘点#