0
点赞
收藏
分享

微信扫一扫

python接口自动化之mock的使用

非凡兔 2022-01-21 阅读 65

一、Mock是什么?

二、为什么要使用的mock?

三、Mock可以解决哪些场景问题?

  • 接口的依赖
  • 外部接口调用
  • 测试环境非常复杂
    具体来说就是:

四、mock的使用

五、mock的代码实现
1、mock的基本使用

# -*- coding: utf-8 -*-
# @Time: 2022/1/20 5:50 下午
# @Author: wcystart
# @File: modular.py
# @description:
"""
这里要实现一个Count计算类,add() 方法要实现两数相加。
但,这个功能我还没有完成。这时就可以借助mock对其进行测试。
"""


class Count():
    def add(self):
        pass

# -*- coding: utf-8 -*-
# @Time: 2022/1/20 5:51 下午
# @Author: wcystart
# @File: mock_demo01.py
# @description:
from unittest.mock import Mock
import unittest
from modular import Count


class TestCount(unittest.TestCase):
    def test_add(self):
        # 首先,调用被测试类Count()
        count = Count()
        # 通过Mock类模拟被调用的方法add()方法,return_value 定义add()方法的返回值。
        count.add = Mock(return_value=13)
        # 正常的调用add()方法,传两个参数8和5,然后会得到相加的结果13。然后,13的结果是我们在上一步就预先设定好的。
        result = count.add(8, 5)
        self.assertEqual(result, 13)


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

2、mock解决依赖

# -*- coding: utf-8 -*-
# @Time: 2022/1/21 11:13 上午
# @Author: wcystart
# @File: function.py
# @description: 定义一个函数,用来计算两个数的和、乘积

def add_and_multiply(x, y):
    addition = x + y
    mul = multiply(x, y)
    return addition, mul


def multiply(x, y):
    return x * y

然后针对:add_and_multiply()函数编写测试用例

import unittest
import function


class MyTestCase(unittest.TestCase):
    def test_add_and_multiple(self):
        x = 3
        y = 5
        addition, mul = function.add_and_multiply(x, y)
        self.assertEqual(8, addition)
        self.assertEqual(15, mul)


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

运行结果:
Ran 1 test in 0.004s

OK

add_and_multiply()函数依赖了multiply()函数的返回值。如果这个时候修改multiply()函数的代码。

def multiply(x, y):
    return x * y + 6


再次运行,就会断言失败:
21 != 15

Expected :15
Actual   :21
<Click to see difference>

Traceback (most recent call last):
  File "/Users/wangchuangyan/Desktop/py42/mock/func_test.py", line 16, in test_add_and_multiple
    self.assertEqual(15, mul)
AssertionError: 15 != 21

测试用例运行失败了,然而,add_and_multiply()函数以及它的测试用例并没有做任何修改,罪魁祸首是multiply()函数引起的,那么此时我们应该把 multiply()函数mock掉。

import unittest
import function
from unittest.mock import patch


class MyTestCase(unittest.TestCase):
    # 针对add_and_multiply做测试用例
    # def test_add_and_multiply(self):
    #     x = 3
    #     y = 5
    #     addition, multiple = function.add_and_multiply(x, y)
    #     self.assertEqual(8, addition)
    #     self.assertEqual(15, multiple)

    """
    patch()装饰/上下文管理器可以很容易地模拟类或对象在模块测试。
    在测试过程中,您指定的对象将被替换为一个模拟(或其他对象),
    并在测试结束时还原。
    """

    # 模拟function.py文件中multiply()函数
    # 将mock的multiply()函数(对象)重命名为 mock_multiply对象
    @patch("function.multiply")
    def test_add_and_multiple2(self, mock_multiply):
        x = 3
        y = 5
        # 设定mock_multiply对象的返回值为固定的15
        mock_multiply.return_value = 15
        addition, multiple = function.add_and_multiply(x, y)
        # 检查mock_multiply方法的参数是否正确
        mock_multiply.assert_called_once_with(3, 5)

        self.assertEqual(8, addition)
        self.assertEqual(15, multiple)


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

再次运行:运行通过
Ran 1 test in 0.004s

OK

Process finished with exit code 0

六、patch装饰器简介

举报

相关推荐

0 条评论