Testing from Eclipse with ADT 翻译
本文介绍如何在 Eclipse ADT 中创建并运行 Android 应用测试程序。在阅读本文之前,你应该先看 Managing Projects from Eclipse 和 Building and Running from Eclipse 章节,这些章节是关于如何创建一个 Android 应用的,并提供了一些通过 ADT 创建和运行一个应用程序的基本流程。你也可能想先看看 Testing Funamentals 章节,它提供了对 Android 测试框架的一个总览。
ADT 具有一下特性,这些特性有利于我们有效的设置、管理我们的测试环境:
- 可以快速创建一个测试工程并关联到待测程序。在创建测试工程时会自动在待测工程的 manifest 文件插入所需的 <instrumentation> 元素。
- 快速导入待测应用的类,这样测试程序就可以测试它们了。
- 测试程序的运行时可配置的,包括要传给 Android 测试框架的标志(flags)。
- 不必脱离 Eclipse 就可以运行测试程序。ADT 自动 build 测试程序和待测程序,根据需要把它们安装到你的设备或者模拟器上,并且在 Eclipse 一个独立的窗口中显示结果。
如果你不是在 Eclipse 中做开发,或者你想学一下如果通过命令行来创建、运行测试程序,那么轻参考 Testing from Other IDEs。
Creating a Test Project
要为 Android 应用程序设置一个测试环境,首先必须创建一个独立的工程来控制测试代码。新的工程要遵循普通 Android 应用的目录结构。该工程含有(同普通 Android 工程)相同类型的内容和文件,比如源代码文件、资源文件,还有一个 manifest 文件,等等……。你所创建的测试工程通过它的 manifest 文件中的 <instrumentation> 标签关联到它的待测应用程序。
通过 “New Android Test Project” 对话框可以很容易地创建一个新的测试工程,并且这个工程会拥有一个合适的结构,manifest 文件中也会包含 <instrumentation> 标签。任何时候你都可以用该对话框创建测试工程。该对话框只有在你创建一个新的 Android 主应用程序工程后才会出现,但是你也可以用它来为之前已经创建的工程创建测试工程。
用 Eclipse ADT 创建一个测试工程:
在 Eclipse 中,选择 File > New > Other。这样就打开了对向导对话框。
在该对话框中的下拉列表向导中找到 Android,然后点击左边的 toggle 按钮。然后选择 Android Test Project,然后点击对话框底部的 Next。New Android Test Project 向导就打开了。
到了 Test Project Name,输入一个工程名字。尽管可以取任意的名字,但是你可能想把这个名字和待测应用程序的名字联系起来。一个简单的办法是把待测应用的工程名字加一个 “Test” 做为测试工程的名字。这样这个名字就会成为推荐项目路径的一部分,没关系,在下一步你可以修改它。
检查 content 面板中工程的推荐路径。如果选中了 Use default location 那么向导就会把 workspath 和你输入的工程名字串起来作为工程的推荐路径。例如,如果你的 workspace 是 /usr/local/workspace,工程名字是 MyTestApp,那么向导就会推荐 /usr/local/workspace/MyTestApp。要自己选择一个路径,就要去掉 Use default location 的选择,然后输入或者选择一个想要的工程路径。要详细了解关于工程位置的问题,请查看 Testing Fundamentals。
在测试目标面板,可以设置一个已存在的 Android 工程作为待测工程,点击 Browse,然后从列表中选择一个 Android 应用。现在向导已经完成了 Test Target Package,Application Name,和 Package Name fields(后两项在属性面板中)。
在 Build Target 面板选择待测应用用的 Android SDK。
点击 Finish 结束向导。如果 Finish 按钮是 disabled,请查看向导对话框顶部的错误信息,fix 所有问题。
Creating a Test Package
创建一个测试工程后还需要创建一个测试包。这个测试包不需要 Activity,但是如果你愿意也可以定义一个。虽然你的测试包里可以有 Activity 类,test case 类或者普通类,但是你的主要 test case 应该继承自一个 Android test case 类或者 JUnit 类,因为这些类提供了最好的测试功能。
测试包不需要 Android GUI。当在 Eclipse ADT 中运行这个测试包时,它的结果显示在 JUnit 视图中。如何运行测试以及查看结果,在 Running Tests 部分有详细描述
要创建测试包,要先了解一个 Android 的 test case 类,它们定义在 一个定义在 android.test 包中。这些类继承自 JUnit TestCase 类。并且,为了对 Activity 进行测试,针对测试 Activity 对象的类还提供了 instrumentation。关于 test case 类的更详细信息请参考 Testing Fundamentals。
在创建测试包之前,要先为测试类选定一个 Java 包标识符,还有 Android 包名。更多详情请参考 Testing Fundamentals。
在工程中新增一个 test case 类:
- 在 Project Explorer 面板中打开测试工程,然后打开 src 目录。
- 找到向导创建的 Java 包标识符。如果里面还没有加入类文件,该节点就没有子节点,那么它就显示一个没有被填充的图标。如果你想修改该标识符,就右键点击它,选择 Refactor > Rename,然后输入新的名字。
- 好了,再次用右键点击这个 Java 包标识符,选择 New > Class。这样就会显示 New Java Class 对话框,并且相应 Source Folder 和 Package 已经设置好了。
- 在名字输入框中输入 test case 类的名字,方法之一就是把待测组件的类名再加上一个 “Test”,例如,如果你要对 MyActivity 进行测试,那么 test case 的类名应该是 MyActivityTest。保留 pulibc 修饰符。
- 在 Superclass 输入框中输入你要继承的 Android test case 类的名字。也可以在可用的类中找一个。
- 取消 Which method stubs would you like to create? 中的所有选项,然后点击 Finish。你要手动设置构造函数。
- 在编辑面板就可以看到新建的类了。
-
现在必须确保构造函数设置是正确的。JUnit 要求为 test case 类创建一个没有参数的构造函数。构造函数的第一句话要调用基类的构造函数。每个 test case 基类都有一个构造函数签名,更多详情请参考 android.test 文档中的类文档。
我们需要通过覆写 setUp() 和 tearDown 函数来控制测试环境:
- setUp():在类文件中,该函数会在调用任何测试函数之前被调用。我们用这个函数来设置测试环境(the test fixture)。你可以在 setUp() 中实例化一个 Intent 对象,把 action 设置为 ACTION_MAIN,然后用这个 Intent 启动待测 Activity。
- tearDown():在类中的所有的测试函数被调用后就会调用该函数。在这个函数里面我们可以进行垃圾回收和重置测试环境。
另一个有用的做法是在测试类中添加 testPreconditions() 函数。用这个函数来测试待测应用是否正确初始化。过这个测试失败了,那么就是初始化环境出错。如果是这样,那么不管测试成功与否,进一步的测试都不可信。
Activity Testing 教程对如何创建 test case 类和测试函数有更详细的阐述。
Running Tests
当你在 Eclipse ADT 中运行测试包,输出就显示在 Eclipse JUnit 视图中。既可以运行整个测试包,也可以运行一个 test case 类。运行测试的时候,是 Eclipse 调用 adb 命令,然后 adb 命令运行测试包,并显示输出结果,所以在 Eclipse 中运行测试和通过命令行运行没什么区别。
和其它应用一样,在 Eclipse ADT 中运行测试电脑必须连接一台设备或者用一个 Android 模拟器。如果用模拟器,必须用和待测包用同样 API 的虚拟设备(AVD)。
在 Eclipse 中运行测试有两种方式:
- 像运行普通应用一样,从工程的上下文菜单中选择 Run As… > Android JUnit Test,或者点击主菜单上的 Run 菜单项。
- 针对测试包创建一个 Eclipse 运行配置。这对于你想把测试分为多组的情况很有用,每组都由从测试工程中选出的测试组成。运行测试配置,就可以运行一组测试。
下一部分讲解如何创建、运行测试配置。
通过运行测试配置来运行一组测试:
- 在 Package Explorer 视图中选中测试工程,然后选择主菜单中的 Run > Run Configurations…弹出 Run Configurations 对话框。
- 在左边的面板中找到 Android JUnit Test。在右边的面板中点击 Test 标签。”Project:”文本框显示工程名字。“Test class”下拉框显示测试工程中的一个测试类。
- 如果只运行一个测试类,就选中 Run a single test,然后在 “Project:”文本框中输入工程的名字,在“Test class”下拉框中选择类名。
- 如果要运行所有的测试类,就选中 Run all tests in the selected project, or package,然后在文本框内输入工程名或者包名。
- 设置 Target 标签。
- 可选:如果用模拟器,就选择 Automatic,然后在 Android Virtual Device(AVD)选择表中选择一个存在的 AVD。
- 在 Emulator Lanuch Parameters 面板中设置要使用的 Android 模拟器标记。详细信息请参考 Android Emulator。
- 点击 Common 标签。在 Save As 面板中,如果要把该配置保存到本地请选择 Locally (应用于当前工程),如果应用于其它工程请选择 Shared。
- 可选:把配置加到运行工具栏和 Favorites 菜单中:在 Display in Favorites 面板中选中 Run 前面的 checkbox。
- 可选:把配置加到测试菜单和工具栏中:选择 Debug 旁边的 checkbox。
- 点击 Close 保存配置。注意:虽然你现在就可以直接点 Run 运行测试,但是最好先保存配置,然后通过点击 Eclipse 工具栏来运行。
- 点击 Eclipse 工具栏中绿色 Run 按钮旁边的向下箭头,就会显示一个运行&测试配置菜单。
- 选择刚刚创建的配置启动测试。
控制台会显示一系列消息来展示测试运行的工程。每个消息都以一个时间戳和一个文件名开头,文件名表示该消息的来源。例如,当在一个没有完全启动的模拟器中运行测试时就会显示下面的消息:
[yyyy-mm-dd hh:mm:ss - testfile] Waiting for HOME ('android.process.acore') to be launched...
接下来,在对这些消息的描述中,devicename 是指运行测试的设备或者模拟器的名字,prot 是指设备的端口号,devicename 和 port 都是 adb devices 命令格式中用到的。testfile 是指正在运行测试工程的 apk 文件名,appfile 是待测工程的文件名。
- 如果在模拟器中运行测试,并且模拟器还没有启动,那么 Eclipse 首先会启动模拟器。启动完成后就会显示下面的信息:
HOME is up on device 'devicename-port'
- 如果还没有安装测试包,接下来就会显示:
Uploading testfile onto device 'devicename-port'
Installing testfile
.Success!
下面几行是一个示例的信息:
[2010-07-01 12:44:40 - MyTest] HOME is up on device 'emulator-5554'
[2010-07-01 12:44:40 - MyTest] Uploading MyTest.apk onto device 'emulator-5554'
[2010-07-01 12:44:40 - MyTest] Installing MyTest.apk...
[2010-07-01 12:44:49 - MyTest] Success!
- 接下来的信息就是 Launching instrumentation instrumentation_class on device devicename-port
instrumentation_class 是指你指定的 instrumentation test runner 的完整类名,test runner 一般是 InstrumentationTestRunner。
- 接下来是 InstrumentationTestRunner 编译需要执行的一系列测试,你会看到:
Collecting test information
然后是
Sending test information to Eclipse
- 最后,你会看到 Running tests 信息,这包括你运行的所有测试。至此,你应该开始在 JUnit view 里面查看测试结果了。当测试结束时,你会在控制台看到 Test run complete 信息,这表示测试已经结束。
下面是一个示例测试的信息:
[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 视图中。分为上下两个窗口,顶部窗口显示摘要,底部窗口显示跟踪栈信息。
顶部窗口包含测试信息,在窗口的顶部会显示下面信息:
- 测试包使用的总时间(显示为:Finished after x seconds)
- 运行测试总数(Runs:)测试类中测试函数的个数
- 错误数(Errors:) 测试运行发生的程序错误&程序异常个数
- 失败个数(Failures:)测试失败的个数。这是断言失败的个数。就是没有错误发生,测试也可以是失败的。
- 一个进度条,当测试运行时这个进度条从左到右步进。如果所有测试都成功进度条就是绿色的,如果有一个测试失败进度条就会从绿色变为红色。
顶部窗体内部显示测试运行的详细信息。对每一个 test case 类都有一行显示它的类名。点击这一行左边的箭头展开可以查看该类中单个测试函数。现在你一查看该类中的每一个测试函数,右边它花费的时间。如果双击函数名,Eclipse 就会在编辑窗口打开测试类的源代码,并把焦点移到该函数的第一行。
图片1显示一个测试成功的结果
图片1
底部窗口显示了跟踪栈的信息。如果你在顶部窗口中选中一个失败的测试,底部窗口就会显示该测试的跟踪栈信息。如果双击一个和你的代码相对应的行,就会在编辑窗口高亮显示发生错误的代码。针对成功的测试底部窗口就是空的。
图片2显示了一个失败的测试。
图片2