单元测试中mock的简易使用


前言

在进行单元测试时,我们常常需要对不同模块功能进行联调测试,而如果其中一种功能的未完成而影响其他功能测试,这样就会拖延测试进度,因此需要一种方法来解决这个问题。


一、mock是什么?

在测试中,mock是单元测试中的一种模拟行为,通过mock可以对未完成的功能进行模拟返回值,从而不影响其他功能的测试。

二、例子

1.未开发完成的功能

此处以计算器加法功能为一个例子
代码(Api_demo.py)如下:

# 计算器类
class Count():
    # 未完成的加法逻辑
    def add(self):
        pass

2.使用mock模拟未完成的功能

Python3中mock集成在unittest中,无需额外安装
代码(mock_example.py)如下:

from unittest import mock
from Api_demo import Count
import unittest

class TestCount(unittest.TestCase):
    def test_add(self):
        # 被测试类实例化
        count = Count()
        # 使用mock模拟add函数返回值,如果函数功能开发完成,side_effect将会取实际值覆盖模拟值
        count.add = mock.Mock(return_value=16,side_effect=count.add)
        # 真实结果,无视传参
        result = count.add(7, 5)
        # 真实结果预期等于模拟结果
        self.assertEqual(result, 16)


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

3.应用—解决测试依赖

当功能之间相互关联,在运行测试用例时,其中一个模块的改变会导致其他功能用例不通过,但是其他功能是正常的,不应该测试不通过,因此要解决测试依赖这个问题。
1、定义两个相关联的功能,此处以加法和乘法为例子创建函数,代码(function.py)如下:

# 加法和乘法功能
def A_function(a, b):
    sum = a + b
    #调用B_function
    multip = B_function(a, b)
    return sum, multip


# 乘法功能(未完成)
def B_function(a, b):
    pass

2、在测试用例中的使用,代码(test_case.py)如下:

import unittest
from unittest.mock import patch
import function


class MockTest(unittest.TestCase):
    # @patch可以将指定类和对象在模块中进行测试
    @patch('function.B_function')
    def test_A_and_B(self, multip_functon):
        x = 4
        y = 6
        # 模拟乘法功能返回值
        multip_functon.return_value = 24
        sum, multip = function.A_function(x, y)
        # 用来判断未开发的功能传参是否正确
        multip_functon.assert_called_once_with(4, 6)
        self.assertEqual(sum, 10)
        self.assertEqual(multip, 24)


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

总结

以上就是今天要讲的内容,本文仅仅简单介绍了mock的使用,使我们只要知道正常功能会返回的数据,就可以模拟该数据,从而达到测试目的,不影响测试进度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值