Presentation is loading. Please wait.

Presentation is loading. Please wait.

真名:李国栋 淘宝花名:富 曲 : Fault injection 实现原理与应用.

Similar presentations


Presentation on theme: "真名:李国栋 淘宝花名:富 曲 : Fault injection 实现原理与应用."— Presentation transcript:

1 真名:李国栋 淘宝花名:富 曲 Email : fuqu.lgd@taobao.com Fault injection 实现原理与应用

2 简介 自我简介 – 2010 年 9 月加入淘宝,先后从事自动化测试平台建设、报表引擎设 计、性能测试工具关键技术攻关,目前专注于 java 字节码测试方法 探索与研发。 工作职责 – 代码覆盖率 – Fault injection – 字节码检查 – 字节码测试方法论 – 团队建设

3 大纲 为何要 fault injection ? 什么是 fault injection ? 最佳实践 小结 实现原理 核心技术点现场演示 展望

4 为何要 fault injection ? 测试过程中可能遇到的问题:  系统依赖 系统 A 依赖 系统 B ,我希望在系统 B 有故障情形下,测试系统 A 的稳 定性,如何做?  硬件故障 如何模拟因为硬盘坏道或空间满导致的写文件失败的情形?  网络故障 如何模拟网络延迟导致远程调用大量超时的情形?  并发测试 如何验证可能含有线程安全问题的代码?

5  暴力模式: 关机、拔网线、拔硬盘  温柔模式: 故意改坏代码,并重新发布,然后恢复 传统解决办法

6 不好解决的问题  不能精确模拟某个组件出现问题的情形  造成较大范围的故障,可能影响他人工作  服务器在托管机房,无法自由操作  麻烦,不够优雅

7 什么是 fault injection?  Fault injection— 故障注入 是指人为的向被测软件的代码中某个指定的位 置加入一些指令,以模拟出软件不能正常运行的 情形(或者说状态),这些情形可能包括:抛出 异常、运行缓慢等。人们通常把这种方法作为检 测系统的整体稳定性表现的常用手段。

8 Fault injection 部署架构

9 Fault injection 流程 指定故障注入对象 开始测试 登陆 Defensor 执行故障注入

10 Fault injection 最佳实践一:稳定性验证

11 需要做的验证: 当 deployTemplate 为空时,上层组件的表现是否符合期望。 现实的麻烦: 但在正常的情况下, deployTemplate 不会为空。 传统做法: 需要准备一些数据,过程中可能还需要手工修改数据库等操作,经 过相当麻烦的过程才能让 deployTemplate 为空。 fault injection : 可以免去一切数据准备过程,可以直接抛出空指针异常。

12 Fault injection 最佳实践一:稳定性验证

13

14

15 Fault injection 例子一:稳定性验证

16 Fault injection 最佳实践一:稳定性验证 这时,测试人员可以很容易看到,当系统指定组 件出现问题时,被测功能的表现是否符合预期, 并根据测试结果要求开发改进异常处理逻辑。

17 Fault injection 最佳实践二:线程安全验证 什么样的类可能含有线程安全问题?  类实例存在并发访问  类中含有成员变量,并且在方法有被改变的可能

18 Fault injection 最佳实践一:稳定性验证 需要做的验证:  进行并发测试,让程序暴露出问题,或者证明它没有问题。 现实的麻烦:  find bugs 难以证明程序有或者没有问题  要足够快的发起两次或更多的请求需要借助压测工具 传统做法:  需要借助性能压测工具,还要录脚本,准备数据,但最后也无法证 明程序没有问题,因为并发并不能 100% 触发线程安全问题。 fault injection :  可以免去一切数据准备过程,无需借助性能压测工具,可以证明程 序没有问题。

19 Fault injection 最佳实践二:线程安全验证

20

21 开始验证: 使用浏览器在 15 秒内相继向含有故障的页面发起 两个请求即完成了验证工作,根本不需要性能压测。 结论: fault injection 相比传统方法,可以节省至少 80% 的 时间与精力。

22 小结 如何才能用好 fault injection ,发挥它的最大价值?  对系统主要流程的底层依赖进行故障注入测试,找出问题 或者证明它足够健壮。  结合 find bugs 等静态代码检查工具使用,对检查出可能有 问题的代码进行故障注入。  不盲目注入故障,这样只会增加测试成本,却很难发现 BUG 。

23 故障注入工具的实现原理 取回远程 JVM 内存中正在运行的 class 字节码 实时的回传到远程 JVM 中,并让其立即生效 修改,生成新的字节码

24 故障注入工具的实现原理 关键技术点: 1 、生成正确的 JVM 指令并写入到 class 文件中。 2 、如何做到像 eclipse 远程 debug 那样,让修改后的 class 字节码实时生效? 3 、熟识 java class 文件结构,熟悉 jvm 指令,推荐阅读 《 Java 虚拟机规范》

25 故障注入工具的实现原理 关键技术点 1 : 生成正确的 JVM 指令并写入到 class 文件中,可以 使用下面的插件,可以轻易取得 java 源码对应的 Asm 代码, 然后使用 ASM 框架改写 class 字节码,插件地址: http://andrei.gmxhome.de/eclipse/ 。 http://andrei.gmxhome.de/eclipse/

26 Java 源码: JVM 指令: ASM 代码 :

27 故障注入工具的实现原理 关键技术点 2 : 如何做到像 eclipse 远程 debug 那样,让修改后的 class 字节码实时生效?  实时生成类转换器并传送到目标服务器上  远程执行类换器,完成类的转换并重新加载

28 故障注入工具的实现原理 类传换器入口类代码:

29 故障注入工具的实现原理 MANIFEST.MF 文件内容示例

30 故障注入工具的实现原理

31 Fault injection 核心技术点现场演示 现场演示一个动态修改 JVM 中正在运行的类的例子

32 展望  将 fault injection 用于验证测试用例的有效性 即:一个有效的测试用例在有故障的环境运行,正 确的结果应该验证失败,反之,如果验证通过,说明测试 代码本身有问题。

33 Q/A

34 谢谢!


Download ppt "真名:李国栋 淘宝花名:富 曲 : Fault injection 实现原理与应用."

Similar presentations


Ads by Google