参考文章:http://www.360doc.com/content/14/0213/16/7044580_352233197.shtml[[BR]] http://blog.sina.com.cn/s/blog_44d19b500102v75z.html [[BR]] Instrumentation类:http://developer.android.com/reference/android/app/Instrumentation.html [[BR]] Android 原生的测试框架,测试程序和被测程序在同一进程下运行,能生成报告 [[BR]] UI层的自动化,通过反射获取窗口视图,查找控件属性 [[BR]] 跨进程受到android进程安全限制 [[BR]] 扩展后的框架:Robotium, Athrun等 [[BR]] Monkeyrunner http://developer.android.com/tools/help/MonkeyRunner.html [[BR]] Android SDK提供,能够录制脚本,但采用像素形式 [[BR]] python脚本,使用monkeyrunner test.py来执行 [[BR]] 结果的验证是通过截屏比对图片来实现,验证方式不够灵活 [[BR]] UIAutomator: http://developer.android.com/tools/help/uiautomator/index.html [[BR]] Android提供的框架,支持SDK level 16及以上 [[BR]] 打包成jar后push到模拟器中运行,调试相对Robotium不便(其实自己稍微封装下也还OK) [[BR]] 因为和测试应用是独立运行, 无法根据控件ID操作,支持跨进程测试!!! [[BR]] Robotium:http://code.google.com/p/robotium/ [[BR]] 基于instrumentation实现,提供的接口可以满足大部分自动化需求,使用方法简单 [[BR]] 支持手势、webview、截图等操作 [[BR]] 支持Remote Control方式 [[BR]] 支持ant、maven打包,与jenkins结合较好 [[BR]] 资料丰富,社区活跃,更新频繁 [[BR]] 签名问题,待测App和测试App必须使用相同签名 [[BR]] 通过solo对象提供操作方法,面向对象方面较差 [[BR]] 不支持跨应用测试,Android进程安全限制 [[BR]] ---- == gradle配置 == * 使用gradle新版测试的缺省目录是 androidTest * 有些类比如ApplicationTestCase在API 17出现,所以编译的API要是用17以后的 具体的例子可以可以参考volley项目 https://android.googlesource.com/platform/frameworks/volley [[BR]] 采用testApplicationId,路径 androidTest [[BR]] {{{ buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.12.+' } } apply plugin: 'android-library' android { compileSdkVersion 17 buildToolsVersion = 20 sourceSets { defaultConfig { testApplicationId 'com.android.volley.tests' } main { assets.srcDirs = ['assets'] res.srcDirs = ['res'] aidl.srcDirs = ['src'] resources.srcDirs = ['src'] renderscript.srcDirs = ['src'] java.srcDirs = ['src'] manifest.srcFile 'AndroidManifest.xml' } androidTest.setRoot('tests') androidTest.java.srcDirs = ['tests/src'] } defaultConfig {} productFlavors { } buildTypes { } } dependencies { } }}} == google 官方Instrumentation测试例子 == [http://trac.pc.com.cn/gzandroid/attachment/wiki/androidtest/ActivityInstrumentation.zip 下载连接],使用API 19 修改 local.properties [[BR]] 有UI的测试,测试结果在/build/output/reports/androidTests/里面 [[BR]] == robotium 官方例子 == 官网 https://code.google.com/p/robotium/ [[BR]] 已经改成可以是用gradle 执行,gradle connectAndroidTest[[BR]] [http://trac.pc.com.cn/gzandroid/attachment/wiki/androidtest/ExampleTestProject_v5.2.1.zip 下载] {{{ buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.12.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } apply plugin: 'com.android.application' android { compileSdkVersion 17 buildToolsVersion '20.0.0' sourceSets { defaultConfig { applicationId 'com.example.android.notepad' minSdkVersion 14 targetSdkVersion 17 } main { setRoot('NotePad') java.srcDirs = ['NotePad/src'] } androidTest { setRoot('NotePadTest') java.srcDirs = ['NotePadTest/src'] } } buildTypes { } productFlavors { } } dependencies { compile 'com.jayway.android.robotium:robotium-solo:5.2.1' } }}} == 使用uiautomator 测试 == http://developer.android.com/tools/testing/testing_ui.html [[BR]] 先用自带工具 uiautomatorviewer 看页面元素,再写程序 [[BR]] 代码如 {{{ getUiDevice().pressHome(); UiObject allAppsButton = new UiObject(new UiSelector() .description("Apps")); allAppsButton.clickAndWaitForNewWindow(); UiObject appsTab = new UiObject(new UiSelector() .text("Apps")); appsTab.click(); UiScrollable appViews = new UiScrollable(new UiSelector() .scrollable(true)); appViews.setAsHorizontalList(); UiObject settingsApp = appViews.getChildByText(new UiSelector() .className(android.widget.TextView.class.getName()), "Settings"); settingsApp.clickAndWaitForNewWindow(); UiObject settingsValidation = new UiObject(new UiSelector() .packageName("com.android.settings")); assertTrue("Unable to detect Settings", settingsValidation.exists()); }}} == monkey & monkey runner == ./adb shell monkey -p com.juchaozhi -v 5000 [[BR]] 常用命令参考 http://blog.csdn.net/huangbiao86/article/details/8490743 [[BR]] monkey是随机时间,MonkeyRunner 是脚本录制和运行工具,两者没什么关系[[BR]] 官方介绍http://developer.android.com/tools/help/monkeyrunner_concepts.html [[BR]] sdk目录下 tools/monkeyrunner [[BR]] 录制只有一个设备情况下输入脚本可以录制, 按坐标位置记录, 感觉很难用,不建议使用 google官网上都不介绍录制了,回访的可以参加这个脚本 http://blog.csdn.net/shy871265996/article/details/9716407 [[BR]] {{{ from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder device = mr.waitForConnection() recorder.start(device) }}}