技术分享 | 专项测试技术初识Hook

Hook 技术需要预先分析目标应用的源代码和逻辑,根据目标测试场景设置目标、逻辑和数据,然后运行时动态的对目标函数参数值、逻辑或者返回值做修改,达到修改现有函数逻辑、实现目标测试场景的目的。

Hook的价值

在测试中,虽然通过修改数据以实现测试场景的需求,大部分情况下都可以通过 Mock 技术实现,但是还有一小部分场景,例如需要修改应用内部函数的参数、返回值或运行逻辑等情况,这时就需要用到 Hook 技术。

单元测试之外,Mock 技术的主要作用是对服务、接口进行 Mock,通过代理等方式将被测服务发送到依赖服务的请求转发给 Mock 服务,再由 Mock 服务根据规则组装预期的返回数据响应给被测服务,达到预期的测试场景。

Hook 技术主要用于服务内部代码逻辑上的修改,当函数间传递的参数或者函数内的逻辑需要进行修改时,数据的传递并没有经过网络,Mock 服务无法对其进行操作,只能通过 Hook 技术通过在运行的代码中插入额外的代码或者在内存中进行操作。这种更精细更底层的修改,相比 Mock 技术能实现更多的修改范围,适用性更广,难度也更大。

JVM Sandbox简介

JVM-Sandbox 是 alibaba 开源的一个 JVM 沙箱容器,只能处理目标为 Java 应用的场景,主要的特点是支持热插拔(可以在目标应用运行中随时进行 Hook 的加载和解除)、可以同时操作挂载多个目标应用,相互之间独立设置互不干扰、支持的目标应用 JDK 版本较广(6-11)。工具本身功能很多,在这里仅介绍和使用它用作 Hook 的部分功能。

JVM Sandbox安装与启动

  • 项目的 github 地址:https://github.com/alibaba/jvm-sandbox。
    • 下载所需版本的二进制压缩包,解压(演示所使用的版本为 1.3.3)。
    • 官方声明支持的系统有:Linux/UNIX/MacOS,这几个系统只需要下载解压缩就可以直接运行。
    • 官方并未支持 Windows 系统,所以需要进行如下修改:
    • 安装 Git Bash。
    • 安装 JDK(版本 6-11,演示所用版本为 1.8.0_192),路径中不能带有空格。
    • 在 Shell 脚本中会有 Java 命令的调用,所以电脑中需要,并且因为 Git Bash 运行 Shell 脚本时的目录问题。
    • 修改启动脚本bin/sandbox.sh,将脚本中 183-188 行内容注释。
    • 由于启动脚本中使用了相对路径,所以运行时需要切换到项目的 bin 目录下操作。
    • 在 bin 目录中执行语句./sandbox.sh -p 目标应用pid,当出现如下提示信息,说明 JVM-Sandbox 已经成功启动了。
  • $ ./sandbox.sh -p 6204
  •                 NAMESPACE : default
    
  •                   VERSION : 1.3.3
    
  •                      MODE : ATTACH
    
  •               SERVER_ADDR : 0.0.0.0
    
  •               SERVER_PORT : 4543
    
  •            UNSAFE_SUPPORT : ENABLE
    
  •              SANDBOX_HOME : e:/Download/sandbox/bin/..
    
  •         SYSTEM_MODULE_LIB : e:/Download/sandbox/bin/..\module
    
  •           USER_MODULE_LIB : E:\Download\sandbox\sandbox-module;~/.sandbox-module;
    
  •       SYSTEM_PROVIDER_LIB : e:/Download/sandbox/bin/..\provider
    
  •        EVENT_POOL_SUPPORT : DISABLE
    

- JVM-Sandbox 同时还会对外提供接口,可以通过请求直接操作 JVM-Sandbox,这样就能方便的与自己的测试代码结合使用。
- ## JVM Sandbox示例
- 目标应用为一段简单的 Java 代码,代码中启动了一个死循环,每次循环会打印report方法接收到的参数值,参数值已经在代码中固定传入,所以运行之后的结果是一串相同的输出内容。具体内容如下:
- ```
- public class HookTarget {
-     final void report(String stringParam, boolean boolParam, int intParam) {
-         System.out.println("stringParam is " + stringParam);
-         if (boolParam) {
-             System.out.println("boolParam is true!");
-         } else {
-             System.out.println("boolParam is false");
-         }
-         System.out.println("intParam is " + intParam);
-     }
    final void loopReport() throws InterruptedException {
            while (true) {
                        report("a", false, 666);
                                    Thread.sleep(1000);
                                                System.out.println();
                                                        }
                                                      
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值