赞
踩
Hook 技术需要预先分析目标应用的源代码和逻辑,根据目标测试场景设置目标、逻辑和数据,然后运行时动态的对目标函数参数值、逻辑或者返回值做修改,达到修改现有函数逻辑、实现目标测试场景的目的。
软件测试技术是软件开发过程中的一个重要组成部分,是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程。其目的是尽快尽早地发现在软件产品中所存在的各种问题,与用户需求、预先定义的不一致性。检查软件产品中可能存在的 Bug,并且编写缺陷报告,交于开发人员修改。软件测试人员的基本目标是发现软件中的错误。
软件测试技术就相当于是软件测试人员的武器。作为软件测试人员,必须要清楚了解可以通过哪些手段去保障产品的质量。只有知道了这些,才能更好的完成测试的工作。
软件测试的分类可以按照不同的维度去划分,一般来说可以按照下面的这些维度去划分。
黑盒测试方法能更好、更真实地从用户角度来考察被测系统的功能性需求实现情况。在软件测试的各个阶段,如单元测试、集成测试、系统测试及验收测试等阶段中,黑盒测试都发挥着重要作用,尤其在系统测试和确认测试中,其作用是其他测试方法无法取代的。
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒法可以全面了解程序内部逻辑结构、对所有逻辑路径进行测试。
白盒测试常用的方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法。
其中 Unit 代表单元测试,API 代表接口测试,UI 代表页面级的系统测试。分层的自动化测试倡导产品的不同层次都需要自动化测试,这个金字塔也正表示不同层次需要投入的精力和工作量。对于测试金字塔,越靠下越容易自动化,越靠下成本越低,越靠下效率越高。
分层测试顾名思义就是分多个层次一个层次一个层次的测试,比如先测完中间接口层,再测最上层的界面。当然了,也可以同时测试。
分层测试的测试方法还是原来的测试方法,但对测试人员的代码能力还有自动化测试水平有较高要求,同时要求测试人员和开发团队真正的理解敏捷开发和敏捷测试,甚至要求开发团队达到开发即测试、测试即开发的能力。
对软件中的最小可测试单元进行检查和验证。具体的说就是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。
测试的重点是要检查接口参数传递的正确性,接口功能实现的正确性,输出结果的正确性,以及对各种异常情况的容错处理的完整性和合理性。
接口测试可以更早介入,介入越早越能更早的发现问题,还可以缩短项目周期,能够发现更底层的 Bug,减少开发成本。
因为不同端(前端,后端)的工作进度不一样,所以要针对最开始出来的接口,以及需要调用其他公司的(银行,支付宝,微信,QQ 等)一些接口进行接口测试及验证数据,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易),需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。前后端传输、日志打印等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等。
UI 测试测的是应用中的用户界面是否如预期工作。比如,用户的输入需要触发正确的动作,数据需要能展示给用户看,UI 的状态需要发生正确变化等。
对于 UI 测试,可以采用静态测试方法,也可以采用动态测试方法。
对于用户界面的布局,风格,字体,图片等与显示相关的部分测试应该采用静态测试,比如点检表测试,即将测试必须通过的项用点检表一条一条列举出,然后通过观察确保每项是否通过。
对用户界面中各个类别的控件应该采用动态测试,即编写测试用例或者点检表,对每个按钮的响应情况进行测试,是否符合概要设计所规定的条件,还可以对用户界面在不同环境下的显示情况进行测试。
UI 测试需要关注的内容包括通过浏览测试对象可正确反映业务的功能和需求,这种浏览包括窗口与窗口之间、字段与字段之间的浏览。各种访问方法 (Tab 键、鼠标移动和快捷键)是否支持。还有窗口的对象和特征,比如菜单、大小、位置、状态和中心等都符合标准。
推荐学习
⬇️ 点击“阅读原文”,提升测试核心竞争力!
原文链接
获取更多相关资料+v~ ceshiren001
获取更多技术文章分享
在测试中,虽然通过修改数据以实现测试场景的需求,大部分情况下都可以通过 Mock 技术实现,但是还有一小部分场景,例如需要修改应用内部函数的参数、返回值或运行逻辑等情况,这时就需要用到 Hook 技术。
单元测试之外,Mock 技术的主要作用是对服务、接口进行 Mock,通过代理等方式将被测服务发送到依赖服务的请求转发给 Mock 服务,再由 Mock 服务根据规则组装预期的返回数据响应给被测服务,达到预期的测试场景。
Hook 技术主要用于服务内部代码逻辑上的修改,当函数间传递的参数或者函数内的逻辑需要进行修改时,数据的传递并没有经过网络,Mock 服务无法对其进行操作,只能通过 Hook 技术通过在运行的代码中插入额外的代码或者在内存中进行操作。这种更精细更底层的修改,相比 Mock 技术能实现更多的修改范围,适用性更广,难度也更大。
JVM-Sandbox 是 alibaba 开源的一个 JVM 沙箱容器,只能处理目标为 Java 应用的场景,主要的特点是支持热插拔(可以在目标应用运行中随时进行 Hook 的加载和解除)、可以同时操作挂载多个目标应用,相互之间独立设置互不干扰、支持的目标应用 JDK 版本较广(6-11)。工具本身功能很多,在这里仅介绍和使用它用作 Hook 的部分功能。
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(); } } public static void main(String... args) throws InterruptedException { new HookTarget().loopReport(); } }
@MetaInfServices(Module.class)
@Information(id = “ceshiren.com”, author = “ceshiren.com”)
public class hook_jvm implements Module {
@Resource private ModuleEventWatcher moduleEventWatcher; @Command("ceshiren") public void ceshiren(final Map<String, String> param) { new EventWatchBuilder(moduleEventWatcher) .onClass("HookTarget") .onBehavior("report") .onWatch(new AdviceListener() { @Override protected void before(Advice advice) throws Throwable { advice.changeParameter(0, "Change By Hook!"); advice.changeParameter(1, false); advice.changeParameter(2, 965); } }); } }
- 项目通过 maven 管理依赖,对应的pom.xml文件内容如下: - ``` - <?xml version="1.0" encoding="UTF-8"?> - <project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>ceshiren_book</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.alibaba.jvm.sandbox</groupId> <artifactId>sandbox-api</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>com.alibaba.jvm.sandbox</groupId> <artifactId>sandbox-debug-module</artifactId> <version>1.3.3</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals> <goal>attached</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
- 在 gitbash 命令行中打开sandbox/bin目录,执行语句./sandbox.sh -p 目标应用进程号 -d 'ceshiren.com/ceshiren',启动 JVM-Sandbox 并对目标程序进行 Hook 操作,变更report方法中传入的参数值,这时再回到目标程序运行的命令行中查看,可以看到命令行中输出的内容已经变更,如下:
- ```
- stringParam is Change By Hook!
- boolParam is false
- intParam is 965
stringParam is Change By Hook!
boolParam is false
intParam is 965
获取更多相关资料+v~ ceshiren001
获取更多技术文章分享
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。