最近看了看Android的自动化测试,收集了不少资料。自动化测试可理解为测试过程自动化和测试结果分析自动化。

Android下自动化测试的方法与工具有Android自带的Monkey,有第三方开发的Robotium,还有TMTS(Taobao Mobile Test Studio)框架等。下面一一介绍。


一、Monkey工具

Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

The Monkey is a program that runs on youremulatoror device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.(官方介绍)

http://developer.android.com/tools/help/monkey.html


Monkey的特征:

1、测试的对象仅为应用程序包,有一定的局限性。
2、 Monky测试使用的事件流数据流是随机的,不能进行自定义。
3、可对MonkeyTest的对象,事件数量,类型,频率等进行设置。


Monkey的基本用法:

基本语法如下:
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
$ adb shell monkey -p your.package.name -v 500


Monkey的测试步骤:

1、通过eclipse启动一个Android的emulator

2、在cmd命令行中输入:adb devices查看设备连接情况

3、在有设备连接的前提下,在命令行中输入:adb shell进入shell界面

4、查看data/data(输入ls data/data)文件夹下的应用程序包。注:我们能测试的应用程序包都在这个目录下面

5、如以com.android.calculator2作为对象进行MonkeyTest

则命令行输入:#monkey-p com.android.calculator2 -v 500

Android开发----自动化测试_第1张图片

Android开发----自动化测试_第2张图片

可以看到,屏幕的输入、点击等事件都是随机的。Monkey主要用来进行压力测试。


二、Robotium测试工具


Robotium工具,可以在有app源码或apk的情况下进行自动化黑盒测试

Robotium是一个基于Android应用程序的自动化黑盒测试工具。它简化了测试用例的编写,并且能够编写出功能强大,健壮性很强的黑盒测试用例。运用Robotium,测试人员能够编写测试用例,系统测试,验收测试方案等。同时Robotium还能够跨越多个Android的Activity,进行测试。

Robotium对Activity,Dialog,Toast,Menu都是支持的。

Robotium是开源的:http://code.google.com/p/robotium/downloads/list

测试Robotium可以下载官方的例子ExampleTestProject_v4.2.zip

Android开发----自动化测试_第3张图片

直接导入zip文件,里面有两个工程NotePadNotePadTest,右键点击NotePadTest文件,run as Android JunitTest即可。

Android开发----自动化测试_第4张图片


运行结果

Android开发----自动化测试_第5张图片

可以看到,模拟器按照预先在NotePadTest项目中写好的流程进行自动操作,当测试全部成功时,绿条变满。

关于Robotium测试的具体用法,和Junit有很多相似之处。详细的可参照robotium-solo-4.2-javadoc.jar中的帮助文档以及上面的例子来写。


下面给出NotePadTest例子,带注释。

public class NotePadTest extends ActivityInstrumentationTestCase2<NotesList>{private Solo solo;//测试主类public NotePadTest() {super(NotesList.class);//指定要测试的类}//启动@Overridepublic void setUp() throws Exception {//setUp() is run before a test case is started. //This is where the solo object is created.solo = new Solo(getInstrumentation(), getActivity());}//结束@Overridepublic void tearDown() throws Exception {//tearDown() is run after a test case has finished. //finishOpenedActivities() will finish all the activities that have been opened during the test execution.solo.finishOpenedActivities();}//测试用例: 添加笔记public void testAddNote() throws Exception {solo.clickOnMenuItem("Add note");//Assert that NoteEditor activity is openedsolo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); //In text field 0, enter Note 1solo.enterText(0, "Note 1");solo.goBack(); //Clicks on menu itemsolo.clickOnMenuItem("Add note");//In text field 0, type Note 2solo.typeText(0, "Note 2");//Go back to first activitysolo.goBack(); //Takes a screenshot and saves it in "/sdcard/Robotium-Screenshots/".solo.takeScreenshot();boolean expected = true;boolean actual = solo.searchText("Note 1") && solo.searchText("Note 2");//Assert that Note 1 & Note 2 are foundassertEquals("Note 1 and/or Note 2 are not found", expected, actual); }//测试用例: 编辑笔记public void testEditNote() throws Exception {// Click on the second list linesolo.clickInList(2); //Hides the soft keyboardsolo.hideSoftKeyboard();// Change orientation of activitysolo.setActivityOrientation(Solo.LANDSCAPE);// Change titlesolo.clickOnMenuItem("Edit title");//In first text field (0), add testsolo.enterText(0, " test");  solo.goBack();boolean expected = true;// (Regexp) case insensitiveboolean actual = solo.waitForText("(?i).*?note 1 test"); //Assert that Note 1 test is foundassertEquals("Note 1 test is not found", expected, actual); }//测试用例: 移除笔记public void testRemoveNote() throws Exception {//(Regexp) case insensitive/text that contains "test"solo.clickOnText("(?i).*?test.*");//Delete Note 1 testsolo.clickOnMenuItem("Delete");//Note 1 test & Note 2 should not be foundboolean expected = false;   boolean actual = solo.searchText("Note 1 test");//Assert that Note 1 test is not foundassertEquals("Note 1 Test is found", expected, actual);  solo.clickLongOnText("Note 2");//Clicks on Delete in the context menusolo.clickOnText("Delete");  //Will wait 100 milliseconds for the text: "Note 2"actual = solo.waitForText("Note 2", 1, 100);//Assert that Note 2 is not foundassertEquals("Note 2 is found", expected, actual);  }}

更多资料:http://blog.51cto.com/zt/301


三、TMTS(Taobao Mobile Test Studio)测试框架


Robotium目前的缺点也很明显,无法对WebView进行操作,这对大量使用WebView的淘宝Android客户端来说无疑是很大的限制。

而且Robotium提供的API是面向过程的,测试代码的可扩展性差。

我们需要一个面向对象的,可对WebView进行操作的自动化测试框架,这就催生了TMTS(Taobao Mobile Test Studio)框架。

TMTS立项时还试图着重解决另一个问题,就是Instrumentation框架下testapp和app运行在一个进程中 ,app crash会导致testapp一并crash。


相关文章: http://www.taobaotesting.com/blogs

源码:http://code.taobao.org/p/TMTS/src/


原创文章,转载请注明出处:http://blog.csdn.net/xn4545945


更多相关文章

  1. android 事件流转机制
  2. 【android基础】之Android返回键处理(事件)
  3. Android自动化测试之如何安装Android虚拟机(三)
  4. Android测试驱动开发实践1
  5. Afinal框架(简介)
  6. Android知识简单测试题
  7. Android事件分发
  8. Android GWES 基本框架篇

随机推荐

  1. Android 自定义像素AVD模拟器无键盘
  2. android 点击分享内容中的连接地址在应用
  3. Android WebView 实例
  4. Android根据文件路径加载指定文件
  5. android studio打包apk
  6. 命令获取 Eclipse Android 证书指纹 MD5
  7. Android 技术提升总结(持续更新)
  8. 转:Android中几种图像特效处理方法小结
  9. Android 主线程子线程执行关系
  10. 剪切图片-扩展android 选择图片(从手机照