版权声明:本文出自胖喵~的博客,转载必须注明出处。

转载请注明出处:http://www.cnblogs.com/by-dream/p/5048525.html

  今天没上班,一大早就起来赶去搜狐网络大厦,参加一个测试技术的分享会。本打算好好的拍一个前台的照片留作纪念,结果发现这里堆了好多的快递。

  

  进入正式话筒吧,搜狗测试人员分享的内容为PC端和Android端的精准测试;腾讯测试人员分享的是Java的hook技术。

  这里我就简单的介绍一下分享的内容吧,因为涉及到两家公司的知识产权,我也不好详细的道来,因此只是简单说说,给想往这方面钻研的初学者做一个指引。

精准测试


  相信大家在线上项目的话,大多都会遇到这样的场景:当发版前开发改动了一些代码,由于时间有限,我们的测试时间非常的短,因此通常会面临下面的问题:

  1、较少的时间内测试的范围不足,容易发生漏测;

  2、如果全部功能进行回归的话,范围太高,成本有点高‘

  3、版本上线后心里没底,不知道我们的测试是否都覆盖到了修改的点。

  因此我们需要引入精准测试,通过代码的变更,能够准确的定位到哪个模块会受到影响,从而执行对应的用例。最终我们要达到一个“代码的改动映射到用例”这样一个目的,实现之后每一次的代码改动,只需要关注影响到的模块,然后去执行对应的用例,这样就会非常高效的完成测试。

  我以Android为例:

  首先我们需要总结一个库,库里存放着多个任务,每个任务包含 用例名称、用例执行的步骤、以及用例执行过程中代码的调用关系。 当a版本更新到了b版本后,我们可以根据这两个版本之间的svn的差异,获取到代码变更的函数。然后去我们的库里去搜索该函数,当在一个任务中找到了匹配的函数后,就可以反查出我们需要执行的用例名称,从而去按照用例的执行步骤去执行。这里面一共涉及到这几方面需要我们用技术一一攻破:

  1)a版本更新到了b版本后变化了什么函数?

    目前大部分的代码版本控制系统使用的都是TortoiseSVN,我们可以使用svn的命令行diff命令来得到代码的变更差异,然后通过python脚本对结果进行整理,可以很容易的得到变更的函数名称,这点不用再多解释;

  2)库如何行成?

    首先库里面存放这是一个一个的内容,每一个内容包含用例名称、用例执行的步骤、以及用例执行过程中代码的调用关系。用例名称、用例执行的步骤可以按照正常我们写用例的方法来完成。代码的调用关系需要借助..sdk\tools\目录下的traceview.bat来获得执行用例过程中的代码调用关系,然后把它转成自己识别或者程序识别的格式。

  当然由于这项技术他们也只是刚刚开始介入,会有以下一些问题暂时还没找到好的解决方案:

  1、公共方法的改变意味着要去执行一遍全部的用例,然后更新函数调用关系到库;

  2、当在手工执行过程中,会有一些其他的噪音函数的干扰会导致函数的调用关系无故的增多。

  当然以上这两个也有解决的思路,例如第一种将公共的映射的函数提取出来,当发生改变时,只做一次用例覆盖就完成所有的更新;对于噪音函数,使用多次执行的方式排除掉。其实不止是精准测试,所有的测试都是在不断的探索和摸索中不断的进步,一点点的积累起来的。

JavaHook


  腾讯分享的Java Hook技术的技术性比较强,一般的测试可能太用不到,分享的同学是专项测试的一名“女黑客”,着重于竞品数据破解,因此这方面的知识了解的比较多。

  首先我想介绍一下hook的概念,hook技术也被成为钩子技术,是一种通过注入手段来修改指定函数入口点,并将其指向自己构造的中间函数的一种手段,大体分为两种形式:

  1、替换型

    例如A函数调用B函数,我们通过注入的手段,将A函数调用指向了我们的hook函数C函数;

  2、内联行

    例如A函数调用B函数,我们通过注入的手段,将A函数调用指向了我们的hook函数C函数,并且执行完C函数后,再去调用B函数,在表面看来,并没有打乱函数原有的顺序。

  那么这两种都用在什么地方呢?

  第一种技术,在GT的流程度测试中,我们用到了这种手段;第二种的方式和第一种方式的差别其实就是,在我们hook成功拿到我们注入的App的数据后,是否希望该App还按照原来的流程继续执行下去,如果需要让用户无感知进行注入,那么就需要这样的手段,例如干扰或者压制竞品,当然我们并不鼓励这么做。

  我们首先了解下Android中一个Java代码中一个方法(函数)执行的原理:一个函数来了后,先进入Dalvik虚拟机,变成一个dvmlsNativeMethod,然后系统会判断它是Java函数还是Native函数(c层),Java函数执行的流程是走DVM解释执行,Native函数执行的流程是找到其属性nativeFunc中存放着JNI函数的地址,然后进行跳转过去。

  Native函数和Java函数的区别就是一个accessFlags的属性是否为ACC_NATIVE,Java hook技术就是将Java函数的accessFlags的属性设置为ACC_NATIVE,让其变成Native函数。然后修改nativeFunc中的地址为hook函数。如果是想做到hook函数执行后再执行回之前的函数,那么需要子啊hook函数之前malloc出一块内存,记录地址,然后将原method整个memcpy过去,在hook执行之后,在memcpy回来,通过JNI的Call**Method调用原函数。

  目前业内比较好的两款工具就是 Xposed Framework 和 Cydia Substrate 。前者使用比较友好,并且开源,但是仅支持Java层Native方法的hook,后者不开源,但是可以支持C/C++层的hook,但是相对用起来也是比较的geek。至于这两种工具的具体使用方法,我这里就不再做细致的介绍了,有兴趣的可以去论坛里自己去挖掘吧。

  对了最后补充一句,以上所说的都是在Android的4.4版本以下(包含4.4)的手机系统中生效,目前 Android L 和 Android M 的注入技术还不是特别的成熟,因此这里没有再做介绍。

  

  

  本次分享会,收获颇丰,以后如果还有类似的,我也会继续分享出来。   

【Android测试】【随笔】搜狗、腾讯技术交流会心得的更多相关文章

  1. 【Android测试】【随笔】模拟双指点击

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5258660.html 手势 看到这个标题,很多人会想一想 ...

  2. 腾讯技术分享:Android版手机QQ的缓存监控与优化实践

    本文内容整理自公众号腾讯Bugly,感谢原作者的分享. 1.问题背景 对于Android应用来说,内存向来是比较重要的性能指标.内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验.因此 ...

  3. 【Android测试】【第十七节】Instrumentation——App任你摆布(反射技术的引入)

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处.  转载请注明出处:http://www.cnblogs.com/by-dream/p/5569844.html 前言 学习了上节之后,大家是否已经 ...

  4. 【Android测试】【随笔】模拟长按电源键

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5195121.html 起因 昨天群里看到有人问如何实现一个 ...

  5. 【Android测试】【随笔】获得App的包名和启动页Activity

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5157308.html 前言 经常看到一些刚刚接触Andro ...

  6. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  7. 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践

    1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...

  8. 腾讯技术分享:微信小程序音视频技术背后的故事

    1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...

  9. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

随机推荐

  1. SU suplane命令学习

    各位博友,不足之处,批评指正! 用其他软件打开看看, 注意:下图中应该是倾角,dip=Δt/Δx,单位为ms/traces,

  2. AngularJS学习笔记二:AngularJS指令

    AngularJS 指令: AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. 几个常用 指令: ng-app 指令 ...

  3. BZOJ2051 : A Problem For Fun

    树的点分治,将点分治的过程记录下来,每一个分治结构按到分治中心的距离维护所有点. 对于一个点二分答案,然后在$O(\log n)$个分治结构中二分查找,时间复杂度$O(n\log^3n)$. #inc ...

  4. BZOJ3679 : 数字之积

    设f[i][p2][p3][p5][p7][j][k]表示前i位,2,3,5,7的次数,前i位是否等于x,是否有数字的方案数 然后数位DP即可,ans=cal(r)-cal(l) #include&l ...

  5. ajax返回数据解析总结

    ajax即异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示 ...

  6. Hibernate批处理操作优化 (批量插入、更新与删除)

    问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低. 工 ...

  7. virt-manage图形界面键盘错位问题

    键盘错乱问题: 启动引导问题:

  8. Json 数据

    来自:极课学院 简介: json与xml json语法 json对象 json对象数组 用到的包 读取json数据例子 创建json数据

  9. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  10. Leetcode | N-Queens I & II

    N-Queens I The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no ...