接口自动化测试学习 —— Mock服务实现

news2024/11/14 21:44:54
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在工作中的运行?

    帮助前端实现正常开发

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末小卡片领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

说明书keithley2420吉时利2410数字源表

说明书keithley2420吉时利2410数字源表 产品概述 Keithley 2420 高压源表是一款 60W 仪器,设计用于提供和测量 5V(源)和 1V(测量)至 60V 的电压和 100pA 至 3A 的电流。2420 型的生产测试应用包括必须在更高电流水平下…

微信和苹果叫板的资本

这两天,关于苹果用户还能不能使用微信这么一个新闻炒得沸沸扬扬的。其实,在很多年前我就说过,腾讯和苹果必有一战。那么这一战到了今天终于到来了。 原因其实也很简单。这个事件的背后,并不是简单的腾讯和苹果彼此之间抽成争夺的问…

pr瘦脸怎么操作?

相信大家平时在拍摄自己的日常生活的时候,通常为了保证视频的清晰度往往都会选择原相机进行拍摄,原相机拍摄自然就会清清楚楚的将我们的真实展现出来,特别是脸部肥大~那么,这么大的一张脸这么可以瘦下去呢?其实使用PR软…

glsl着色器学习(五)

接下来是创建buffer,设置顶点位置,法线,顶点索引等。 const cubeVertexPositions new Float32Array([1, 1, -1,1, 1, 1, 1, -1, 1, 1, -1, -1,-1, 1, 1, -1, 1, -1,-1, -1, -1,-1, -1, 1,-1, 1, 1,1, 1, 1,1, 1, -1,-1, 1, -1,-1, -1, -1,1…

2024.9.3C++

自行实现Mystring类 #include <iostream> #include <cstring> using namespace std;class mystring { public:mystring(){len 0;str nullptr;}mystring(const char* s){len strlen(s);str new char[len 1];strcpy(str, s);}mystring(const mystring& othe…

短时相关+FFT捕获方法的MATLAB仿真

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 短时相关FFT捕获方法的MATLAB仿真 前言短时相关FFT捕获相关原理1、频偏引起的相关损失2、扇贝损失 MATLAB程序获取完整程序 前言 对于算法类的工程&#xff0c;FPGA设计&…

pandas数据处理库使用

文章目录 链接: [原文章链接](https://mp.weixin.qq.com/s?__bizMzkzNjI3ODkyNQ&tempkeyMTI4Nl8zM3FHVFU1NDRDL0p2SkplRTVidmhiNmh1ZWF3YXkwY3VYZlZNaWx0MXowdThFbVRUVEFEdEs5YlU2SUJLcmtXTHZpbnFmR2V6SG1rbGJyd01zYnRkdURWa1ZvNGtIU1piWDd5RFA4OUxkNmlaVmZ1QVpEd2tWR25IR…

MySQL常用窗口函数总和

在 MySQL 中&#xff0c;窗口函数是一类用于在查询结果集中计算值的函数&#xff0c;允许用户根据数据行进行聚合或排序操作&#xff0c;同时保留行的详细信息。窗口函数在分析数据时非常有用&#xff0c;因为它们允许您在不缩小结果集的情况下对数据进行复杂的计算。 常见的窗…

【文献及模型、制图分享】县域城乡融合发展对乡村旅游地实现共同富裕的影响机制——以长三角地区60个典型县为例

文献介绍 乡村旅游地是推动城乡融合、实现共同富裕的关键区域&#xff0c;精准把握县域城乡融合发展多维特征&#xff0c;系统解析其促进乡村旅游地共同富裕的机制&#xff0c;有助于丰富新时代城乡共富理论体系。基于共生理论&#xff0c;构建“共生单元—共生环境—共生结果…

linux~~目录结构远程登录教程(xshell+xftp)

目录 1.目录结构 2.远程登录xshell 2.1所需工具 2.2了解虚拟机IP 2.3查看是否正常连接 2.4xshell进行连接 3.文件传输xftp7 3.1xftp6安装 3.2相关设置 3.3效果展示 3.4文件之间的传输过程 1.目录结构 bin目录里面主要存放这个我们经常使用的指令&#xff0c;例如这个…

PointNet++改进策略 :模块改进 | PAConv,位置自适应卷积提升精度

题目&#xff1a;PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds来源&#xff1a;CVPR2021机构&#xff1a;香港大学论文&#xff1a;https://arxiv.org/abs/2103.14635代码&#xff1a;https://github.com/CVMI-Lab/PAConv 前言 PA…

从八股文到奇怪的缓存一致性问题

本文是最近看阿里云开发者的一遍奇怪的缓存一致性问题的总结与心得&#xff0c;原文放在文章末尾 缓存穿透、缓存击穿、缓存雪崩 缓存穿透、缓存击穿和缓存雪崩都是系统中可能遇到的问题&#xff0c;特别在高并发场景下。 缓存穿透 与后两者不同&#xff0c;缓存穿透是查询不…

10.10 层次化网络模型和综合布线系统

层次化网络模型 综合布线系统 真题

前端登录鉴权——以若依Ruoyi前后端分离项目为例解读

权限模型 Ruoyi框架学习——权限管理_若依框架权限-CSDN博客 用户-角色-菜单&#xff08;User-Role-Menu&#xff09;模型是一种常用于权限管理的设计模式&#xff0c;用于实现系统中的用户权限控制。该模型主要包含以下几个要素&#xff1a; 用户&#xff08;User&#xff09;…

基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic

摘 要 近些年来互联网迅速发展人们生活水平也稳步提升&#xff0c;人们也越来越热衷于旅游来提高生活品质。互联网的应用与发展也使得人们获取旅游信息的方法也更加丰富&#xff0c;以前的景点推荐系统现在已经不足以满足用户的要求了&#xff0c;也不能满足不同用户自身的个…

Leetcode—72. 编辑距离【中等】

2024每日刷题&#xff08;158&#xff09; Leetcode—72. 编辑距离 动态规划算法思想 实现代码 class Solution { public:int minDistance(string word1, string word2) {const int m word1.length();const int n word2.length();vector<vector<int>> dp(n 1,…

Multi-Mode DOA Estimation AND Relax Super Resolution DOA

之前看到加特兰的新品发布会上&#xff0c;PPT写的一些算法信号处理流程图&#xff0c;这里记录学习一下自己的思考&#xff1a; 原始数据采样数据预处理距离维FFT通道间DDMA数据分离非相干累计RV-MAP coarse-cfar fine CFAR(multi-Mode DOA Estimation): 舱内的CPD信号处理流…

分支线定向耦合器宽带化设计和ADS仿真

分支线定向耦合器宽带化设计和ADS仿真 工程下载链接&#xff1a;分支线定向耦合器宽带化设计和ADS仿真-ADS工程文件 之前经常分析分支线定向耦合器&#xff0c;例如在15、ADS使用记录之耦合器设计和基于AWR的微带线分支线耦合器设计-从原理到版图中都有涉及&#xff0c;但是由…

Axure中继器动态数据图表制作

在Axure RP中&#xff0c;中继器&#xff08;Repeater&#xff09;是一个非常强大的工具&#xff0c;它允许设计者动态地展示和交互数据&#xff0c;进而创建各种复杂的数据可视化图表&#xff0c;如柱状图、条形图、堆叠图、散点图和对比图。以下将详细介绍如何使用中继器来设…

solidworks模型导出urdf(超详细)

目录 写在前面的话1 solidworks 文件2 安装sw2urdf插件3 完整步骤3.1 设置基准轴3.2 设置点3.3 设置坐标轴3.4 设置sw2urdf参数3.5 导出可能的问题3.6 ros2 编译3.7 成功结果画面 写在前面的话 刚进组1个月&#xff0c;我的博士研究方向是自动驾驶&#xff0c;还没入门&#x…