4.测试前期条件
通常,前置条件没法按照正常流程来测,因为常规的测试用例次序是随机的。因此,通常会写一个testPrecondition用例来专门测前置条件。虽然没法保证测试用例以一个特别指定的顺序进行,但是将所有测前置条件的用例放在指定的地方是一个好的习惯,可以提高用例的可读性。
5.实际测试
所有公有类型、返回值为void并且以test开头的函数都会被当作测试用例。Junit 3不采用标注来标识测试用例,而采用函数名,这点与Junit 4相反。在Android测试框架中,标注有@SmallTest、@MediumTest、@LargeTest,但是这些注释不会将一个函数标识为测试函数,他们是将测试用例分组的注释。通过分组,你可以选择性地执行某个组下面的所有用例。
实际测试的第一条规则,用描述性名字来命名测试用例,或者以测试条件命名。
比如testValues()、testConversionError()、testConversionToString(),这种命名方式是靠谱的。
测试时,要注意不仅仅是走正常的用例,异常和错误的测试用例也要覆盖到。在特定条件下执行用例后,要注意检查周边影响以及函数返回值,是否跟预期一致。Junit提供了一系列的断言assert*函数,它们将预期和真实结果作对比,不一致的时候抛出异常。这样,测试执行器将会处理这些异常,并在最终的结果中展现出来。
断言方法有很多,可以接受不同类型的参数,包括:
" assertEquals();
" assertFalse();
" asssertNotNull();
" assertNotSame();
" assertNull();
" assertSame();
" assertTrue();
" fail()。
除了Junit提供的以上断言方法,Andriod扩展了两个特别的断言类:
" MoreAsserts;
" ViewAsserts。
6.Mock对象
Mock对象是指不调用真实的对象,而是调用模拟对象,获得指定结果,以达到将测试单元隔离的目的。
通常,使用这种方法是为了保证被测对象能够正常调用,并且,就像上面提到的,将被测对象跟周边环境隔离开。这样一来,测试用例就可以不受外部影响了,可以独立执行,并且可以重复执行。
Android测试框架支持Mock多个对象,这点对编写测试用例十分有用。当然,这些编译测试用例需要依赖一些东西。
Andriod测试框架提供的几个Mock类如下:
" MockApplication;
" MockContentProvider;
" MockContentResolver;
" MockContext;
" MockCursor;
" MockDialogInterface;
" MockPackageManager;
" MockResources。
几乎平台上所有与你交互的部件都可以由以上几个类来生成。但是,它们并非真正执行,而是在每个方法产生UnsupportedOperationException的地方打桩,这样一来,你就可以创建你真正的Mock的对象,实现Mock的内容了。
7.UI测试
最后,你在测UI部件的时候,需要考虑一些特殊因素。众所周知,在Android应用中只有主线程才允许更改界面交互。只有带有@UIThreadTest标记的函数才会在主线程执行,因此用来测界面的用例需要打这个标记。另一方面,如果你想在UI线程中执行一部分测试用例,可以使用Activity.runOnUiThread方法,这个方法提供了可执行的测试操作。
TouchUtils是一个帮助类,提供了UI测试的常用帮助,指引你调用一般的事件方法,将事件传递到界面上,比如:
" Click点击;
" drag拖曳;
" long click长点击;
" scroll滚动;
" tap拍;
" ouch触摸。
通过上述方法,你可以在测试用例中真实地远程控制您的应用程序。
8.Eclipse和其他IDE支持
Eclipse完全支持Junit,而AndroidADT插件方便你测试Android工程。更有甚者,你无需使用IDE也可以执行测试用例和分析测试结果。
Eclipse也有个优势:在Eclipse里执行测试用例,执行不正确的时候,可以通过debug的方式,同时调试用例和代码。
在图1.2所示中,我们可以看到Eclipse执行了18个测试用例,花了20.008秒的时间,没发现问题,0失败。测试用例的名称以及执行过程都有展示。如果有一个失败了,错误跟踪会显示相关的信息。
其他IDE,像ItelliJ和Netbeans虽然集成Android开发的插件,但是并没有官方支持。
如果你现在没有在IDE中开发,你可以用ant来执行测试用例(如果你不熟悉这个ant工具请访问http://ant.apache.org)。通过Android命令行,用create test-project命令来启动,这个命令的帮助文字如框1.2所示。
框1.2 命令帮助信息
$ android --help create test-project Usage: android [global options] create test-project [action options] Global options: -v --verbose Verbose mode: errors, warnings and informational messages are printed. -h --help Help on a specific command. -s --silent Silent mode: only errors are printed out. Action "create test-project": Creates a new Android project for a test package. Options: -p --path The new project's directory [required] -m --main Path to directory of the app under test, relative to the test project directory [required] -n --name Project name |
1.4.2 集成测试
集成测试目的是用来测试模块与模块之间的交互情况。一般情况下,模块先会经过独立的单元测试,然后再组装在一起集成测试。
通常,Android应用上的活动需要跟操作系统进行交互。它们通过ActivityManager来控制活动的生命周期,访问资源、文件系统和数据库。
其他组件,譬如Services(服务组件)和ContentProviders(共享数据)也是同样的原理。它们也需要跟系统的其他部分进行交互来完成相应的功能。
在所有的测试用例中,Android测试框架提供了特殊的测试用例,以便测试上述组件。
1.4.3 功能或者验收测试
在敏捷开发项目中,功能测试或者说验收测试一般是由业务方和测试人员来编写。这些用例通常是以业务场景的表达方式来给大家展现的。这里会有高层次的测试用例,用来测试一个用户需求或者特性的正确性和完整性。虽然这些测试用例是由客户、业务分析员、测试人员和开发人员协商制定的理想结果,但客户(产品的拥有者)是这些测试用例的首要负责人。
在这方面,有一些框架和工具可以帮助你,最著名的FitNesse,如图1.3所示,一句话,他们让你在Android开发阶段,轻松集成测试。另外还可以创建测试用例并且验证结果。
图1.3 fitness集成测试结果图
最近,"行为驱动开发"BDD的新型模式风靡起来,简单说来,可以理解成"测试驱动开发"TDD的革新。"行为驱动开发"的目的在于在业务和技术人员之间建立起统一的术语以便增加相互之间的沟通理解。
"行为驱动开发"可以理解为基于活动的框架,有以下三个原则
" 业务与技术要以相同的方式来描述系统。
" 任何系统都要有确认的、可以衡量的业务价值。
" 从最开始的分析、设计以及计划,都需要有明确的产出。
有了以上几个原则,业务人员通常都会参与测试用例的场景设计,并站在业务的角度,利用一些工具实现,比如jbehave(http://jbehave.org)。在下面的例子中,测试用例用类似于编程语言的方式表达出场景。
试用例场景描述
我们举个非常简单的例子来描述将场景转换成代码的方法:
场景如框1.3中所述。
框1.3 场景描述
假设我有一个温度转换器,
当我输入100摄氏度时,
我得到的结果是212华氏温度。
这个场景翻译成代码如框1.4中所示。
框1.4 对应框1.3翻译出来的伪代码
@Given("我有一个温度转换器") public void createTemperatureConverter(){ // do nothing } @When("我将摄氏温度输入对应的文本框") public void setCelsius(int celsius){ mCelsius=Celsius; } @Then("我将在华氏温度的字段看到相应的华氏温度") public void testCelsiusToFahrenheir(int fahrenheit){ assertEquals(Fahrenheit, TemperatureConverter.celsiusToFahrenheit (mCelsius)); } |
本文选自《Android应用测试指南》第一章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。