本文转载来自:金阳光老师的csdn博客文章:http://blog.csdn.net/haorenmin2008

第一讲分享了下安卓自动化一些概况和一些自动化框架现状和技术能够解决什么样的问题。这次课就深入到android世界里面。遨游、翱翔,深入了解自动化测试核心技术。

搞过编程开发的同学听到instrumentation这个东西一定不陌生。在android架构里面分四层(最下面是硬件驱动相关抽象层,不是笔者讨论的内容范围),往上面一点是协议栈,也不是讨论的核心,都和c语言相关,一直到第三层框架层(framework)。细分有二:

A.   android的改良虚拟机dalvik和Runtime(java运行时环境)。这个我还要稍微解释下(懂的人请跳过),谷歌把java虚拟机(pc上面的虚拟机)进行改良,进行内存等优化,取消了远程登录等功能,发展成为自己的虚拟机,这样做好处是把每个独立的进程进行虚拟机封装,从而进程崩溃不会影响system进程。保证了安卓系统稳定性。

B.   Runtime是一个和外部程序的接口(有些地方叫协议)把很多丰富的c++库、3D和2D动画、媒体库、字体库、sqilite等优良的特性引入到上层。

当一个android系统启动的时候,加载完毕守护进程和一些驱动等等步骤会调用init方法:Android的init进程为SIGCHLD绑定了信号处理函数sigchld_handler(),并创建了一个socket用于接收该函数中发送的socket消息。sigchld_handler()函数只是简单的派送一个消息到该socket。看得头晕的同学请无视他们。你只要记住,c侧的框架层加载完毕,将要调用一个java层最根上的父类,就是Zygote。英文名字是孵化、受精卵,大意是生孩子。所有的进程都由它产生,它和系统服务结合共同产生ActivityManagerService、WindowsManagerService和DialogservicesManager等,由zygote控制它们和线程binder对象进行通信,共同产生android四大组件(activity、broadcast、services、contentprovide)。在zygote创建process(线程)对象同时,我们终于看到幕后蠢蠢欲动的instrumentation。饶了一大圈的盖世太保终于出现了。它能够在所有组件的初始化之前产生,所有它能够监视所有组件信息、状态、变化、消亡等,当然,在监控之前,它会拿到这些组件的那个上下文引用(context),控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。这就是自动化最核心的技术—设计模式之监听者模式。

在操作系统中,应用程序组件是控件的父类,由instrumentation监控和获取信息,然后由instrumentationTestRunner来控制脚本才进行一次自动化测试,你可以在adb shell里面运行这个脚本,或者用eclipse+junit方法来运行脚本,都是可以的。

这里的Instrumentation类,它能够监视应用程序跟系统的交互。Instrumentation对象会在应用的其他所有组件被实例化之前实例化。需要调用instrumentation类必须继承android.app.instrumentation才能使用它。

由于android的核心不是app,是activity。这和ios苹果大相径庭。苹果是delegate委托和发送消息机制为主的MVC模型(视图、控制器和模型)详细苹果ios自动化测试文档会在第9讲以后问世,虽然android也有消息,但是安卓的消息一般是传递键值对(key­_value),在安卓里面叫bundle对象,是一种被泛型的字典。这里顺便提下后起之秀winphone 8,它的机制更诡异,是一种墓碑化休眠保存机制(这个winphone自动化和单元测试会在第15讲以后给大家详细剖析)。正因为有了它,winphone为了达到它最好的用户体验,虽然是多线程,但是同一时间只能有一个进行激活状态,正因为如此,它单核的机器性能和效率远远盖过android和苹果。所以说,做了三十年的操作系统的微软水平真不是盖的,用户体验等等都优越苹果和android,尽管很少人使用。

好,废话少说,切入正题。Instrumentation会去androidmanifest.XML找里面注册的activity、service等一些组件信息,当然还会包括布局文件layout里面xml的组件和控件在gen文件夹里面生成的R.java的id搜集并且保存下来,这些id都以0x的16进制的int。可以说是控件的身份证信息。你要是觉得麻烦,可以用hierarchyviewer去查看,顺便提一下,用这个工具必须得root手机,当然笔者是不提倡把一个好的user版本手机随便刷成root,这里要给买来的普通用户手机正正名,root是打开管理员su权限,让终端使用者有最高权限去操作手机,任何东西都有利有弊,弊端是你同时给了应用程序相对应的权限:比如其他应用程序可以跨进程访问(这在android世界里面是破坏了谷歌的整套设计规则),搞android开发的知道,进程之间不能随便访问和建立通信,除非你打开AIDL绑定的服务接口或者你在编译手机的时候偷偷的把app签名做成系统级别的签名。除此以外,在一般用户权限做了很多限制,大大的保证了你机器稳定性和安全性。但是你要root的话,很多东西就不可控了,表现出来的现象是你手机莫名其妙重启、死机、无响应,或者你操作不当误删除了有用的模块,比如打电话不小心卸载,你就只能去重新刷过机器,所以说,普通用户还是不要随便刷机,因为谷歌压根就不限制你安装应用程序,不像苹果非得越狱才能随意安装应用。

当然你用自动化测试的时候也得在manifest申明,如下图

          

第一个红箭头这个带.的ResultActivity前面省略了命名空间(android叫包名),因为就一个包,当然在真正测试demo里面,大家还是要新建一个包名+test,测试完毕删除就好;

第二个uses-library,因为现有的基于控件的instrumentation和后续给大家介绍的Robtium框架,是封装了instrumentation的,都不能单独进行测试,必须配合junit4(junit3已经废弃,尽管能用,但是高级功能和annotation等需要junit4,这是一个元数据,也就是解释数据的数据,不明白的同学可以网上搜索下,不是这次的重点。(这个具体使用会在第5篇以后详细介绍))框架一起进行测试,所以这条语句就是为了导入junit包,让结果运行在junit框架里面。

第三个红箭头就是盖世太保,有了它我们就可以随时调用和给你见到布局文件的菜单进行操作了,都不需要开权限,当然你得统一签名,因为测试源代码我们有,这步省略,(后面第7章会教大家不用源代码的方法),你可以点击,断言,back等都是可以的。

到此为止,自动化核心技术之一---基于控件的精髓就在此。以后大家别见市面上有多少种android自动化工具吹嘘:可以远程控制、可以鼠标控制手机、可以自动录制脚本。是,但是不是他们本事高强,其实都是调用了谷歌封装instrumentation,所以厉害的还是谷歌,并不是做自动化工具的人,不相信的同学可以关注我后续的讲座,我也随便整合一个所谓的框架来运行自动化脚本,做测试工作中的项目,到时候请大家拍砖。^_^(除了另外一种自动化核心技术---ORC和元素识别,会在第7篇以后给大家揭秘)

这次技术分享就到这里,第三讲主要给大家分享自动化测试鼻祖Monkey 的原理和灵活使用它的一些高级法则,灵活运行它可以对测试起到很大的帮助。

基于控件核心技术探讨---金阳光自动化测试Android(2)---2013年5月相关推荐

  1. 【金阳光测试】基于控件核心技术探讨---Android自动化系列(2)---2013年5月

    第一讲分享了下安卓自动化一些概况和一些自动化框架现状和技术能够解决什么样的问题.这次课就深入到android世界里面.遨游.翱翔,深入了解自动化测试核心技术. 搞过编程开发的同学听到instrumen ...

  2. 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月...

    第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...

  3. 大话Android自动化测试--金阳光自动化测试Android系列(1)--金阳光于2013年4月份

    本文转载来自:金阳光老师的csdn博客:http://blog.csdn.net/haorenmin2008 Android自动化测试框架和工具在四年多的发展日趋成熟.从五年前的第一代自动化架构演进到 ...

  4. 深入浅出VC++串口编程--基于控件

    深入浅出VC++串口编程之基于控件源代码下载 MSComm控件 Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSCo ...

  5. 【android免root脚本制作】基于控件的操作——auto.js进阶

    在[android免root脚本制作]自动坐标操作手机--京东金融程序金果摇钱树自动收金果 之后,想要做进一步优化,因为基于坐标点击如何屏幕被移动之类就会点击错位,不同手机还需去适配坐标,甚是麻烦,所 ...

  6. android让一个控件跟上面控件对其,学个明白--Android控件架构

    Android控件架构 1.什么是View? View是Android中所有控件的基类.View是界面层的控件的一种抽象,它代表了一个控件.在Android中每个控件都会在界面中占得一块矩形的区域.在 ...

  7. android 商品筛选view,FilterTabView 基于 Popupwindow 实现的筛选房源信息等相关的控件,可以自由排序 @codeKK Android开源站...

    基于 Popupwindow 的下拉筛选控件 功能 区分 支持区域二级联动选择 FilterTabConfig.FILTER_TYPE_AREA 支持单行 List 样式选择 FilterTabCon ...

  8. android控件之间的过渡动画效果,Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换...

    现需要交换两个控件(本文中是两个RelativeLayout),找到了两个方法: 1.使用LayoutParams改变两个layout的属性,即其相对关系(below等),实现位置的交换,但是并没有交 ...

  9. VC(MFC)以ADO连接数据库(基于控件ListControl)

    文章出处: 星魂工作室    独孤残云 MFC以ADO连接数据库的方法大致分为如下几个步骤: 1.在Stdafx.h中引入相应的dll文件 #import "c:/program files ...

最新文章

  1. 深度学习之七:卷积神经网络
  2. HDU5812 Distance(枚举 + 分解因子)
  3. Java中BigInteger的各种方法详解
  4. linux 定时备份mysql数据库
  5. 部署OpenStack问题汇总(五)--openstack中删除虚拟主机,状态一直未deleting
  6. linux不支持32,Visual Studio Code 1.36发布,不再支持Linux 32位
  7. 前端开发 get请求与post请求 0228
  8. Momenta 陈凯:从人才角度看 L4 无人驾驶的实现 | AI 研习社职播间第 4 期(附 Momenta 招聘解读)...
  9. java删除文件夹部分内容_java 删除文件夹中的所有内容而不删除文件夹本身
  10. 群晖虚拟机VMM定时开启
  11. mysql.sock 是什么_mysql.sock到底存了什么信息?
  12. 英语语法特殊句型刷题总结
  13. 计算机键盘输入法基础知识,电脑基础知识:使用键盘打字
  14. python音频频谱分析软件_SpectrumView(音频频谱分析软件)
  15. OrCAD 与 Cadence Allegro PCB 入门 - 以 16.6版本为例 (3)
  16. 图片转化为字符画——get!小技巧【美人图,动物照,有趣注释图案】
  17. 数字化具体指的是什么?
  18. plt.title 设置标题或标注和图片之间的距离
  19. Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.1.1:generate
  20. 网站加载图片慢 网页响应慢 网页优化

热门文章

  1. 写给即将入职的你-软件工程之需求开发流程 1
  2. Python学习,第五课(colorama给结果添点颜色)
  3. IDEA 修改快捷键
  4. Aurix TC3xx系列MCU GTM模块介绍
  5. 神经网络丨BP算法(案例代码实现)
  6. Java过滤器Filter讲解(Java基础)
  7. 数据库中的行列转换(横竖转换)
  8. c语言中10 1是什么意思,维生素c1十是什么意思
  9. 找不到所选字体 “Cascadia Mono“。 改为选择 “Consolas“。教程
  10. 如何正确的对拍程序?