这篇文章讲述如何在带有ADT插件的eclipse中新建和运行android 应用测试。在阅读 本文前,你应该知道如何经过基本步骤利用ADT插件创建和运行android应用程序,这在Managing
Projects fromEclipse和Building and Runningfrom Eclipse中有描述。你也许需要阅读一下Building
and Runningfrom Eclipse,它提供了android测试的概述。
ADT插件提供了如下几个特性来帮助你快速的搭建和管理测试环境:
1、它可以快速地创建一个测试工程并且链接到被测试应用,当它创建测试工程时,它会自动在测试包的manifest文件中插入需要的<instrumentation>元素。
2、它可以让你轻松地导入被测试应用的类,这样你的测试项可以检查它们。
3、你可以用它来为测试包创建运行参数,并且把它们放入到被传入到android测试框架的flag中。
4、它可以让你在不离开eclipse的环境下运行测试包,ADT会自动编译被测试包和测试包,将它们安装到设备或者模拟器上,运行测试包,在eclipse的一个单独窗口中显示测试结果。
如果你不是在eclipse中开发或者你想学习一下如何通过命令行工具来创建和运行测试,可以参见Testing
from Other IDEs。
新建一个测试工程
要为你的android应用程序设定测试环境,你必须先新建一个单独的工程来管理测试代码。这个新工程一样遵循一般的android应用的目录结构,它包含同样的内容和文件,比如源代码、资源文件、一个manifest文件以及其它。这个新建的测试包通过manifest文件中的<instrumentation>元素链接到被测试应用。
“新建一个android测试工程”的对话框让你很轻松地生成一个目录结构清晰的测试工程,它的manifest文件中已经包含了<instrumentation>元素。你随时可以用这个“新建一个android测试工程”的对话框来新建一个测试工程。这个对话框会在你新建一个android应用程序后出现,但是你也可以运行它来为之前创建的一个工程新建一个测试工程。
要在eclipse中创建一个测试工程:
1. 在eclipse中,选择File>New>Other,将会出现一个“选择一个向导”的对话框。
2. 在对话框中的“向导”列表中,找到“android”,点击左边的切换按钮,选择“android测试工程”,然后点击对话框底部的“下一步”,“新建一个android测试工程”的向导就出现了。
3. 在“测试工程名称”旁边输入工程名,你可以使用任意名称,但是你应该会希望将名称和被测试应用的工程名称相关联,一个好办法是在被测试工程的名称后面加上字符串“Test”,然后将它作为测试工程的名称。
4. 在“内容”部分,检查给你推荐的工程路径。如果“使用默认位置”处于选中,向导会将工作区路径和你输入的工程名连接起来作为建议路径。例如,如果你的工作区路径是/usr/local/workspace,你的工程名是MyTestApp,那么向导会推荐/usr/local/workspace/MyTestApp。要输入你希望的路径,取消选中“使用默认路径”,然后输入或者浏览你期望的工程目录。
要了解更多关于测试工程的路径选择,可以参加 Testing Fundamentals。
5. 在“测试目标”部分,选中“已存在项目”,然后在列表中选择android应用。你可以看到现在向导已经为你完成了测试目标、应用名称以及包名(后面两个都在属性面板中)。
6. 在“编译目标”面板中,选择被测试应用使用的android SDK
版本。
7. 点击“完成”完成向导。如果“完成”不可点击,查看向导顶部的错误信息并且修复。
新建一个测试包
创建一个测试工程后,你需要用到测试包。这个包不需要Activity,当然如果愿意你也可以定义
一下。尽管你的测试包整合了Activity类、test case 类以及其它类,你的主要的test case应该继承自一个android
test case 类或者JUnit类,因为是它们提供测试特性。
测试包不需要有GUI,当你在eclipse中运行测试包时,结果会显示在JUnit视图中,在Running
Tests部分更详细地描述了运行测试和查看结果。
要新建一个测试包,从android.test中的某个android test
case类开始,这些类继承了JUnit TestCase类,android中测试Activity的类为测试Activity提供了instrumentation。要了解更多test
case 类,参见 Testing Fundamentals。
在你新建测试包前,你应该为你使用的test case类选择一个包名以及android
包名。要了解更多,可以参见 Testing Fundamentals。
要在工程中添加一个test case类:
1. 在“工程浏览器”标签页,打开你的测试工程并且打开src文件夹。
2. 找到新建工程向导设定的java 包名,如果你还没有添加类,该包名下会没有内容,而且它的icon是没有填充的。如果你想修改包名,右击包名并且选择
Refactor > Rename,然后输入新的包名。
3. 完成之后,重新右击包名并且选择New > Class,将会出现一个“新建Java
类"的对话框,其中的"source folder"和”package"都已经设置好了。
4. 在“名称”区域,为test case类输入一个名称。一个设定类名的方法是在你测试的组件类的后面加上"Test"。例如,如果你在测试MyAppActivity类,你的test
case类名则为MyAppActivityTest。test case类的修饰符设定为public。
5. 在“父类”栏,输入你所继承的android test case 类的名字,你也可以浏览可用类。
6.在“Which method stubs would you like
to create?”栏,取消所有的可选项,然后点击“结束”,你将要手动设定构造方法。
7. 你的新类将出现在一个新的java编辑面板中。
你现在应该确保构造函数被正确地设定,为你的类新建一个无参构造函数,JUnit需要它。在构造函数的第一条语句中调用父类的构造方法。每个
test case 父类都有它自己的构造函数签名,查阅android.test中类的文档来获取更多信息。
为了控制测试环境,你需要覆写setUp()和tearDown()方法:
1、setUp():该方法会在类中的每一个测试方法执行前调用。它可以用来初始化测试环境,你可以在setUp()中实例化一个action为ACTION_MAIN的Intent,然后在测试中使用这个Intent启动Activity。
2、tearDown():该方法会在类中 的每一个测试方法执行后调用。你可以用它来执行垃圾回收以及重置测试环境。
另一个很有用的做法是在你的测试类中添加testPreconditions()方法,用这个方法来检验被测试包是否正确初始化。如果该测试项失败,那么初始测试环境有问题,如果是这样,那么后面的测试结果都值得怀疑,不管测试是否成功。
教程Activity Testing中包含更多关于创建测试类和方法的信息。
运行测试
当你在装有ADT插件的eclipse中运行一个测试包的时候,输出将会出现在eclipse的JUnit视图中。你可以运行整个测试包或者其中给一个test
case类。eclipse是通过执行adb命令来运行一个测试包并且显示输出,所以,在eclipse中运行测试和从命令行中运行测试没有区别。
就像其它应用包,要在eclipse中运行一个测试包你必须连接一台设备到你的电脑或者使用模拟器,如果你使用模拟器,你必须有一个和测试包有相同API版本的android虚拟设备。
要在eclipse中执行测试,你有两种办法:
1、像运行一个应用一样运行测试。选择工程右键菜单或者主菜单"Run"栏中的“Run
as" > "Android JUnit Test"。
2、为测试工程新建一个运行参数。这在有多套测试,每套测试包含工程中选中的测试项时非常有用,执行运行参数就可以运行整套测试。
要用运行参数来创建和运行一整套测试:
1. 在包浏览器中,选择测试工程,然后在主菜单中选择“Run” >
"Run Configurations",弹出“运行参数”对话框。
2. 在昨天窗格中找到"android JUnit Test",在右边窗格中点击"Test”栏,文本框"Name:"显示工程名称,下拉框“Test
class:"显示项目中的一个测试类。
3. 要运行一个单独的测试类,选中"Run a single
test",然后在文本框"Project:"中输入项目名,在文本框"Test
class"中输入类名;要运行所有的测试类,选中"Run all tests in
the selected project, or package",然后在文本框中输入项目名或者包名。
4. 点击"Target"栏,如果你正在使用模拟器,那么选择"automatic",然后在android虚拟设备表中选择一个现有的AVD,在模拟器启动参数面板设定你想使用的android模拟器flag,这些在
Android Emulator中详细描述。
5. 点击"common"栏,在"Save
as"部分,选择"Local file"以保存仅供自己使用的运行参数,或者选择"Shared
file"保存到其它项目中。
6. 将运行参数添加到"Run"工具栏和"Favorites"菜单:在"Display
in favorites menu"面板"Run"旁边的复选框。
7. 要添加运行参数到"Debug"菜单和工具栏中,选中"Debug"旁边的复选框。
8. 要保存你的设置,点击"Close"就可以。注意:尽管你可以点击"Run"立即运行测试,你应该先保存测试参数然后从eclipse的工具栏中选择并运行。
9. 在eclipse的工具栏中,点击绿色"Run"箭头旁边的下拉箭头将会显示已经保存的运行参数和调试参数列表。
10. 选择你之前建立的运行参数,测试就会开始。
测试的工程会在控制台中以消息的形式出现,每条消息前面都带有时间以及它对应的.apk文件名。例如,在你通过模拟器运行一项测试,而模拟器尚未启动时下面这条消息会出现:
[yyyy-mm-dd hh:mm:ss - testfile] Waiting for HOME ('android.process.acore') to be launched...
|
在下面关于消息的描述中,"devicename"是你正在用来测试的设备或者模拟器的名称,"port"是设备的端口号。"devicename"和"port"都是使用的adb
devices命令所使用的格式。同样的,"testfile"是正在测试的测试包的.apk文件名,"appfile"是被测试应用的文件名。
如果你正在使用模拟器并且还没有启动它,那么eclipse会先启动模拟器,之后你会看到下面的消息:
HOME is up on device 'devicename-port'
|
如果你还没有安装测试包,你会看到下面的消息:
Uploading testfile onto device 'devicename-port'
|
然后是消息:
最后是消息:
下面是这个消息列的一个例子:
[2010-07-01 12:44:49 - MyTest] Project dependency found, installing: MyApp
[2010-07-01 12:44:49 - MyApp] Uploading MyApp.apk onto device 'emulator-5554'
[2010-07-01 12:44:49 - MyApp] Installing MyApp.apk...
[2010-07-01 12:44:54 - MyApp] Success!
|
接下来你会看到消息:
Launching instrumentation instrumentation_class on device devicename-port
|
instrumentation_class是你指定的instrumentation
test runner的全名,通常是InstrumentationTestRunner。接下来InstrumentationTestRunner编译需要执行的测试,你会看到消息:
Collecting test information
|
之后是
Sending test information to Eclipse
|
最后你会看到消息
表明测试正在运行,此时你应该开始在JUnit视图中查看测试结果。当测试结束时,你将会看到消息
表明测试已经结束。下面是这个消息列的一个例子:
[2010-01-01 12:45:02 - MyTest] Launching instrumentation android.test.InstrumentationTestRunner on device emulator-5554
[2010-01-01 12:45:02 - MyTest] Collecting test information
[2010-01-01 12:45:02 - MyTest] Sending test information to Eclipse
[2010-01-01 12:45:02 - MyTest] Running tests...
[2010-01-01 12:45:22 - MyTest] Test run complete
|
测试结果显示在JUnit视图中,它被分为上面的一个描述概要的窗格和下面的一个跟踪堆栈信息的窗格。
上面的窗格包含测试信息,在窗格的顶部可以看到下列信息:
1、测试运行的总时间(写作“XXX秒后结束”)。
2、测试项的数量(Runs):整个测试类中的测试项数目。
3、错误的数量(Errors):测试过程中程序错误和发生异常的数量。
4、失败的数量(Failures):测试过程中测试失败的次数,这是断言失败的次数,测试项可以在程序不发生任何错误的情况下失败。
5、一个进度条:进度条会在测试运行过程中从左向右增长,如果所有测试成功,进度条保持绿色,如果有一项测试失败,进度条就由绿色变为红色。
上面窗格的窗体包含测试运行的详情,对于每一个运行的test case类,你都可以看到带有该类名称的行,要查看该类中单个的测试方法的测试结果,你可以点击左边的箭头来展开这一行,你现在可以看到类中的每个测试方法以及它运行的时间。双击一个测试方法,eclipse会在编辑器窗格中打开测试类的代码并且将焦点移到测试方法的第一行。
测试成功的结果如下图所示:
下面的窗格是跟踪堆栈信息的,如果你选中上面窗格中失败的测试方法,下面的窗格中会显示该测试的堆栈跟踪信息,如果其中有一行指向你代码中的地方,你可以双击它以在编辑器视窗中显示代码,同时代码行会高亮显示。如果测试是成功的,下面的窗格将会是空的。
下面是测试结果为失败时的显示:
|