• 1. 基于Android的自动化测试综述报告人:李小喆 2012年4月10日
  • 2. 软件自动化测试软件自动化测试就是模拟手动测试步骤,执行测试程序来控制被测软件的执行,完成全自动或者半自动测试的过程。 全自动测试就是指在自动化测试过程中根本不需要人工干预,由程序自动完成测试的全过程。 半自动测试就是指在自动化测试过程中需要手动输入测试用例或者选择测试路径,再由自动化测试程序按照人工指定的要求完成测试过程。1of41
  • 3. 软件自动化测试软件自动化测试是一门技术。对于任何软件系统,测试者希望通过有限的测试用例发现软件中的大部分缺陷。自动化测试可以使测试用例得以重复测试,并能保障测试的科学性、严密性、组织性。 软件自动化测试是一种机制。它不仅是指运用工具进行自动化测试,而且包括了如何管理自动化测试,如何确定自动化测试的方法以及如何组织测试等。 2of41
  • 4. 自动化测试生命周期3of41可行性分析测试工具选择设计测试框架设计测试计划开发测试脚本执行和管理测试过程
  • 5. 执行自动化测试的基本流程4of41准备阶段开始配置系统参数运行自动化安装部署定时检查新版本新版本?备份新版本自动安装部署到相应平台无有结束执行测试启动、执行测试脚本产生结果日志生成最终测试报告归档
  • 6. 可行性分析要采用自动化测试,首先需要仔细研究测试内容、测试步骤和技术要求等,确定测试过程中应该进行和能够进行自动化测试的内容。然后选择适合的测试工具或者自行开发合适的自动化测试工具。 需求不明确 测试内容不稳定 项目周期短 只交付一个版本的项目 硬件交互频繁5of41
  • 7. 常用的自动化测试框架通过创建小的、独立的脚本来代表被测应用程序的模块和函数,然后用一种分层的方式将这些小脚本组成更大的测试,从而实现一个特定的测试用例。 模块化测试脚本框架使用抽象和封装的原理,在一个组件上建立一个抽象层以隐藏应用程序其他的组件,提高了自动化测试组合的可维护性和可升级性。6of41模块化测试脚本框架测试库框架数据驱动测试框架关键字驱动测试框架测试的输入和输出数据存储在独立的数据文件中,测试脚本只存放控制信息。测试时输入直接从文件中读取,这样同一脚本可以运行于不同的测试用例中,实现了脚本与数据的分离。需要开发数据表和关键字,把传统测试脚本中变化的与不变的东西进行了分离。用创建的库文件代表被测应用程序的过程和函数,然后这些库文件被测试用例脚本直接调用。 与模块化测试脚本框架都产生了高度的模块化,提高了自动化测试组合的可维护性和可升级性。
  • 8. 数据驱动测试框架数据驱动的自动化测试利用相同的测试过程测试不同的输入输出组合。它将输入和预期输出组织为表,表中的每一行对应一个测试。然后创建一个从表中逐行读入、执行每个输入步骤、检验预期结果的自动化测试过程。7of41
  • 9. 数据驱动测试框架8of41#设置数据文件名称 table = “datadriver.xls”; #获取数据文件记录,判断数据文件是否为空 rc = ddt_open(table, DDT_MODE_READ); if(rc != E_OK && rc != E_FILE_OPEN) pause(“Cannot open table.”); ddt_get_row_count(table, table_RowCount);#一次读取数据文件中每一行的记录,取代脚本中对应的变量 for(table_Row = 1; table_Row <= table_RowCount; table_Row ++) { ddt_set_row(table, table_Row); #用数据文件中的订单号作为文本框的输入 edit_set(“Edit_1”, ddt_val(table, “Order_Num”));
  • 10. 优点 缺点9of41在应用程序开发的同时就可以同步建立测试脚本; 减少开发和维护测试脚本的工作量和成本; 支持非程序设计测试人员,自动化测试开发人员创建数据驱动的测试过程,测试人员创建测试数据。需要管理大量的数据文件; 在编辑数据文件时,必须注意测试脚本所需要的传输格式,否则会在处理脚本时产生错误。
  • 11. 关键字驱动测试框架10of41控制器测试脚本实用脚本
  • 12. 关键字驱动测试框架11of41界面元素名与测试内容对象名分离。在被测应用程序与测试脚本之间增加一个抽象层,可以将界面上的所有元素映射成相对应的一个逻辑对象,测试脚本仅针对这些逻辑对象进行。 测试描述与测试具体实现细节分离。测试描述只是测试要执行的动作和结果,而不管是怎样执行和怎样验证结果的。这种分离有利于测试在不同工具和平台间的移植。 脚本与数据的分离。测试脚本与测试数据可以独立维护。
  • 13. 软件自动化测试优势相对于人工测试,自动化测试可以完成大量的重复测试,体现软件性能的优劣,这些都是人工测试很难完成的。 速度 效率 准确度和精确度 节约资源 仿真和模拟12of41
  • 14. 基于Android的自动化测试解决方案13of41Android的各个版本之间都有不同程度的差异,因此Google专门针对Android2.1以上各个版本提供了兼容性测试工具CTS,其中共有两万多个测试用例,包括功能测试和少数性能测试。CTS(Compatibility Test Suit)monkeyrunner工具提供了一个API,通过这个API,可以写一个Python脚本进行安装/卸载应用,运行应用,发送模拟击键,截取用户界面图片等操作。monkeyrunner主要应用在Android压力测试上。运行该工具可以随机地向被测应用程序发送各种模拟键盘事件流,并且可以自定义发送次数,以此观察被测应用程序的稳定性和可靠性。MonkeyRobotium是对Android Instrumentation的封装,方便于测试人员直接调用封装好的接口。它的主要特点是:黑白通吃、支持多Activity的交互、支持多种控件。RobotiumAndroid整合了JUnit测试框架和Instrumentation机制,它扩展了JUnit的TestCase类来提供给Android Activity功能测试。Android Instrumentation由淘宝的QA团队开发一个开源的自动化测试框架,主要思想就是通过反射机制调用Android框架层的API拿到当前Activity的所有View,对获得的View通过Instrumentation封装一些常用的操作。TMTS(Taobao Mobile Test Studio)
  • 15. CTS(Compatibility Test Suit)14of41所有手持设备都必须通过Android兼容性测试,才能确保在Android上开发的应用程序能够在Android设备上运行,才能使用Android Market。 要使用CTS进行兼容性测试,就必须先下载和编译CTS,CTS源码下载地址为git://android.git.kernel.org/platform/cts.git,然后可以使用如下命令来编译CTS://配置选项 $ build/envsetup.sh //编译CTS $ make cts
  • 16. CTS(Compatibility Test Suit)15of41
  • 17. CTS(Compatibility Test Suit)16of41编译完成之后,启动模拟器或手机设备(需要用root权限来操作),并进入CTS的bin目录下,输入“./cts”命令来启动CTS测试,会显示CTS测试版本和设备连接状态。 可以输入“help”命令查看CTS的操作帮助信息。 如果输入“ls --plan”命令可以查看所有的plan,有8个测试基类,比如Android.xml、AppSecurity.xml、CTS.xml等。其中所有基类里包含的package都给出了相应的uri,CTS根据这些uri去测试每个基类里的package,可以输入如下一些命令来测试某些package:
  • 18. CTS(Compatibility Test Suit)17of41//测试所有CTS测试用例 cts_host > start –plan CTS //测试Android API cts_host > start –plan Android //测试Java核心库 cts_host > start –plan Java当测试结束后,可以通过“ls -r”命令来查看测试的结果(CTS测试结果路径cts/android-cts/repository/results)。 如果觉得现有的测试用例不够完整,也可以根据现有的测试用例来添加自己编写的测试用例,但需要注意每次添加或修改CTS任何模块都需要重新编译才能进行测试。
  • 19. Monkey18of41Monkey本身非常简单,就是模拟用户的按键输入、触摸屏输入、手势输入等,看手机多长时间会出异常。可以设置让Monkey只测试某个应用,从而辅助应用程序的开发。 Monkey是一个命令行工具,可以运行在模拟器或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。
  • 20. Monkey命令分类19of41基本配置选项,如设置尝试的事件数量。 运行约束选项,如设置只对单独的一个包进行测试。 事件类型和频率。 调试选项。
  • 21. Monkey20of41在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理: 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其他包的操作,并对其进行阻止。 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。 如果应用程序产生了应用程序不响应的错误,Monkey将会停止并报错。
  • 22. Monkey基本用法21of41由于Monkey运行在模拟器/手机设备环境中,所以必须用其环境中的shell。基本语法如下:$adb shell monkey [options]如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。$adb shell monkey –p your.package.name –v 500
  • 23. Android Instrumentation工作原理22of41Instrumentation机制是一种操作系统和应用程序之间的监控机制。 它在应用程序运行前初始化,与应用程序运行在同一进程中监听应用程序与系统之间的交互,并对应用程序进行一定的控制。例如可以监控Activity在生命周期中的各个状态,向Activity发送点击事件等。
  • 24. Instrumentation类的函数23of41添加、删除ActivityMonitor Application、Activity的创建与生命周期的控制 控制Instrumentation的运行 发送按键等事件消息到当前窗口 同步方面的操作
  • 25. Android 测试环境24of41
  • 26. Android中主要测试API25of41
  • 27. Android中主要测试API26of41类说明AndroidTestCase如果要访问资源或其他东西依赖于Activity的环境,在这个类基础上扩展ActivityInstrumentationTestCase2这个类提供了一个单一的活动功能测试ApplicationTestCase提供了一个框架,可以在受控环境中测试ApplicationProviderTestCase2提供了一个框架,可以再受控环境中测试ContentProvider类ServiceTestCase提供了一个框架,可以在受控环境中测试Service类。
  • 28. 使用Instrumentation的简单例子27of41点击按钮前点击按钮后
  • 29. 使用Instrumentation的简单例子28of41
  • 30. 使用Instrumentation的简单例子29of41
  • 31. monkeyrunner的测试类型多设备控制。monkeyrunner可以同时接上所有的设备或一次启动全部模拟器,然后运行一个或多个测试。 功能测试。测试人员提供按键或触摸事件的输入值,然后观察输出结果的截屏。 回归测试。monkeyrunner可以将结果截屏和已知正确的结果截屏相比较。 可扩展的自动化。基于Python开发一套测试来控制设备或模拟器。30of41
  • 32. monkeyrunner API这个类提供了用户连接monkeyrunner和设备或模拟器的方法。31of41MonkeyRunnerMonkeyDeviceMonkeyImage这个类为截图,将位图转换成各种格式,对比两个MonkeyImage对象,将图片保存到文件等提供了方法。这个类为安装/卸载包,开启Activity,发送按键和触摸事件,运行测试包等提供了方法。
  • 33. monkeyrunner 实例32of41#导入要使用到的monkeyrunner的API from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage #与现有设备或模拟器连接,返回一个MonkeyDevice对象 device = MonkeyRunner.wait.ForConnection() #安装被测应用程序,该方法返回一个布尔变量以说明安装成功与否 device.installPackage(‘./ApiDemos.apk’) #运行Activity组件 device.startActivity(component = ‘com.example.android.apis/.ApiDemos’) #截取用户界面 result = device.takeSnapshot() #保存用户界面图片 result.writeToFile(‘./shotbegin.png’) #执行5次向下按键操作 device.press(‘KEYCODE_DPAD_DOWN’, ‘DOWN_AND_UP’) device.press(‘KEYCODE_DPAD_DOWN’, ‘DOWN_AND_UP’) device.press(‘KEYCODE_DPAD_DOWN’, ‘DOWN_AND_UP’) device.press(‘KEYCODE_DPAD_DOWN’, ‘DOWN_AND_UP’) device.press(‘KEYCODE_DPAD_DOWN’, ‘DOWN_AND_UP’) result = device.takeSnapshot() result.writeToFile(‘./shotend.png’)
  • 34. monkeyrunner 实例33of41编写好测试脚本后,启动模拟器,执行monkeyrunner命令。 在运行过程中可以看到光标不断向下移动,并且可以在当前目录下找到自定义的截图:
  • 35. monkeyrunner 实例34of41shotbegin.pngshotend.png
  • 36. TMTS35of41定位:无线自动化测试框架 核心:基于Android Instrumentation机制 特点: -发布版测试 -支持WebView -持续集成 -开源 -不更改被测应用 -测试预先装好的apk -出错截屏
  • 37. TMTS系统架构36of41
  • 38. 使用TMTS系统执行自动化测试的流程37of41服务器端PC端运行测试测试结果收集手机设备端启动、执行测试脚本生成详细xml日志生成最终测试报告并归档定时检查新版本程序新版本?无有生成测试apk和被测apk自动安装部署到特定的手机设备端
  • 39. 测试报告和截图38of41
  • 40. TmtsFramework39of41Finder: 返回TmtsView对象 -静态方法 T findTmtsViewById(String, Class) TextView findTmtsTextViewByText(String) TmtsToast findTmtsToast() -实例方法 T findTmtsViewById(String, Class) T getChildByIndex(int, Class)
  • 41. TmtsFramework40of41View: 定义操作 -基类,TmtsView doClick() doLongClick() requestFocus() -TmtsTextView setText(String) String getText() -TmtsToast String getText() -TmtsAbsListView T getChildByIndex(int, Class) scrollToLine(int) -TmtsWebView excuteJs(String) String excuteJsAndReturn(String)
  • 42. THANK YOU41of4141