2.6 测试执行
执行测试用例的方法有很多种,我们这里一个个地分析。
另外,我们在前面的章节中提到的注释,可以让测试用例按照组或者种类执行,这种方式要按实际需求来执行。
2.6.1 在Eclipse里执行所有的测试用例
如果你采用了Elicpse作为开发环境,从Eclipse中执行测试用例可能是最简便的方式了。这种方式会执行包中所有的用例。
选择测试工程,然后单击 Run As -> Andriod Junit Test。
如果没有找到合适的设备或者模拟器,那么会自动启动一个。然后,测试用例开始执行,最后执行的结果会在Eclipse中的DDMS中展示出来。这个窗口需要手工打开,如图2.6所示。
图2.6 Eclipse中DDMS展示测试用例的执行结果
从Eclipse DDMS窗口的LogCat视图中,你可以看到更加详尽的执行过程信息和结果,如图2.7所示。
图2.7 DDMS中的logCat视图
2.6.2 执行单个测试用例
你可以选择执行单个测试用例,在测试过程中经常会遇到这种需求。选择测试工程,然后单击 执行1——执行设置选项。
然后,创建一个新的测试配置,配置如表2.5所示。
表2.5 测试配置
当你像往常一样执行测试用例的时候,只有这个用例会被执行。这种情况下,我们只执行了一个用例,执行后的结果跟之前发的截屏类似。
在Eclipse编辑器中,还有另一种快捷方式可以执行单个用例。选中你的函数名,然后按Shift+Alt+XT组合键,或者右键,然后选择Run as-Junit Test。
2.6.3 在模拟器里执行用例
模拟器默认的系统里面安装了开发工具,提供一些手动工具和设置。在这些工具中,我们可以找到一个特别长的列表,如图2.8所示。
现在我们研究下设备,因为需要利用设备来执行测试用例。上述的应用列表展示了AndriodManifest.xml中instrumentation标签下定义的所有包。默认情况下,会展示默认设备的配置,也就是andriod.test.InstrumentationTestRunner里面的默认配置。在这个文件里,如果有两个以上的包配置,那么识别到底用哪套配置就成问题了。为了解决这个问题,你可以手工添加一个选项,在设备标签下,如图2.9所示。
图2.8 工具列表
一旦设置成功,设备配置列表将会重新展示,我们的包将会在新标签下面显示,在执行之前,选择好就可以了,如图2.10所示。
如果测试用例按照这种方式执行,那么你就可以通过LogCat来看执行结果。
图2.10 新标签
你可以看到,如果你不设置可选标签,那所有设备都会在默认的标签andriod.test.InstrumentationTestRunner下面展示出来,这点之前也提到过。
2.6.4 用命令行来执行测试用例
最后,我们还可以从命令行来执行测试用例。如果你想自动化或者用脚本来控制测试,命令行很有用。
我们用 am instrument 命令来执行测试用例(严格地说是 am 命令和instrument子命令),这个命令能够唤起设备、指定包名,还有其他功能选项。
你可能在想,am是什么?am是Activity Manager的缩写,它是Android系统内部的一个主要部件。在系统启动的时候,系统服务将会唤起这个行为管理器。行为管理器负责管理所有的行为以及行为的生命周期。另外,我们可以看到,它要负责行为设备的控制。
am instrument 命令行的一般用法如框2.2中所示。
框2.2 am instrument命令用法
am instrument [flags] < COMPONENT>
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e < NAME> < VALUE>: set argument < NAME> to < VALUE>
-p < FILE>: write profiling data to < FILE>
-w: wait for instrumentation to finish before returning
下面的表2.6中总结了最常用的选项。
表2.6 am命令常用选项
等待设备结束后退出。通常在命令行中使用,虽然不是一定要这样写,但是在手工执行时,如果不这样写,执行完用例后看不到测试结果
要触发am命令,我们使用adb shell命令或者你打开模拟器,你可以直接在shell命令窗口执行am命令。
2.6.5 执行所有测试用例
除了性能测试用例,下面的命令行将会执行所有的测试用例,如框2.3所示。
框2.3 测试用例执行结果
diego@bruce:\~$ adb shell am instrument -w com.example.aatg.
myfirstproject.test/android.test.InstrumentationTestRunner
com.example.aatg.myfirstproject.test.MyFirstProjectTests:
Failure in testSomething:
junit.framework.AssertionFailedError: Not implemented yet
at com.example.aatg.myfirstproject.test.MyFirstProjectTests.testSomethi
ng(MyFirstProjectTests.java:22)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRu
nner.java:430)
at android.app.Instrumentation$InstrumentationThread.
run(Instrumentation.java:1447)
Test results for InstrumentationTestRunner=.F
Time: 0.2
FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0
2.6.6 执行一个特殊测试用例文件中的所有用例
为了执行某个具体的测试文件中所有测试用例,你可以用下面的命令,如框2.4中所示。
框2.4 Shell命令:执行特殊用例文件的所有用例
diego@bruce:\~$ adb shell am instrument -w -e class com.example.aatg.
myfirstproject.test.MyFirstProjectTests com.example.aatg.myfirstproject.
test/android.test.InstrumentationTestRunner
2.6.7 通过用例名称来执行用例
另外,我们可以选择具体哪个测试用例要在命令行下执行,如框2.5中所示。
框2.5 Shell命令:执行单个用例**
diego@bruce:\~$ adb shell am instrument -w -e class com.example.aatg.
myfirstproject.test.MyFirstProjectTests\#testSomething com.example.aatg.
myfirstproject.test/android.test.InstrumentationTestRunner
这种方式只能执行不带参数的构造函数的测试文件,这就是我们需要在命令行上加测试方法名的原因。
2.6.8 按用例分类来执行用例
我们前面提到了,测试用例可以被分为不同的种类,利用注释(测试注释)来标明它属于哪个种类。在执行命令的时候,可以通过下面的选项来指定执行某个种类下所有测试用例,选项详情如表2.7所示。
表2.7 用例执行方式选项
在我们举的例子中,将测试用例testSomething()标记为@SmallTest。这个测试用例就属于Small这类了。因此,在按照测试集合规模的大小来执行用例时,这个用例将和所有标记为SmallTest的用例一起执行。
框2.6所示的命令行将会执行所有带@SmallTest标记的测试用例。
框2.6 执行带SmallTest标记的命令
diego@bruce:\~$ adb shell am instrument -w -e size small com.example.
aatg.myfirstproject.test/android.test.InstrumentationTestRunner
2.6.9 创建个性化标签
为了满足客户有另外的需求,比如说,有更大的测试集合需要标记,现有的尺寸标识不了。大家可以创建一个自己的个性标签,然后按命令行的方式具体定义。
比如,我想把一些非常重要的测试用例放在一起,于是我们可以创建一个叫做@VeryImportantTest的标签,如框2.7中所示。
框2.7 新建VeryImportantTest标签
package com.example.aatg.myfirstproject.test;
/**
* Annotation for very important tests.
*
* @author diego
*
*/
public @interface VeryImportantTest {
}
接下来,我们将创建另一个测试用例,并标记为@VeryImportantTest,如框2.8所示。
框2.8 新建测试用例,打新标签**
@VeryImportantTest
public void testOtherStuff() {
fail("Not implemented yet");
}
因此,像我们上面提到的,我们可以在am instrument命令行中执行带有这个标签的测试用例如框2.9所示。
框2.9 am instrument命令执行新标签下的用例
diego@bruce:\~$ adb shell am instrument -w -e annotation VeryImportantTest \
com.example.aatg.myfirstproject.test/android.test.
InstrumentationTestRunner
2.6.10 执行性能测试
我们将在第9章“性能测试”中复习一下性能测试的细节,这里我们会介绍下am instrument命令中的一些选择项。
你需要在命令行中添加下面的选项,才能将性能测试用例添加在执行中,如表2.8所示。
表2.8 性能测试用例命令选项
2.6.11 空载测试
有时候你只是想知道测试用例是否能够跑起来,而不是真正想做测试。这时候你可以将下面的选项加到你的命令行中,如表2.9中所示。
表2.9 显示测试用例命令选项
这种方式在你写脚本或者编译的时候很有用。