接口自动化测试之Mock

news2024/11/19 19:35:41

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试)

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。

下载地址:Mockrunner download | SourceForge.net

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在工作中的运行?

    帮助前端实现正常开发

下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

 

文档获取方式:

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

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

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

相关文章

基于Java+SpringBoot+Vue+Uniapp奶茶在线下单小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍:✌…

Linux 用户 用户组管理

用户 Linux系统是一个多用户多任务的分时操作系统,任何要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。每个用户账号都拥有一个唯一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后&a…

ubuntu22.04编译DPDK19.08.2注意事项

下载:http://fast.dpdk.org/rel/dpdk-19.08.2.tar.xz 解压:tar -xvf dpdk-19.08.2.tar.xz (1)设置环境变量和编译 cd dpdk-stable-19.08.2 export RTE_SDKpwd export RTE_TARTGETx86_64-native-linuxapp-gcc make config Tx86…

Ae 效果:CC Simple Wire Removal

Keying/CC Simple Wire Removal Keying/CC Simple Wire Removal CC Simple Wire Removal (CC 简单线条移除)通过在两点之间创建一条指定宽度(厚度)的连线,然后将连线区域内的像素按指定方式进行填充,从而实…

R语言非线性方程数值分析生物降解、植物生长数据:多项式、渐近回归、米氏方程、逻辑曲线、Gompertz、Weibull曲线...

全文链接:https://tecdat.cn/?p33742 在选择最佳拟合实验数据的方程时,可能需要一些经验。当我们没有文献信息时该怎么办?我们建立模型的方法通常是经验主义的。也就是说,我们观察过程,绘制数据并注意到它们遵循一定的…

Qt使用opencv操作摄像头的例子

概述 这是一个Qt使用opencv lib操作摄像头的例子 详细 一、简介 这是一个Qt使用opencv lib操作摄像头的例子 二、代码实现过程 新建一个VideoCapture对象,然后通过这个对象读取Mat图像数据,再讲Mat数据转成QImage显示在QLabel上。 VideoCapture既支持…

PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础,通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的…

读写分离MySQL

利用Mycat控制后台数据库的读写分离和负载均衡 利用主从复制思想,实现读写分离,主库写,从库读 从库最好不要写,因为从库写入的数据不能同步到主库,只有主库写的数据才能同步到从库 balance属性值对应的含义(负载均衡) 一主一从读写分离的弊端 主节点Master宕机以后,业务系统…

DN-DETR(CVPR 2022)

DN-DETR(CVPR 2022) Accelerate DETR Training by Introducing Query DeNoising 匈牙利匹配不稳定导致了早期训练阶段的优化目标不一致 同一个图像,query在不同时期会对不同对象进行匹配 DN-DETR在真实的GT上添加噪声:xywh&am…

OpenGLES:多纹理贴图,文字水印

一.概述 上一篇博客讲解了OpenGLES怎么实现单纹理贴图 仅仅只绘制一张图片是不过瘾的 本篇博客讲解如何通过多纹理贴图实现图片和文本水印效果 在单纹理贴图基础上,多纹理贴图的区别主要有两点: 纹理的生成、绑定等由单个变成多个文本内容先转换为B…

深度学习实战基础案例——卷积神经网络(CNN)基于Xception的猫狗识别|第2例

文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测 我的环境: pytorch:2.0python:3.8jupyternotebook 一、环境准备 impor…

jmeter——接口压测和性能监测实践

一、安装JMeter 1. 在客户端机器上安装JMeter压测工具,我这里安装的版本是apache-jmeter-5.2.1,由于JMeter是JAVA语言开发的,所以安装JMeter压测工具前先安装JDK,一般安装JDK1.8及以上即可。安装完成后,如果客户端机器…

【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性

在工业生产中,事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而,随着虚拟现实(VR)技术的快速发展,VR工业事故应急救援演练应运而生,为…

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…

Elasticsearch 部署学习

文章目录 Elasticsearch 部署学习1. 单节点部署 elasticsearch1.1 部署 jdk1.2 下载 elasticsearch1.3 上传文件并修改配置文件1.4 启动1.5 问题总结1.6 浏览器验证 2. 集群部署 elasticsearch3. 常用命令4. Elasticsearch kibana安装:one: 参考部署文档:two: 下载对应版本的安…

75、SpringBoot 整合 MyBatis------使用 Mapper 作为 Dao 组件

总结: 添加一个User类和Mapper接口, 在Mapper接口这个类上面添加Mapper注解,就可以和数据库进行映射了, 然后在mapper接口写方法和sql, 在测试类进行测试。 pom文件就添加个mybatis-spring-boot-starter 的组件&#x…

C 语言简单入门

C 语言发展历史|标准 1972年,丹尼斯里奇(Dennis Ritch)和肯汤普逊(Ken Tompson)在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年,布莱恩柯林汉(Brian Kernighan&#xff…

Java核心知识点整理大全5-笔记

书接上回Java核心知识点整理大全4-笔记_希斯奎的博客-CSDN博客 目录 3.4.1. HashMap(数组链表红黑树) 3.4.1.1. JAVA7 实现 3.4.1.2. JAVA8 实现 3.4.2. ConcurrentHashMap 3.4.2.1. Segment 段 3.4.2.2. 线程安全(Segment 继承 ReentrantLo…

【C语言】联合体与结构体如何巧妙配合使用节省内存空间?

本篇文章目录 1. 联合体的特点2. 计算联合体占用内存大小3. 利用联合体的特点判断当前机器是以什么字节序顺序存储数据?4. 联合体什么时候使用? 1. 联合体的特点 联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员&#x…