《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试

Posted 北京-宏哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试相关的知识,希望对你有一定的参考价值。

1.简介

Charles最大的优势在于抓包分析,而且我们大部分使用的功能也在抓包的功能上,但是不要忘记了,Charles也可以做接口测试。至于Mock,其实在修改请求和响应数据哪里就已经介绍了,宏哥就是在这里简单的提一下介绍一下它的理论知识,今天主要介绍和分享的是使用Charles进行接口测试实操。

2.什么是Mock?

百度百科是这么说的:Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

Mock 就是在测试过程中,对于一些不容易构造/获取的对象,创建一个 Mock对象 来模拟对象的行为。

Mock 方法 是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。

3.Mock测试的优点

3.1团队并行工作

开发过程中,只要交互双方定义好接口,团队之间可以并行工作,进程互不影响,不需互相等待对方进度,只需约定好相互之间的数据规范(接口文档),即可使用 mock 构建出可用接口,然后尽快进行开发和自测,提前发现缺陷.

3.2测试驱动开发 TDD (Test-Driven Development)

单元测试是 TDD 实现的基石,而 TDD 经常会碰到协同模块尚未开发完成的情况,但有了 mock,测试人员可提前接入测试,提供测试效率,当接口定义好后,测试人员就可以创建一个 Mock,把接口添加到自动化测试环境,提前创建测试。

3.3测试覆盖率

接口涉及入参,或者业务逻辑复杂的情况,某些场景无法通过正常手段进行操作,而通过mock虚拟模拟,可以有效的增加覆盖率

3.4隔离系统

若一个接口在不同的状态下要返回不同的值,常见做法是复现这种状态然后再去请求接口,但使用某些接口时,可能因操作时机或方式不当导致失败,甚至污染后端存储如数据库等, 为避免系统数据库被污染,可以将接口调整为 Mock 模式,以保证数据库纯净。

4.Mock测试的缺点

Mock也不是万能的,使用Mock也存在着风险,需要根据项目实际情况和具体需要来确定是否选用Mock。

测试过程中如果大量使用Mock,mock测试的场景失去了真实性,可能会导致在后续的系统性测试时才发现bug,使得缺陷发现的较晚,可能会造成后续修复成本更大

5.Mock客户端

接口文档已对接完成,但后端接口还未开发完成,测试人员需要进行单元测试,或提前进行接口自动化测试,需要使用Mock各种请求返回的内容。

6.Mock服务端

遇到前端人员已完成开发任务,而后端人员开发打接口尚未完成这种情况,需要和前端人员联调进行测试,则需要搭建Mock服务。

好了,Mock的理论就介绍到这里,有兴趣的自己可以私下查资料。接下来就要进入今天的重点:使用Charles进行接口测试。

7.Compose

用Charles进行测试,我们使用的主要是Composer功能。这个和Fiddler工具类似。Composer允许自定义请求发送到服务器,可以手动创建一个新的请求。具体操作步骤如下:

7.1方法一

1.打开Charles,点击【Tools】-->【Compose】或者【Compose New...】 。如下图所示:

2.填写你要测试接口的信息,有接口文档,按接口文档填写,没有就自己抓包填写,如下图所示:

7.2方法二

1.选中抓到的接口请求信息,右键-->【Compose】,如下图所示:

 2.出现了接口请求的相关信息。如下图所示:

8.界面功能解析

根据下图图标注位置对Composer的界面功能进行说明。

1.请求方式:点开可以勾选请求协议是get、post等

2.url地址栏:输入请求的url地址

3.Execute按钮点击后就可以执行请求了

4.执行完成后会在右侧History区域生成历史记录

5.http版本:可以勾选http版本

6.添加请求参数

9.接口测试实战

9.1POST API实战

现在免费的接口很不好找,找了半天找到python里有一个,之前在Fiddler中也用的这个。就用这个举例吧。

接口信息:

接口信息描述
https://httpbin.org/post 接口地址
请求方式 HTTP POST
请求参数 请求参数格式为 JSON

参数格式:

    "form": 
        "comments": "北京宏哥post接口测试", 
        "custemail": "19182XX@qq.com", 
        "custname": "北京宏哥", 
        "custtel": "13045032408", 
        "delivery": "15:45"
  

那么如何使用Charles调试一个POST请求并带有json格式的数据,具体操作步骤如下:

1.启动Charles,打开Compose面板, 在Compose新建面板中的输入URL(输入请求接口的地址),下拉框中选择POST请求方式,如下图所示:

2.点击【Compose】后,如下图所示:

3.点击【JSON Text】,然后输入请求的JSON数据,最后点击【Execute】如下图所示:

4.点击Execute(执行),若在会话列表中看到结果返回200表示操作成功,如下图所示:

5.在Inspectors里面查看到请求响应的结果了,我们事先知道接口返回的是json格式数据,点击响应部分的json将数据格式化,方便阅读。如下图所示:

9.2GET API实战

接口信息:一个带参数的 get 请求,如在豆瓣网搜索:西游记,url 地址为:https://www.douban.com/search?q=西游记。具体操作如下图所示:

1.启动Charles,打开Compose面板, 在Composer面板中的输入URL,下拉框中选择GET请求方式,如下图所示:

2.输入请求接口的参数,如下图所示:

3.点击Execute(执行),若在会话列表中看到结果返回200表示操作成功,如下图所示:

10.小结

 今天主要讲解和分享了如何使用Charles进行接口测试的两种请求方式,其他的请求类似!!!好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢你耐心地阅读!!!

玩转Rabbitmq系列02:Rabbitmq保姆级安装教程与基本消息模型实战

🏠个人主页:啊陈晓

🎉学习方向:java后端开发

🎁我的上一篇文章:【玩转Rabbitmq系列】01:一文带你敲响Rabbitmq的大门

💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力

【玩转Rabbitmq系列】文章直通车~

【玩转Rabbitmq系列】01:一文带你敲响Rabbitmq的大门

【玩转Rabbitmq系列】02:Rabbitmq保姆级安装教程与基本消息模型实战

   未完待续.........


现在让我们正式开启进入今天的正文

文章目录

前言

一.Linux环境下Rabbitmq的搭建

1.环境准备

2.安装包下载

3.安装步骤

二、基本消息模型实战

 1.创建一个简单的java工程:rabbitmq-learn并创建module-maven:rabbit-test01

 2.创建模型中的消费者 

 3.创建模型中的消费者 

 4.测试

总结


前言

     在上一讲中,我们已经初步认识了Rabbitmq,接下来我们将开始进入实战,通过代码的需教程逐步深入Rabbitmq。而今天,我们就来学习如何搭建Rabbitmq的环境,并对六大消息模型之一的基本模型进行代码实现


一.Linux环境下Rabbitmq的搭建

1.环境准备

JVM环境

使用Xshell进行远程连接

2.安装包下载

大家可以自行前往官网进行下载~

Rabbitmq官网直通车https://www.rabbitmq.com/download.html

当然,我在这里也给大家下载好啦,大家可以自行使用~

链接:https://pan.baidu.com/s/1-bqmSv4wx92dOhZbEKkzmw 
提取码:acxy

 3.安装步骤

先准备一台虚拟机并命名为rabbitmq-1

打开终端输入ifconfig,获取ip后通过xshell远程连接 

 

 进入到/usr/local/software 目录(如果没有 software则自己创建)

cd /usr/local/software #进入对应目录

mkdir software #如果目录不存在则在对应路径下创建文件夹 

 将下载好的资源包上传到software中,可以使用文件上传工具,也可以直接进行拖动。

安装文件:

分别按照以下顺序进行安装 

rpm -ivh erlang-21.3-1.el7.x86_64.rpm

yum install socat -y  #需在联网环境下执行

rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm

Rabbitmq的常用命令

分别按照下面顺序启动服务开启web管理插件

chkconfig rabbitmq-server on #添加开机启动服务

/sbin/service rabbitmq-server start #启动服务

/sbin/service rabbitmq-server status #查看服务状态

/sbin/service rabbitmq-server stop  #停止服务

rabbitmq-plugins enable rabbitmq_management #开启web管理插件

 服务状态显示如下即成功

 然后我们添加一个新的用户

rabbitmqctl add_user root password  #创建账号

rabbitmqctl set_user_tags root administrator #设置用户角色

rabbitmqctl set_permissions -p "/" root ".*" ".*" ".*"  #设置用户权限

rabbitmqctl list_users #查看当前用户

可以看到我们已经出现了名字为root的用户 

 

访问:http://192.168.154.138:15672/       #将前面的IP地址换成你自己的http://192.168.154.138/

可能你会出现无法访问的状态,这是因为你的防火墙还没有关闭

按如下步骤关闭防火墙 :

systemctl status firewalld #查看防火墙状态

systemctl stop firewalld #关闭防火墙

systemctl disable firewalld #永久关闭防火墙

当防火墙的状态如下所示即防火墙已经关闭成功 

然后我们再次访问:http://192.168.154.138:15672/       #将前面的IP地址换成你自己的

可以看到已经成功进入Rabbitmq web管理端

输入之前的增加的用户和密码,登录成功

 

 至此,我们Rabbitmq搭建成功!!!

二、基本消息模型实战

完成了环境搭建,我们趁热打铁,来学习一下上一篇文章中我们所提到的六大模型之一的基本模型

 1.创建一个简单的java工程:rabbitmq-learn并创建module:maven工程:rabbit-test01

2.在pom.xml文件中添加相关依赖

<!--指定 jdk 编译版本--> <build>
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <configuration>
 <source>8</source>
 <target>8</target>
 </configuration>
 </plugin>
 </plugins>
</build> <dependencies>
 <!--rabbitmq 依赖客户端-->
 <dependency>
 <groupId>com.rabbitmq</groupId>
 <artifactId>amqp-client</artifactId>
 <version>5.8.0</version>
 </dependency>
 <!--操作文件流的一个依赖-->
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.6</version>
 </dependency>
</dependencies>

 

3.创建模型中的生产者 

package com.canrioyuan.one;

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 基本模型中的生产者:Producer
 */
public class Producer 
    //先创建一个队列
    public static final String QUEUE_NAME = "hello";

    //发消息
    public static void main(String[] args) throws IOException, TimeoutException 
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂IP连接RabbitMQ的队列
        factory.setHost("192.168.154.138");
        //用户名
        factory.setUsername("root");
        //密码
        factory.setPassword("password");

        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        /**
         * 生成一个队列
         * 1、队列名称
         * 2.队列里面的消息是否持久化
         * 3.该队列是否只供一个消费者进行消费 是否进行消息共享,true:可以多个消费者进行消费 false:只能一个消费者进行消费
         * 4.是否自动删除 最后一个消费者端开连接之后 该队列是否会自动删除 true:自动删除 false:不自动删除
         * 5、其他参数
         */

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //发送一个消息
        String message = "Hello world!";

        /**
         * 发送一个消费
         * 1、发送到哪个交换机
         * 2.路由的Key值是哪个 本次队列的名称
         * 3.其他参数的信息
         * 4.发送信息的消息体
         */
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

        System.out.println("消息发送完毕");


    

 4.创建模型中的消费者 

package com.canrioyuan.one;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 基本模型中的消费者:Consumer
 */
public class Consumer 
    //定义队列的名称 即图中的红色部分
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException 
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂IP连接RabbitMQ的队列 ,此处输入带有Rabbitmq服务的IP
        factory.setHost("192.168.154.138");
        //用户名
        factory.setUsername("root");
        //密码
        factory.setPassword("password");
        //创建一个连接
        Connection connection = factory.newConnection();
        //创建一个管道
        Channel channel = connection.createChannel();
        System.out.println("等待接收消息");
        //推送的消息如何进行消费的接口回调
        DeliverCallback deliverCallback = (consumerTag, delivery) -> 
            String message = new String(delivery.getBody());
            System.out.println(message);
        ;
        //取消消费的一个回调接口 如在消费的时候队列被删除掉了
        CancelCallback cancelCallback = (consumerTag) -> 
            System.out.println("消息消费被中断");
        ;
        /**
         * 消费者消费消息
         * 1.消费哪个队列
         * 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
         * 3.消费者未成功消费的回调
         */
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);

    

5.测试

我们先启动生产者(Producer),启动成功后我们来到Rabbitmq web管理端,可以看到已经生成了一个名为hello的queue

同时Producer信息为“Hello,world”的信息发送至名为hello的队列

 

 然后我们再启动Consumer,可以看到Consumer已经成功接收到生产者发送至hello队列信息“Hello,world”

 至此,我们便成功实现了六大模型之一的基本模型,这也是最简单的消息模型。


总结

基本消息模型是Rabbitmq六大消息模型之一中最简单的模型,后面的模型也是在基本模型的基础上逐渐深入。所以了解基本模型的使用是非常重要的!!除此之外,如何使用与查看Rabbitmq中web 管理端,也是学习Rabbitmq必须掌握的技能。

打好第一步的基础,后面的学习才会更加容易理解!!

至此,我们今天的教程就到此结束啦~

感谢您的阅读,希望我的文章能给你带来帮助!!!


以上是关于《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试的主要内容,如果未能解决你的问题,请参考以下文章

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(15)-Charles如何配置反向代理

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试

玩转Rabbitmq系列02:Rabbitmq保姆级安装教程与基本消息模型实战

保姆级教程10张图学会抓包神器Fiddler小白都会系列

❥十大排序算法❥爆肝两万字保姆级教程(文字解析+图解+代码实现+例题)

ESP 保姆级教程玩转emqx篇 ——初识emqx