Python单元测试unitest之循环嵌套mock使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hguo11/article/details/82291419

新建文件

function.py

def add_and_multiply(x, y):
    addition = x + y
    multiple1 = multiply2(x, y)+multiply1(x,y)
    return (addition, multiple1)


def multiply1(x, y):
    return x * y+3


def multiply2(x, y):
    return x * y+3

再新建一个文件func_test.py

import unittest
import function
from unittest.mock import patch


class MyTestCase(unittest.TestCase):

    @patch("function.multiply1")
    @patch("function.multiply2")
    def test_add_and_multiply(self,mock_multiply1,mock_multiply2):
        x = 3
        y = 5
        mock_multiply1.return_value = 15
        mock_multiply2.return_value=15
        addition, multiple= function.add_and_multiply(x, y)
        self.assertEqual(8, addition)
        self.assertEqual(30, multiple)



if __name__ == "__main__":
    unittest.main()

这样就可以了,


上面的两个文件是在一个目录下的,但是我们的测试代码通常和主执行程序是要分开的,这样的话,就会出现如下的结构。
这里写图片描述
这样的话相应大代码就要做如下调整
func_test.py

import unittest
from unittest.mock import patch
from python import fun1
# from python.fun1 import multiply1,multiply2

class MyTestCase(unittest.TestCase):

    @patch("python.fun1.multiply1")
    @patch("python.fun1.multiply2")
    def test_add_and_multiply(self,mock_multiply1,mock_multiply2):
        x = 3
        y = 5
        mock_multiply1.return_value = 15
        mock_multiply2.return_value=15
        addition, multiple= fun1.add_and_multiply(x, y)
        self.assertEqual(8, addition)
        self.assertEqual(30, multiple)



if __name__ == "__main__":
    unittest.main()

func1.py

def add_and_multiply(x, y):
    addition = x + y
    multiple1 = multiply2(x, y)+multiply1(x,y)
    return (addition, multiple1)


def multiply1(x, y):
    return x * y+3


def multiply2(x, y):
    return x * y+3

这样就可以了,使用的是绝对路径。


对于如下的更加复杂的嵌套关系的话
这里写图片描述
其中代码如下
func_test.py

import unittest
from unittest.mock import patch
from python import fun1
# from python.fun1 import multiply1,multiply2

class MyTestCase(unittest.TestCase):

    @patch("python.fun1.multiply1")
    @patch("python.fun1.multiply2")
    def test_add_and_multiply(self,mock_multiply1,mock_multiply2):
        x = 3
        y = 5
        mock_multiply1.return_value = 15
        mock_multiply2.return_value=15
        addition, multiple= fun1.add_and_multiply(x, y)
        self.assertEqual(8, addition)
        self.assertEqual(33, multiple)#有改动
        print('ojbk')   #有改动



if __name__ == "__main__":
    unittest.main()

可以看到代码没有变的 就是30变成了33 因为我后面要加3的

fun1.py

from .fun1sub import jia3

def add_and_multiply(x, y):
    addition = x + y
    multiple1 = multiply2(x, y)+multiply1(x,y)+jia3()
    return (addition, multiple1)


def multiply1(x, y):
    return x * y+3


def multiply2(x, y):
    return x * y+3

fun1sub.py

def jia3():
    return 3

这样是可以直接运行func_test的。

这里fun1.py中的from . import 这句话要注意,一般情况下在这个py文件中你直接运行这个py是不行的。
比如这里写图片描述
但是如果要让另外一个函数调用它的话,是可以的,不知道为啥,为了保险的话还是用绝对路径from python.fun1sub import jia3比较好。
这个图片中报的错可以参考我另外一篇博客。

猜你喜欢

转载自blog.csdn.net/hguo11/article/details/82291419