本文主要介绍如何通过instrumentation和其他测试工具对activity进行测试。
具体的测试代码正在整理,下月blog记录下
不同于其他组件,activity有一个复杂的基于回调方法的生命周期,除了instrumentation外不可显示被其他类调用,所以activity的测试尤其依赖Android instrumentation的框架。
1、测试activity的api
测试activity的api的基类是InstrumentationTestCase,这个基类为其提供了instrumentation。
1.1 对于activity测试,InstrumentationTestCase这个基类提供了如下功能:
a. 生命周期控制:通过instrumentation,你可以控制被测试activity的启动、暂停和销毁等。通常情况下,组件的生命周期是由系统控制的,例如大家熟悉的activity生命周期的相应函数onCreate、onResume、onStop等函数都是由系统自行调用,并且android应用框架并没有提供权限让用户直接调用,但是在instrumentation中却可以调用。
b. 依赖注入:你可以使用instrumentation mock系统对象,如contexts、applications,使用它们启动activity。使得被测点可以和数据分离。
c. 用户界面交互:你可以使用instrumentation向被测activity ui发送activity发送键盘、触摸、手势事件。
用于测试activity的两个主类是ActivityInstrumentationTestCase2
和 ActivityUnitTestCase。
为了测试非标准态的activity,你可以使用SingleLaunchActivityTestCase
。
1.2 ActivityInstrumentationTestCase2
适用于多个activity见的功能测试,以及activity对intents的响应测试。被测试activity通过系统基础api创建,你可以直接操作创建的activity。取代了之前的ActivityInstrumentationTestCase。
优点:
a. 可以方便的mock intents在各个activity中进行切换,测试activity对不同类型intents的响应,更多见setActivityIntent(Intent)
b. 可以在ui线程运行任何测试方法,更多见UiThreadTest
缺点:因为通过正常的系统基础api创建,不允许mock contexts或者applications,所以无法将activity和系统其他部分隔离进行独立测试。
1.3 ActivityUnitTestCase
适合于将单个activity从系统中隔离独立进行测试,以及activity中mock context和application的测试。被测试activity创建时尽可能少的依赖系统基础,你可以mock掉activity的诸多依赖。
优点:activity启动前可以方便的mock context、application等,使得activity的创建相对独立,从而进行不与系统交互的单元测试。
缺点:activity并非运行在通常的系统中,也无法与系统中的其他activity进行交互,所以很多函数无法正常调用或是调用后不做任何事情。
1.4 SingleLaunchActivityTestCase
适合对非标准态(singleTop、singleTask、singleInstance)的activity进行测试。它仅调用setUp()和tearDown()一次,而不是每个方法调用都会调用一次setUp和tearDown。所以可以在setUp中创建activity,在tearDown中销毁activity,这样在整个测试类执行过程中,activity只被创建一次。
如果大家了解activity启动的几种方式的话肯定会联想到singleTop、singleTask、singleInstance这三种启动模式,这个类实际上就是为了模拟对这三种启动模式的测试。关于这三种模式可以参考:http://trinea.iteye.com/blog/1112902
优点:可以对非标准模式的activity进行测试,能够保证在测试过程中配置不变从而测试activity对不同调用的处理。
缺点:无法mock任何对象。
2、测试重点
2.1 输入的有效性:这个跟很多软件和网页开发类似,就不用多说了,可以使用mokey和monkeyrunner进行自动化测试。
2.2 生命周期事件:重点在生命周期状态切换时是否正确保存当前状态并且响应。
2.3 Intents:activity能正确处理在AndroidManifest.xml文件中intent filter节点配置的intent,可以使用 ActivityInstrumentationTestCase2 mock不同的intents进行测试。
2.4 运行时配置变化:在程序运行时配置变化是否能够正确响应,如屏幕方向、修改语言等等。更多变化可以见 Handling Runtime Changes.
2.5 屏幕尺寸和分辨率:在应用发布前需要测试应用在不同屏幕尺寸和分辨率设备上的运行情况,可以直接通过修改avds的尺寸或是直接在目标设备上测试,更多可以参考Supporting Multiple Screens。
3、UI测试说明
应用的activities运行在UI线程即主线程内,一旦UI实例化后,所有跟UI的交互操作必须在这个主线程内完成,可以参考http://trinea.iteye.com/blog/1142151。当程序正常运行时,拥有对该线程的访问权限。
当进行测试时,基于instrumentation的类,可以调用方法进行UI操作,而其他的类不可以。为使某个测试方法在UI Thread中运行,可以使用@UIThreadTest对该方法进行标注,这样该方法的所有语句将运行在UI Thread中,并且不允许包含不与UI交互的语句,如Instrumentation.waitForIdleSync().
为了在UI Thread中运行测试方法的一个子集,可以创建Runnable的一个匿名子类,将运行的语句放在run()方法内,然后实例化一个对象作为appActivity.runOnUiThread() 参数。其中appActivity为被测activity的一个实例化对象。具体见示例代码。
下面是几个可能碰到的问题解决方法
1、为了使得设备响应测试发送过来的键盘事件,必须关闭touch模式,否则无法响应。
关闭touch模式方法:调用getActivity()方法之前调用ActivityInstrumentationTestCase2.setActivityTouchMode(false)
,并且只能在运行于非UI Thread的方法中调用。
2、当屏幕锁住时,测试无法运行。
解决方法:禁止屏幕锁屏
a. 在AndroidManifest.xml
文件的manifest节点下添加,添加
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
表示允许程序使用禁止屏幕锁屏权限。
b. 在被测试activities的onCreate()函数中添加
mKeyGuardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
mLock = mKeyGuardManager.newKeyguardLock("activity_classname");
mLock.disableKeyguard();
其中activity_classname为被测试activity的类名。
3、WrongThreadException
测试用例执行失败报如下异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这个问题是因为在非UI线程内进行了UI的操作导致的,可以通过添加@UiThreadTest或者使用runOnUiThread()方法。
若开发代码中报,解决可参考:http://trinea.iteye.com/blog/1142151
4、java.lang.RuntimeException
测试用例执行失败报如下异常:
java.lang.RuntimeException: This method can not be called from the main application thread
这可能是在UI Thread(主线程)内进行了非主线程允许的操作,可能是方法添加了@UiThreadTest或者使用了runOnUiThread()方法。
参考:http://developer.android.com/guide/topics/testing/activity_testing.html
http://developer.android.com/resources/tutorials/testing/activity_test.html
分享到:
相关推荐
【毕业设计】基于yolov9实现目标追踪和计数源码.zip
MATLAB程序:多个无人船 协同围捕控制算法 3船围捕控制,围捕运动船只 可以仿真多个船之间的距离以及距离目标船的距离,特别适合学习、参考
基于线性模型预测控制(LMPC)的四旋翼飞行器(UAV)控制
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在IDEA中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习 VUE 框架构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
内容概要:本文详细介绍了一种基于 Python 实现无人机自动拍摄的方法,具体涵盖无人机飞行控制系统与摄像头控制的交互流程。主要内容包括:环境搭建、所需第三方库安装、无人机初始化与控制逻辑解析、到达指定地理位置后的摄影动作实现及任务结束后的安全返程指令集发送机制。 适用人群:具有一定编程能力和硬件基础知识的技术爱好者、从事航空影像获取相关领域的工作人员以及自动化设备的研发者。 使用场景及目标:通过本指南可以帮助用户掌握如何构建基本但完整的无人机自动拍摄系统,从而适用于新闻报道、地质勘探、环境监测等多个应用场景中的快速响应数据采集任务。 其他说明:代码实例采用开源软件(如dronekit、opencv等),便于后续开发优化,同时强调了飞行安全性与法律法规遵从的重要意义,鼓励开发者先期模拟测试再逐步应用于实际项目中。
李团结业务招待费申报表20250104.pdf
含前后端源码,非线传,修复最新登录接口 梦想贩卖机升级版,变现宝吸取了资源变现类产品的很多优点,摒弃了那些无关紧要的东西,使本产品在运营和变现能力上,实现了质的超越。多领域素材资源知识变现营销裂变独立版。 实现流量互导,多渠道变现。独立部署,可绑自有独立域名不限制域名。
这是一个基于 Unofficial Airplay 协议规范的 C# 与 Apple TV 连接
【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式)
【C语言】2019年南航计算机学院操作系统课程的实验代码-实验心得-上机考试练习-笔试复习笔记_pgj
二十.核心动画 - 新年烟花:资源及源码
【毕业设计】Python 图形化麻将游戏 带蒙特卡洛AI源码.zip
离散数学是计算机科学中的一个基础且至关重要的领域,它主要研究不连续的、个体的、离散的数据结构和逻辑关系。02324离散数学自学考试试题集为考研复习提供了宝贵的参考资料,尤其对那些准备复试的学生来说,价值巨大。通过这些试题,考生可以系统地理解和掌握离散数学的基本概念、理论和方法。 离散数学的核心内容包括以下几个方面: 1. **集合论**:集合是最基本的数学概念,离散数学首先会介绍集合的定义、元素关系、集合的运算(如并集、交集、差集、笛卡尔积等)以及集合的性质。此外,还有幂集和良序原理等相关知识。 2. **逻辑与证明**:这包括命题逻辑和一阶逻辑,学习如何使用逻辑符号表达命题,并进行逻辑推理。证明技巧如归纳法、反证法和构造性证明也是重点。 3. **图论**:图是描述对象之间关系的重要工具,学习图的定义、度、路径、环、树等基本概念,以及欧拉图、哈密顿图、最短路径算法等问题。 4. **组合数学**:计数问题是离散数学中的一个重要部分,包括排列、组合、二项式定理、鸽巢原理、容斥原理等。它们。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式)_pgj
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
全方位讲解三菱Q系列QD173H、QD170运动控制器, 是事频,共25个小时的事频讲解,非常详细。 需要特殊播放器播放,一机一码,必须电脑本地播放,看清楚再拿哦 Q系列运动控制器是比较高级的内容,专门用于运动控制,比如圆弧插补、电子凸轮、同步运动等。 每结课的源程序和QD713H QD170都有,已经配置好了。 如果需要用,根据自己的实际应用稍作修改,灌入PLC就可以。 内容有:QD170 QD713的参数设置、模块介绍和NN通信、指令讲解与JOG编程、opr定位程序初写、QD170M的同步控制、双凸轮控制、凸轮进给、凸轮往复、实模式、虚模式。 可以说这两个模块的所有功能都有讲有。 包括有: 1、PLC源程序 2、QD170 QD713的配置文件 3、事频讲解,专门讲的QD713 这个是Q系列中比较高级的内容,需要比较好的基础 搞定这个15K不是很大的问题,需要好的基础。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在IDEA中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习 VUE 框架构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
感应电机 异步电机模型预测电流控制MPCC 感应电机MPCC系统将逆变器电压矢量遍历代入到定子磁链、定子电流预测模型,可得到下一时刻的定子电流,将预测得到的定子电流代入到表征系统控制性能的成本函数,并将令成本函数最小的电压矢量作为输出。 提供对应的参考文献;
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
建筑暖通空调与微电网智能控制协同设计(代码)