Python测开28期-偕行-Charles代理抓包工具及mock使用

1、抓包配置

(1)Charles基础配置

  • **注意:**火狐、谷歌浏览器不走系统代理,谷歌可以安装使用SwitchyOmega插件实现走系统代理(Charles设置成了系统代理);

(2)Charles电脑证书配置抓取https

注意: 有点链接经过安全处理,就算全部都设置了也是无法抓包的;

A、安装证书

B、 Charles 端设置 ssl

(3)Charles移动端代理配置

    1. 设备和电脑处于同一 WIFI(模拟器不需要配置);
    1. Charles设置允许安装异动端证书;
    1. 手机WiFi设置代理ip和端口;
    1. 手机安装证书;
    • 系统浏览器访问 chls.pro/ssl;
    • iOS:描述文件中安装证书;
    • iOS:信任证书;

(4)注意事项

  • Android 6 以上的系统 app 默认不信任抓包证书;
    • 需要开发修改代码打开抓包的开关;
    • 也或许要把网络ip设置到服务器白名单;
  • iPhone 10 系统以上需要在 设置->通用->关于本机->证书信任设置 中打开信任开关;

2、过滤

  • Filter
  • Focus

image

3、重发

  • 简单重发:鼠标右键 – Repeat;
  • 简单压力:鼠标右键 – Repeat Advanced;

简单重发:
image

简单压力:

4、修改请求

  • 鼠标右键 – Compose
  • 选择接口 – 点击小钢笔图标

5、 断点(BreakPoint)

  • 调整接口的参数信息;

  • 鼠标右键 — Breakpoint(会进行默认对请求和响应都打上断点,可以按以下步骤对断点重新设置);

    • Proxy – Breakpoint settings 设置断点;
    • 确定接口信息,确定是请求断点还是响应断点;
    • 重新发送请求 – 进入断点修改状态 – 修改内容 – 点击 Excute;
  • **注意:**这个方式看情况使用,因为大部分接口都是设置了超时时间,如果超时之后会重新发送一次请求,那打的断点就没用了!

6、弱网测试

(1)什么是弱网测试

  • 按照移动的特性,一般应用低于 3G、弱信号的 Wifi 可以划分为弱网;
  • 弱网测试是健壮性测试的重要部分,对移动端测试必不可少;
  • 弱网测试主要进行弱网状态下的功能测试同时关注用户体验

(2)使用Charles完成弱网测试

7、Charles接口数据mock

(1) Mock 测试的场景

(2) Mock 测试的价值与意义

  • 不依赖第三方数据;
  • 节省工作量;
  • 节省联调;

(3) Mock 核心要素

  • 匹配规则:哪个接口、哪些数据、数据格式;
  • 模拟响应:符合匹配规则之后对响应内容进行篡改;

(4)Rewrite

提示:常使用于小范围数据篡改;

A、Rewrite原理

image

B、使用Rewrite对雪球app行情页面数据进行篡改

a、找到行情数据对于接口
https://stock.xueqiu.com/v5/stock/screener/quote/list.json?order=desc&size=50&type=sh_sz_bj&page=1&market=CN&order_by=turnover_rate&_t=1HUAWEIa8b36b4b795dac065715ff3b4466e765.1221824497.1697076047627.1697078856693&_s=083712
b、对接口进行Rewrite设置
  • Tools → Rewrite;
  • 勾选 Enable Rewrite;
  • 点击下方 Add 按钮新建一个重写的规则;
  • 在右侧编辑重写规则;
  • 点击 ok 生效;

篡改响应体:股票名称和换手率

篡改请求头:修改、增加请求头

篡改请求参数:增加请求参数

(5)Map Local

**提示:**只想修改响应体中的数据的时候使用;

A、Map Local原理

image

B、使用Map Local对雪球app行情页面数据进行篡改

  • 步骤:
    • 1、准备本地接口响应数据;
    • 2、配置 Map Local;
      • 选择要进行 Map Local 的接口;
      • 鼠标右键 – 选择 Map Local 选项进入设置界面;
      • Map From 填写接口的信息;
      • Map To 选择本地文件;
    • 3、修改 Map Local 配置:Tools – Map Local;

(6)Map Remote

A、Map Remote原理

image

B、Map Remote使用

  • 场景

    • 访问百度,转发至豆瓣;
    • 访问开发环境,转发至测试环境;
  • 操作

    • 选择接口,点击鼠标右键,选择 Map Remote 进入到设置页面;
    • 设置重定向的接口信息;
    • 点击 ok 生效;
    • 修改设置:Tools – Map Remote 找对对应接口双击进入修改界面;

访问百度,转发至豆瓣:

8、 Mock 技术体系介绍

(1) Test Double 测试替身

  • Dummy 占位对象 对象被传递但从未实际使用过。通常它们仅用于填充参数列表。
  • Fake 假对象 对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(内存数据库就是一个很好的例子)。
  • Stubs 桩对象 为测试期间调用提供预设答案,通常根本不响应任何超出测试程序的内容。
  • Spies 间谍对象 它们还根据调用方式记录一些信息。其中一种形式可能是电子邮件服务,它记录发送了多少消息。
  • Mocks 模拟对象 是我们在这里谈论的:预先编程的对象,这些期望形成了它们期望接收的调用的规范。

测试替身关键概念的区别:

(2) 一个真实的技术架构例子

  • dummy 只要端口开着就行
  • fake 内存数据库
  • spy UI 界面后端请求记录
  • stub 假的登录后端服务
  • hook 新用户判断方法修改
  • proxy 代理转发机制
  • mock 模拟对象
    image

(3) Fake 假对象 定义

  • 定义:假对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(纯内存数据库就是一个很好的例子)。
  • 比如:登录需要查数据库,但是此时数据库是没有实现的,那就通过在内存中创建一个HashMap来提供假的数据库中的数据对象,从而实现获取登录数据的场景,HashMap中也实现了对登录数据的校验,只是整个过程实际上是没有走数据库的,其他所有逻辑都有,也进行了真实的数据查询和校验;
    image

Fake 应⽤场景:

(4) Stub 桩定义

  • 定义:为测试期间调用提供预设答案,通常根本不响应任何超出测试程序的内容。
  • 比如:在需要查询数据库情况下,根本就不去查,而是直接就返回了需要的数据,没有任何处理逻辑,就是简单地的你要什么我给你什么就行,直接写死的内容;

image

Stub 应⽤场景:

1、Swagger就是这种方式;swagger使用场景
2、 Moco Easy Setup Stub Server;

java -jar moco-runner-1.2.0-standalone.jar http -p 12345 -c foo.json

{
  "request" :
    {
      "uri" : "/foo",
      "queries" :
        {
          "param" : "blah"
        }
    },
  "response" :
    {
      "text" : "bar"
    }
}

说明: 只要给参数"blah",那就给你结果 “bar”,很直接,没有任何逻辑;

(5) Mock 模拟对象定义

  • 定义:模拟、预编程了期望,这些期望形成了他们期望接收的调用的规范。如果他们收到了他们不期望的调用,他们可以抛出异常,并在验证过程中进行检查以确保他们得到了他们期望的所有调用。
  • 使用场景:
    • mock on stub:按需返回期望数据;
    • mock on proxy:按需返回真实数据的修改副本;

9、 常⽤的 Mock 工具

  • Charles 测试工程师常用;
  • BurpSuite 黑客常用;
  • Fiddler 只能 Windows 上使用;
  • Nginx 服务器反向代理与修改;
  • Mitmproxy 代理工具 可python编程;
    • python第三方库:mitmproxy
  • Wiremock(基于java开发) 代理工具 可java编程;

(1)mitmproxy

  • 说明:mitmproxy is a set of tools that provide an interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets.

A、 mitmproxy mock on proxy

简单案例:

python3 -m http.server
mitmdump -p 8001  -m reverse:127.0.0.1:8000 --flow-detail 4 -B '/~bs .*Directory.*/Directory/ceshiren.com mock'

说明:
1、先开启了一个服务;
2、开启了一个8001端口,反向代理了8000端口,给定条件:当内容中出现Directory的时候,把他替换成ceshiren.com mock
image

B、 mitmproxy 强大的插件机制 Addons

  • dns
  • tcp
  • cert
  • http/https
  • websocket
    image

C、python第三方库:mitmproxy

import sys

from mitmproxy import ctx
from mitmproxy import tcp
from mitmproxy.utils import strutils
from mitmproxy.tools.main import mitmdump


def tcp_message(flow: tcp.TCPFlow):
    message = flow.messages[-1]
    old_content = message.content
    message.content = old_content.replace(
        b":0;localabstract:webview_devtools_remote_",
        b":   0;localabstract:xweb_devtools_remote_"
    )

    ctx.log.info(
        "[tcp_message{}] from {} to {}:\n{}".format(
            " (modified)" if message.content != old_content else "",
            "client" if message.from_client else "server",
            "server" if message.from_client else "client",
            strutils.bytes_to_escaped_str(message.content))
    )


if __name__ == '__main__':
    sys.argv = ["", "-p", "5038", "--rawtcp", "--mode", "reverse:http://localhost:5037/", "-s", sys.argv[0], "-vv"]
    mitmdump()

9、mock工具与定制化

mitmproxy工具以及python常用第三方库mitmproxy