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

转载请注明出处: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. Rightmost Digit

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  2. Windows内核下操作字符串!

    * Windows内核下操作字符串! */ #include <ntddk.h> #include <ntstrsafe.h> #define BUFFER_SIZE 1024 ...

  3. bug 调试了一个下午外加半个晚上的bug

    public void queryTaskResult2() throws Exception { HttpServletRequest request = ServletActionContext. ...

  4. cocos2d ARCH_OPTIMAL_PARTICLE_SYSTEM这个未定义的问题

    在新版本的cocos2d中ARCH_OPTIMAL_PARTICLE_SYSTEM已经被移除由 CCParticleSystemQuad取代 CCParticleSystem *test = [ARC ...

  5. 【BZOJ】3223: Tyvj 1729 文艺平衡树(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3223 默默的.. #include <cstdio> #include <cstr ...

  6. 理解with(nolock)(转载)

    本文导读:要 提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善 ...

  7. 转 sql 时间转换格式 convert(varchar(10),字段名,转换格式)

    convert(varchar(10),字段名,转换格式) CONVERT(nvarchar(10),count_time,121)CONVERT为日期转换函数,一般就是在时间类型(datetime, ...

  8. C++ Generate Rand Number Array by "srand()" 生成随机数

    在C++中,我们有时想生成一个由随机数组成的数组,而且随机数的范围也可由我们来设定.那么我们就要用到srand()函数配合rand()来使用,参见如下代码: #include <vector&g ...

  9. Qt resizeEvent 控件居中设置

    在Qt中我们有时需要让一个控件在窗口居中或是在父控件中居中,而且在窗口拉伸时仍然保持正中央的位置.这里介绍一种方法,用到了主窗口的响应函数resizeEvent(QResizeEvent* event ...

  10. shadowColor表示阴影颜色,shadowBlur表示模糊等级

    绘制之前的准备工作: 1.在body中加入canvas标签,设置它的id.width.height,当然也可以动态设置它的宽高. <canvas id="mycanvas" ...