【Python版】手把手带你如何进行Mock测试

什么是mock

mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为

为什么要使用Mock?

之所以使用mock测试,是因为真实场景很难实现或者短期实现起来很困难。主要场景有:

真实对象可能还不存在(接口还没有完成开发)

真实对象很难搭建起来(第三方支付联调

真实对象的行为很难触发(例如网络错误)

真实对象速度很慢(例如一个完整的数据库,在测试之前可能需要初始化)

真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法

真实的对象是用户界面,或包括用户页面在内

真实的对象使用了回调机制

真实对象的行为是不确定的(例如当前的时间或当前的温度)

如何使用Mock?

通过代码制造假的输出(结果)

接口自动化测试客户端Mock

通过代码去模拟假的接口返回数据(访问真实接口的过程就可以省略)

举个栗子:要测试请求接口visit接口,实际上开发还没完成开发工作,我们先编写测试用例,数据都先准备空的,然后可以运行通过,等开发好接口以后,再把相应内容如info中的数据,实际结果等修改后运行

visit方法是在base.py模块中APICase类下

  1. import unittest

  2. from common.base import APICase

  3. class TestRequest(unittest.TestCase, APICase):

  4. def test_request(self):

  5. """

  6. 1.准备接口接口访问的数据

  7. 2.调用接口访问visit方法

  8. 3.断言

  9. """

  10. info = {"headers": "", "json": "", "expected": ""}

  11. # actual = self.visit(info)

  12. actual = ""

  13. self.assertEqual(info['expected'], actual)

 mock是python的第三方库,所以使用mock前,需要先进行安装pip install mock

修改代码如下:

  1. import unittest

  2. from common.base import APICase

  3. from mock import Mock

  4. class TestRequest(unittest.TestCase, APICase):

  5. def test_request(self):

  6. """

  7. 1.准备接口接口访问的数据

  8. 2.调用接口访问visit方法

  9. 3.断言

  10. """

  11. info = {"headers": "", "json": "", "expected": ""}

  12. self.visit = Mock(return_value="")

  13. actual = self.visit(info)

  14. # actual = ""

  15. self.assertEqual(info['expected'], actual)

运行结果:

当接口没开发出来时,直接编写这行代码,因为调用的是mock返回的内容

actual = self.visit(info)当接口开发完成时,把这行代码注释掉即可

self.visit = Mock(return_value="")如果想设置返回的数据,也是可以的,如下

拿之前测试注册接口为例,修改代码如下:

 
  1. import unittest

  2. import requests

  3. from mock import Mock

  4. class TestRegister(unittest.TestCase):

  5. def test_register_01(self):

  6. '''步骤:

  7. 1.准备测试数据

  8. 2.发送接口请求,得到实际结果

  9. 3.预期结果和实际结果的断言

  10. '''

  11. # 1.准备测试数据

  12. url = 'http://api.lemonban.com:8766/futureloan/member/register'

  13. method = 'post'

  14. headers = {'X-Lemonban-Media-Type': 'lemonban.v2'}

  15. json_data = {"mobile_phone": "", "pwd": "12345678"}

  16. expected = {

  17. "code": 1,

  18. "msg": "手机号为空",

  19. "data": None,

  20. "copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"

  21. }

  22. # 2.发送接口请求,得到实际结果

  23. # 因为执行了Mock,所以就不会执行请求真实的接口了

  24. requests.request = Mock(return_value=expected)

  25. response = requests.request(method=method, url=url, headers=headers, json=json_data)

  26. # mock返回的是expected的内容,因此是dict,所以实际结果要把之前代码上的.json去掉

  27. actual = response

  28. # 3.预期结果和实际结果的断言

  29. self.assertEqual(expected, actual)

 只需要修改两处代码,即可访问假的接口

加上下面这行代码

requests.request = Mock(return_value=expected)修改下面这行代码

actual = response.json() 修改为 actual = response

服务Mock(Mock Server)

方法一:

开发的接口是在server,真实的服务器

我就自己冒充开发人员,写一个假的服务器,写一个假的接口,可以通过mockoon工具实现

直接去官网下载安装即可

打开mockoon,设置请求方法、URL、返回内容,点击开启服务按钮

 这时候就可以请求服务接口了

方法二:

测试开发技术,自己做一个真实的服务出来,确实可以支持更多的响应,会省略很多步骤

用代码编写一个服务接口

 
  1. from flask import Flask

  2. app = Flask("py44")

  3. @app.route('/member/register', methods=['post'])

  4. def register():

  5. return {"code": 11, "msg": "success"}

  6. app.run(debug=True)

运行结果:

只有运行代码,才算开启服务

这时候就可以请求服务接口了

方法2的灵活之处就是可以支持更多响应,如设置请求体

  1. from flask import Flask, request

  2. app = Flask("py44")

  3. @app.route('/member/register', methods=['post'])

  4. def register():

  5. username = request.form.get('username')

  6. password = request.form.get('password')

  7. if username == 'momo' and password == '123456':

  8. return {"code": 11, "msg": "success"}

  9. return {"code": 22, "msg": "failed"}

  10. app.run(debug=True)

启动服务后,使用postman请求

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值