news 2026/5/28 8:09:02

接口自动化测试之Mock服务实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接口自动化测试之Mock服务实现
1.Mock实现原理和实现机制

在某些时候,后端在开发接口的时候,处理逻辑非常复杂,在测试的时候,后端在未完成接口的情况下该如何去测试呢?

我们需要测试,但是有些请求又需要修改一下参数,或者改变一下request实现的方式,比如修改状态码,产生的图片要进行替换,或者是替换执行文件等

  • Mock介绍

    Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。

  • 在项目的单元测试过程中,会遇到:

    1、接口的依赖

    2、外部接口调用

    3、测试环境非常复杂

    单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。

  • 解决测试依赖

    例如,我们要测试A模块,然后A模块依赖于B模块的调用。但是,由于B模块的改变,导致了A模块返回结果的改变,从而使A模块的测试用例失败。其实,对于A模块,以及A模块的用例来说,并没有变化,不应该失败才对。

    这个时候就是mock发挥作用的时候了。通过mock模拟掉影响A模块的部分(B模块)。至于mock掉的部分(B模块)应该由其它用例来测试。

  • 例子

    import requests from unittest import mock def request_lemonfix(): """ :return: """ res = requests.get('http://www.baidu.com') return res.status_code.encode('utf-8') if __name__ == '__main__': request_lemonfix = mock.Mock(return_value="我已经替换了数据") print(request_lemonfix()) 结果: 我已经替换了数据 ```
2.简单的案例实现mock
  • 基本功能
    # function.py def multiply(x, y): return x * y def add_and_multiply(x, y): addition = x + y multiple = multiply(x, y) # 回调函数 return (addition, multiple)
  • 针对 add_and_multiply()函数编写测试用例
import mock import requests import unittest url = "www.baidu.com/login" data = { "user_id": "001", "password": "caichen" } def post_request(url, data): """登陆百度账号""" res = requests.post(url, data).json() return res class TestLogin(unittest.TestCase): """单元测试""" def setUp(self) -> None: print("case开始执行") def tearDown(self) -> None: print("case执行结束") def test_01(self): """模拟数据判断是否正确""" url = "www.baidu.com/login/tieba" data = { "user_id": "001" } sucess_test = mock.Mock(return_value=data) post_request = sucess_test res = post_request self.assertEqual("654321", res()) # self.assertEqual({'user_id': '001'},res()) if __name__ == '__main__': unittest.main() # 错误结果 F case开始执行 ====================================================================== case执行结束 FAIL: test_01 (__main__.TestLogin) 模拟数据判断是否正确 ---------------------------------------------------------------------- Traceback (most recent call last): File "C:/Users/x1c/Desktop/untitled/mocktest.py", line 35, in test_01 self.assertEqual("654321", res()) AssertionError: '654321' != {'user_id': '001'} ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (failures=1) # 正常结果 case开始执行 . case执行结束 ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
3.mock实现get数据模拟
举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。首先,我们的客户端代码实现如下: ``` import requests def send_request(url): r = requests.get(url) return r.status_code def visit_ustack(): return send_request('http://www.ustack.com') ``` # 外部模块调用visit_ustack()来访问baidu的官网。下面我们使用mock对象在单元测试中分别测试访问正常和访问不正常的情况。 ``` import unittest import mock import client class TestClient(unittest.TestCase): def test_success_request(self): success_send = mock.Mock(return_value='200') client.send_request = success_send self.assertEqual(client.visit_ustack(), '200') def test_fail_request(self): fail_send = mock.Mock(return_value='404') client.send_request = fail_send self.assertEqual(client.visit_ustack(), '404') ```

1.找到要替换的对象:我们需要测试的是visit_ustack这个函数,那么我们需要替换掉send_request这个函数。

2.实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。

3.使用这个mock对象替换掉我们想替换的对象。我们替换掉了client.send_request

4.写测试代码。我们调用client.visit_ustack(),并且期望它的返回值和我们预设的一样。

上面这个就是使用mock对象的基本步骤了。在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象,方法是一样的:先import进来,然后替换掉指定的对象就可以了。

4.Mock和mockrunner的区别

Mockrunner用在J2EE环境中进行应用程序的模拟测试。它不仅支持Struts actions,servlets,过滤器和标签类,还包括一个JDBC和一个JMS测试框架,可以用于测试基于EJB的应用程序。

Mockrunner扩展了JUnit并模拟了必要的行为,而无需调用实际的基础结构。它不需要正在运行的应用程序服务器或数据库。此外,它不会调用web容器或Struts ActionServlet。它非常快速,使用户可以在测试的所有步骤中操纵所有涉及的类和模拟对象。它可以用于为基于J2EE的应用程序编写非常复杂的单元测试,而不会产生任何开销。Mockrunner不支持任何类型的容器内测试。

Mockrunner不会读取任何配置文件,例如web.xml或struts-config.xml。您可以使用Mockrunner API指定所有参数。因此,可以将servlet,过滤器,标签和Struts动作作为可重用组件进行测试,而不管您在一个或另一个应用程序中使用的设置如何。无法测试配置文件中的定义。如果要这样做,可以将StrutsTestCase用于基于Struts的应用程序或Cactus。

Mockrunner支持Java版本从1.3到1.6以及J2EE 1.3,J2EE 1.4和JavaEE5。尚不支持EJB 3.0。Mockrunner支持Struts版本1.1、1.2和1.3。

下载地址:sourceforge.net/projects/mo…

  • mockrunner必须配置java环境

  • 使用命令启动:java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json

  • 配置config.json文件就可以进行mock数据

    [ { "response" : { "text" : "Hello, Moco" } } ] ``` 使用命令启动: java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json 访问http://localhost:8801 就会显示 Hello, Moco
  • MockRunner在工作中运用 构建一个复杂的链接规则

    [ { "request":{ "uri":"/monitorApplication/alert/confirm", "method":"PUT", "text":"{\"id\":\"123\"}" }, "response":{ "status":200, "json":{ "code":"0", "msg":"OK!", "data":null } } } ]
5.接口测试基础面试
  • 项目中如何做接口测试?

    通过测试工具...进行参数、请求参数、返回参数效验

  • 接口开发过程中如何进行case编写

    规则文档熟悉通过mock校验格式

  • 如何理解Mock

    模拟返回参数,模拟接口

  • Mock在工作中的运行?

    帮助前端实现正常开发

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 23:20:24

Open-AutoGLM如何实现精准饮食管理?:3大核心技术解析与落地应用

第一章:Open-AutoGLM饮食热量统计概述 Open-AutoGLM 是一个基于生成式语言模型的智能营养分析系统,专注于自动识别食物类型并计算其热量摄入。该系统结合计算机视觉与自然语言处理技术,能够从用户上传的饮食图片或文字描述中提取关键信息&…

作者头像 李华
网站建设 2026/5/22 2:19:29

基于SpringBoot的民宿管理系统

基于 SpringBoot 的民宿管理系统是一个专为民宿行业设计的综合性管理平台,旨在通过 SpringBoot 框架的高效性和灵活性,实现民宿业务的数字化管理,提升运营效率和客户体验。以下是该系统的详细介绍: 系统功能民宿信息管理 2. 支持民…

作者头像 李华
网站建设 2026/5/24 18:01:44

(27)全注解式开发

所谓的全注解开发就是不再使用spring配置文件了。写一个配置类来代替配置文件。 package com.powernode.spring6.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScans; import org.springfra…

作者头像 李华
网站建设 2026/5/28 23:48:03

【稀缺资料】Open-AutoGLM定时任务配置秘籍:仅限内部流传的4种高级模式

第一章:Open-AutoGLM定时任务配置概述Open-AutoGLM 是一个面向自动化大语言模型任务调度的开源框架,支持通过声明式配置实现模型推理、数据预处理与结果后处理等任务的周期性执行。其核心功能之一是基于标准时间表达式的定时任务管理,允许用户…

作者头像 李华
网站建设 2026/5/28 13:45:10

拍照即知热量?Open-AutoGLM让你5分钟掌握智能饮食控制术

第一章:拍照即知热量?Open-AutoGLM开启智能饮食新时代在健康管理日益受到重视的今天,饮食控制成为关键一环。Open-AutoGLM 的出现,正在重新定义我们与食物的交互方式——只需对餐盘拍照,系统即可自动识别食材种类、估算…

作者头像 李华
网站建设 2026/5/27 5:14:03

Linly-Talker支持动态背景替换,视频创意无限延伸

Linly-Talker支持动态背景替换,视频创意无限延伸 在短视频与直播内容爆炸式增长的今天,一个核心问题始终困扰着创作者:如何以更低的成本、更快的速度,持续产出高质量、高吸引力的视觉内容?尤其对于企业宣传、在线教育、…

作者头像 李华