Android测试入门

更新时间:2023-10-27 20:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1

测试

android开发环境包括了一个集成测试框架,可以帮助你测试应用程序的各个方面。

基础原理

开始学习如何使用框架来为应用程序创建测试前,请先阅读“测试基础原理”。

概念

“activity测试”着重测试activity。它描述了instrumentation是如何让你在应用程序生命周期之外去控制activity的。还列举了你应该测试的activity专有特性,并提供测试android用户界面的技巧。

“ContentProvider测试”着重测试ContentProvider。它描述了你可以使用的模拟系统对象,提供设计provider的技巧使得他们可被测试,列举了你应该去测试的provider专有特性。

“service测试”着重测试service。它列举了你应该测试的service专有特性。

“测试什么”对你应该要测试的种类进行概括。他着重于测试android系统范围内可以影响你应用程序组件的各个方面。

步骤

“用ADT在Eclipse中测试”描述了如何用ADT在Eclipse中创建和运行测试。

“在其他IDE中测试”描述了如何通过命令行工具创建和运行测试。

2

学习指南

“Hello,Testing”介绍了基本的测试概念和过程。

想进一步了解,阅读“Activity测试”,指导你进行一个更综合的测试方案。

工具

UI/Application Exerciser Monkey,通常称为Monkey,是一个命令行工具,可以给设备发送模拟键盘输入,触摸和手势等的随机事件。

monkeyrunner工具是一个API和执行环境。你可以通过Python语言来使用monkeyrunner来测试应用程序和设备。

测试基本原理

android测试框架,作为集成开发环境的一部分,提供了一个架构和强大的工具来帮助你从单元到框架来测试应用程序各个层次的各个方面。

测试框架有以下特征:

? android测试套件基于JUnit。你可以很容易地使用JUnit,不需要调用Android API既可

以测试一个类,或者不需要通过Android的JUnit扩展就可以测试一个一个android组件。如果你初学Android测试,你可以从通用测试用例类(如AndroidTestCase)开始,然后再使用更高级的类。

? Android Junit扩展提供了特定组件的测试用例类。这些类提供了一些辅助方法,通过这

些方法可以创建模拟对象和方法,以此帮助你控制组件的生命周期。

? 测试套件包含在测试包里,与主要的应用程序包相类似,这样你既不需要学习一套新

的工具和技术来设计和构建测试了。

3

? Eclipse的ADT里有可用的构建和测试的SDK工具,对于其他IDE也提供了命令行工

具。这些工具从要被测试的应用程序项目获取信息,通过这些信息自动生成构建文件,配置文件和测试包的结构目录。

? SDK还提供了monkeyrunner,用Python语言测试设备的API。还有UI/Application

Exerciser Monkey,一个对UI进行压力测试的命令行工具,可以给设备发送随机事件。

文档描述了Android测试框架的基本原理,包括测试的结构,用来开发测试的API,和用来运行和查看测试结果的工具。文档假定你已经具有Android应用程序和JUnit测试方法的知识。

下图简要说明了测试框架:

4

测试结构

Android的构建和测试工具假定测试项目是以标准的测试结构、测试用例类、测试包和测试项目来组织的。

Android测试基于JUnit。通常来说,一个JUnit测试就是一个方法,测试应用程序的一个部分。把测试方法组织到一个叫做测试用例或测试套件test case or test suites里。每个测试多是一个独立的测试模块。每个类是一个一系列相关联的测试的容器,尽管他经常提供一些帮助方法。

在JUnit里,你在一个类文件了构建一个或多个测试源代码。相类似的,在Android中,你使用SDK的构建工具来构建一个或多个测试源代码到一个Android测试包的类文件里。在JUnit中,你使用一个test runner来执行测试类。在Android中,你使用测试工具加载测试包和要测试的应用程序,然后测试工具执行一个特定的Android test runner。

测试项目

测试想android应用程序一样被组织成项目。

一个测试项目是一个目录或者Eclipse项目,在里面你可以为测试包创建源代码,配置文件和其他文件。Android SDK包含了用于Eclipse ADT插件的工具和命令行工具,用来帮助你创建和更新测试项目。这些工具为源代码、资源和配置文件创建目录。命令行工具还创建你需要的Ant构建文件。

你应该使用Android工具来创建测试项目。有以下好处:

5

? 自动建立测试包,用InstrumentationTestRunner作为test case runner。你必须使用

InstrumentationTestRunner和他的子类来运行JUnit测试。 ? 为测试包创建一个合适的名字。如果要测试的应用程序有一个名为

com.mydomain.myapp包,Android工具就会将测试包名设置为

com.mydomain.myapp.test。帮助你识别他们的关系,避免系统内冲突。

? 为测试项目自动创建合适的构建文件、配置文件和目录结构。帮助你构建测试包而不

需要修改构建文件和在测试包与要测试的应用程序间设置链接。

你可以在文件系统中的任何位置创建一个测试项目,但最好的方法就是在应用程序的src/目录的同一个根目录下创建一个tests/目录,以他来作为测试项目的更目录。这方便找到与应用程序关联的测试。例如,应用程序项目根目录是MyProject,那么你应该使用以下的目录结构:

MyProject/

AndroidManifest.xml res/

... (resources for main application) src/

... (source code for main application) ... tests/

AndroidManifest.xml res/

... (resources for tests)

6

src/

... (source code for tests)

测试API

android测试API基于JUnit API,并且通过instrumentation框架和Android特定的测试类来扩展。

JUnit

你可以用JUnit TestCase类来对一个简单的java对象进行单元测试。TestCase也是AndroidTestCase的基类,你可以使用AndroidTestCase测试依赖于Android的对象。除了提供JUnit框架,AndroidTestCase还提供了Android特定的setup、teardown和辅助方法。

你可以使用JUnit Assert类来显示测试结果。assert方法比较你测试的期望值和实际结果值,如果比较失败则抛出异常。Android也提供了一个断言的类,扩展了比较的类型,还有另一个断言类来测试UI。这些将在Assertion calsses中介绍。

想学习更多关于JUnit的知识,可以阅读junit.org主页。注意,Android测试API支持Junit3代码风格而不支持JUnit4.还有,你必须使用Android的instrumentation测试运行器InstrumentationTestRunner来运行你的测试用例类。这个测试运行器将在Running Tests部分介绍。

Instrumentation

Android instrumentation是一系列的控制方法或Android系统里的“hooks”钩子。这些hooks独立控制地一个Android组件的生命周期。他们也控制Android如何加载应用程序。

7

通常来说,一个Android组件运行在一个有系统决定的生命周期里。例如,一个activity对象的生命周期在他被一个Intent激活的时候开始。该对象的onCreate()方法被调用,接着调用onResume()。当用户启动另一个应用程序,onPause()方法被调用。如果activity的代码中调用了finish()方法,onDestroy()方法被调用。Android框架API不提供直接调用这些回调方法的途径,但是你可以通过使用instrumentation来达到直接调用回调方法这个目的。

而且,系统让一个应用程序里的所有组件都运行在同一个进程中。你可以允许一些组件如contentProvider运行在一个另外的进程,但是你却不可以强制一个应用程序运行在与一个正在运行的应用程序相同的进程里。

通过Android instrumentation,你可以在测试代码中调用回调方法。这样使得你可以一步一步的运行生周期的每个阶段,就像你调试组件那样。以下代码片段演示如何使用它来测试一个activity保存和回复状态:

// Start the main activity of the application under test mActivity = getActivity(); // Get a handle to the Activity object's main UI widget, a Spinner mSpinner = (Spinner)mActivity.findViewById(com.android.example.spinner.R.id.Spinner01); // Set the Spinner to a known position mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION); // Stop the activity - The onDestroy() method should save the state of the Spinner mActivity.finish(); 8

// Re-start the Activity - the onResume() method should restore the state of the Spinner mActivity = getActivity(); // Get the Spinner's current position int currentPosition = mActivity.getSpinnerPosition(); // Assert that the current position is the same as the starting position assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);

这里用到的关键方法getActivity()是instrumentation API的一部分。要测试的Activity知道你调用该方法才会启动。你可以先进行测试前的准备工作,然后调用该方法启动Activity。

同时,instrumentation可以把一个测试包和将要测试的应用程序加载到相同的进程中。由于应用程序组件和他们的测试在相同的进程中,所以测试可以调用组件中的方法,修改和检查组件的属性。

测试用例类test case classes

Android提供了几个测试用例类,这些类都是通过扩展TestCast类和Assert类的来的,具有android特定的setup、teardown和辅助方法。

AndroidTestCase

AndroidTestCase是一个很有用的开始Android测试的普通测试用例类。它扩展了TestCase和Assert。他提供了JUnit标准的setUp()和tearDown()方法,同时还有所有JUnit

9

的Assert方法。另外,它提供了测试权限的方法,并且提供了一个通过清除特定类引用来防止内存泄漏的方法。

特定组件的测试用例

Android测试框架的一个主要特性就是它的用于特定组件的测试用例类。这些类用于特定的组件测试需要,具有setup和teardown和组件的生命周期控制方法。他们同时提供了设置mock对象的方法。这些类在特定组件测试主题里介绍:

? activity测试 ? ContentProvider测试 ? Service测试

Android没有为BroadcaseReceiver提供一个单独的测试用例类。取而代之的是,通过测试给他发送Intent对象的组件,验证BroadcaseReceiver是否正确响应,以此来测试BroadcaseReceiver。

ApplicationTestCase

你可以用ApplicationTestCase测试应用程序对象的setup和teardown。这些对象保留信息的全局状态,这些信息是应该到应用程序包里的所有组件的。这个测试用例在验证配置文件的元素是否正确设置是非常有用。但是注意:该测试用例不允许你控制应用程序里组件的测试。

InstrumentationTestCase

如果你想在一个测试用例类里使用instrumentation方法,你必须使用

InstrumentationTestCase或者它的子类。Activity测试用例扩展了这个基类,增加了其他在activity测试中的辅助功能。

10

Assertion类

因为Android测试用例类是基于JUnit扩展的,所以你可以使用断言方法来显示测试结果。断言方法将返回的实际值与期望值比较,如果比较失败则抛出断言异常。使用断言比使用日志更方便,并且有更好的测试性能。

除了JUnit Assert类方法外,测试API还提供了MoreAsserts和ViewAsserts类: MoreAsserts包含了更为强大的断言,如assertContainRegex(String, String),用来进行正则表达式匹配。

ViewAsserts包含有关Views的一些有用的断言。例如,包含了

assertHasScreenCoordinates(View, View, int, int),用来测试一个View在可见的屏幕上是否具有特定的X和Y坐标位置。这些断言简化了UI的几何图形和定位测试。

Mock(虚拟)对象类

为了使测试中便于进行依赖注入,Android提供了一些类来创建虚拟系统对象,如Context对象、ContentProvider对象、ContentResolver对象和Service对象等。一些测试用例还提供了虚拟Intent对象。使用这些虚拟对象一方面可以不依赖系统进行独立测试,另一方面在测试中便于依赖注入。这些类可以在java包android.test和android.test.mock中找到。

虚拟对象类还便于依赖注入,通过提供一个非功能性的一般对象的子类,除了重写定义。例如,MockResources对象提供了Resources的一个子类,它里边的所有方法在调用的时候都抛出异常。要使用它,你只需要重写那些必须提供信息的方法。

以下这些是Android中可用的虚拟对象类:

11

Simple mock object类

MockApplication、MockContext、MockContentProvider、MockCursor、MockDialogInterface、MockPackageManager和MockResources提供了一个简单且有用的虚拟策略。他们是响应系统对象类的不完全版本,他们所有的方法被调用时都抛出UnsupportedOperationException异常。要使用它们,你就要重写你需要的方法来提供虚拟依赖关系。

注意:MockContentProvider和MockCursor是API level 8新增的。

Resolver虚拟对象

MockContentResolver通过掩盖正常的系统resolver框架来提供独立的contentProvider测试。MockContentResolver不是用提供的authority字符串在系统中寻找contentProvider,而是使用自己内部特有的表。你必须用addProvider(String, ContentProvider)方法明确的增加providers到这个表中。

基于这个特性,你可以将一个authority与一个虚拟contentProvider关联起来。你可以创建一个真正provider的实例但却能在里面使用测试数据。你甚至可以将一个authority对应的provider设置为null。实际上,MockContentResolver对象把你的测试从包含真是数据的provider中分隔出来。你可以控制provider的功能,并且可以阻止你的测试影响真是的数据。

用于测试的Contexts

Android为测试提供了两个Context类:

? IsolatedContext提供一个独立的Context、文件、目录和数据库操作。虽然他的功能受

到限制,但是这个Context有足够的代码片段来响应系统的调用。

? 这个类允许你在不影响真实数据的情况下测试一个应用程序的数据操作。 ? RenamingDelegatingContext提供了一个Context,在这个Context当中,大部分的功能

有现有的Context来处理,但是文件和数据库操作则由IsolatedContext处理。被分离

12

的部分使用一个测试目录和创建特定的文件和目录名。你可以自己控制命名,或者让构造器constructor自动决定。

这个对象提供了一个快速的方法来建立一个独立的数据操作区域,并且为其他所有的Context操作保留了正常的功能。

运行测试

测试用例由测试运行器类来运行,测试运行器类加载测试用例类、初始化、运行、销毁每个测试。Android测试运行器必须是被instrumented的,这样启动应用程序的系统工具就能控制测试包如何加载测试用例和应用程序。你在测试包的配置文件里告诉android平台用哪个instrumented了的测试运行器。

InstrumentationTestRunner是主要的Android测试运行器。他扩展了JUnit的测试运行器框架而且也是instrumented的。它能运行有Android提供的任何测试用例类,并且支持所有可能的测试类型。

你在测试包的配置文件里的元素中指定InstrumentationTestRunner或者他的子类。InstrumentationTestRunner代码是属于共享库android.test.runner的,而不是链接到android代码的。要包含他,你必须在元素中指定他。你不需要自己设置这些元素,Eclipse的ADT和android命令行工具会自动构建他们,把他们添加到你测试包里的配置文件中。

注意:如果你使用一个不是InstrumentationTestRunner的测试运行器,你必须修改元素,指定你想要使用的类。

要运行InstrumentationTestRunner,你要使用有Android工具调用的内置的系统类。当你在Eclipse ADT里运行测试时,这些类被自动调用。当你从命令行运行测试时,你用Android Debug Bridge(adb)来运行这些类。

13

系统类加载和启动测试包,结束所有正在运行将要测试应用程序的实例进程,并加载一个新的应用程序实例。然后他们把控制权交给InstrumentationTestRunner,让他来运行测试包里的每个测试用例类。你也可以控制哪个测试用例和方法将被运行,通过Eclipse的ADT或者在命令行工具里使用标记。

系统类和InstrumentationTestRunner都不运行要测试的应用程序,而是有测试用例类直接运行应用程序的。它调用应用程序里的方法,或者是调用它自己的方法来触发应用程序的生命周期事件。应用程序在测试用例的完全控制之下,允许测试用例在运行测试前设置测试环境(the test fixture)。在前面的代码片段中已经展示了测试显示Spinner widget的activity。

学习更多有关运行测试的内容,请参看在Eclipse ADT里测试和在其他IDE里测试主题。

查看测试结果

Android测试框架将测试结果返回给启动测试的工具。如果你在Eclipse里用ADT运行测试,结果将被显示在一个新的JUnit view面板。如果你从命令行运行测试,结果将被显示在标准输出。在这两种情况下,你能看见测试摘要,摘要显示每个测试用例的名称和运行的方法。同时可以看见所有失败的断言。并且显示发生断言失败所在的代码行。断言失败也会列出期望值与实际值。

测试结果有一个格式,有你使用的IDE来指定。

monkey和monkeyrunner

SDK提供了两个工具来从功能层面上测试应用程序:

14

? UI/Application Exerciser Monkey,通常称为“monkey”,是一个命令行工具,向设备发

送键盘输入、触摸和手势等随机事件。你可以用adb工具来运行他。用它来应用程序的压力测试并报告发生的错误。你可以通过运行该工具来重复一个相同随机速度的事件流。

? monkeyrunner工具是一个有Python编写的API和测试程序的执行环境。API包含了连

接设备、安装和卸载包、截屏、比较两个图片和运行一个测试包等功能。使用这些API,你可以编写一个强大复杂的全面测试。你要用mokeyrunner命令行工具来运行使用这些API的程序。

用包名来工作

在测试环境里,你用到Android应用程序包名和java包标识。两者使用相同的命名格式,但是他们代表着本质不同的实体。你需要知道这些区别才能正确的建立测试。

Android包名是一个唯一的.apk文件系统名,由包配置文件里元素的android:package属性来设置。你测试包Android包名必须与要测试应用程序的Android包名不同。默认地,Android工具通过在要测试的应用程序包名后面增加.test来创建测试包名。

测试包使用Android包名来定位要测试的应用程序包。这在测试包配置文件的元素的android:targetPackage属性中设置。

java包标识应用于源文件。这个包名映射源文件的目录路径。他同时也影响类和方法相互之间的可见性。

Andorid工具为你的测试项目创建一个Android测试包名。工具从你的输入建立测试包名和目标应用程序包名。要使工具得以工作,应用程序项目必须是已经存在的。

默认地,这些工具为测试类建立与Android包标识相同的Java包标识。如果你想应用程序的成员,是的他们包可见,可能会想要改变包名。如果你这样做,只需要改变java包

15

很多类似安卓下的linux环境是会报错的,我手头上暂时没有能够支持该命令(-T选项)的linux系统.所以这里遗留几个问题:

1. 测试工程apk与被测apk的签名相同了,是否每次启动的时候都要对该签名进行重新签名,

安卓手机里面有没保存?

2. 我上面提到MKTEMP的关键字是否是因为我的linux系统的问题?还是说有别的解决方

法?

不过最后总结,因为安卓自动化测试是一个非常新和较少经验共享的领域,所以我后续等项目自动化模式成熟之后会多上google和国外网站上面学习,争取10月中旬能够攻我工作设计的apk自动化任务.

31

编号金额备注余款预计事项1-0011-0021-0031-0041-0051-0061-0071-0081-0091-0101-0111-0121-0131-0141-0151-0161-0171-0181-0191-0201-0211-0221-0231-0241-0251-0261-0271-0281-0291-0301-031

32

}); mInstrumentation.waitForIdleSync(); this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);

关闭触控模式

用你从测试发送的键入事件去控制模拟器或设备,你必须关闭触控模式。如果你不这样做,键入事件将被忽略。

要关闭触控模式,要在调用getActivity()启动activity前先调用

ActivityInstrumentationTestCase2.setActivityTouchMode(false)。而且你必须在测试方法里的非UI线程调用此方法。所以,你不能在一个被@UIThread注解了的测试方法里调用触控模式方法。但是你可以在setUp()方法里调用来做同样的事情。

解锁模拟器和设备

你可能发现如果模拟器或设备在锁键状态下home屏幕不可见时,UI测试是不工作的。这是因为测试的应用程序不能够接收有sendKeys()发送过来的键入事件。避免这种情况最好的方法就是先启动模拟器或设备,然后禁用掉所键。

你可以显式地禁用锁键。要这样做你需要在AndroidManifest.xml配置文件里增加权限,然后在你测试的应用程序里禁用锁键。但是要注意,你一定要在发布应用程序前去掉它。

要增加权限,在元素下增加一个子元素

android:name=\,然后增加以下代码到你想要测试的activity的onCreate()方法中就能禁用掉锁键了:

21

mKeyGuardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); mLock = mKeyGuardManager.newKeyguardLock(\activity_classname\); mLock.disableKeyguard();

activity_classname是activity的类名

UI测试疑难解答

该部分列举了在UI测试中通常可能遇到的一些测试失败以及引起它的原因: WrongThreadException 问题:

对于一个失败的测试,失败跟踪包含了以下错误信息:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 可能原因:

如果你试图从UI线程外发送UI事件到UI线程,通常会遇到这个错误。如果在没有使用@UIThread注解或者ruOnUiThread()方法的情况下,你从测试程序发送UI事件通常就会发生这个错误。该测试方法试图在UI线程外与UI交互。

解决方案建议:

在UI线程中运行交互。使用一个提供instrumentation的测试用例。参看前面的“在UI线程中测试”部分。 java.lang.RuntimeException

22

问题:对一个失败的测试,失败跟踪里包含以下错误信息:java.lang.RuntimeException: This method can not be called from the main application thread 可能原因:

如果你的测试方法被@UIThreadTest注解了,但是接着又试图在UI线程外执行一些事情或者试图调用runOnUiThread()方法就会产生这种错误。

解决方案建议:

去掉@UiThreadTest注解,去掉runOnUiThread()方法调用,或者重构你的测试。

测试

android开发环境包括了一个集成测试框架,可以帮助你测试应用程序的各个方面。

基础原理

开始学习如何使用框架来为应用程序创建测试前,请先阅读“测试基础原理”。

概念

“activity测试”着重测试activity。它描述了instrumentation是如何让你在应用程序生命周期之外去控制activity的。还列举了你应该测试的activity专有特性,并提供测试android用户界面的技巧。

“ContentProvider测试”着重测试ContentProvider。它描述了你可以使用的模拟系统对象,提供设计provider的技巧使得他们可被测试,列举了你应该去测试的provider专有特性。

23

“service测试”着重测试service。它列举了你应该测试的service专有特性。

“测试什么”对你应该要测试的种类进行概括。他着重于测试android系统范围内可以影响你应用程序组件的各个方面。

步骤

“用ADT在Eclipse中测试”描述了如何用ADT在Eclipse中创建和运行测试。

“在其他IDE中测试”描述了如何通过命令行工具创建和运行测试。

学习指南

“Hello,Testing”介绍了基本的测试概念和过程。

想进一步了解,阅读“Activity测试”,指导你进行一个更综合的测试方案。

工具

UI/Application Exerciser Monkey,通常称为Monkey,是一个命令行工具,可以给设备发送模拟键盘输入,触摸和手势等的随机事件。

monkeyrunner工具是一个API和执行环境。你可以通过Python语言来使用monkeyrunner来测试应用程序和设备。

测试什么

当你开发Android应用程序,知道应该测试什么与如果测试同等重要。本文档列举里一些最常规的Android相关的状况,这些状况是你测试时甚至在单元测试阶段就应该应该考虑

24

的。这并不是一个详细的列表,更多的特性翻阅文档。android-developers Google Groups网站是另一个有关测试信息的资源。

测试的概念

以下部分是你应该测试的行为或状况。每个部分都包含对应该测试的状况进一步说明。

方向的改变

支持多方向的设备,当用户转动设备时显示有从向变成横向,Android就能检测到这种变化。

当Android检测到方向变化时,默认的行为是销毁前台Activity然后重新启动。你应该考虑测试下列内容:

屏幕是否正确地重绘了?自定义UI的代码应该处理处理方向的改变。

是否维持了应用程序的状态?Activity不应该丢失任何用户已经输入到UI的东西。应用程序不应该“忘记”它的当前位置。

配置的改变

设备配置的改变比方向的改变更常见,比如键盘的可用与否或者系统语言的改变。 配置的改变也会触发默认的销毁前台Activity然后重启的行为。处理维持UI和食物状态,你还应该测试应用程序是否更新自己来正确响应新配置。

电池时间

25

移动设备一电池为电源。设备只有有限的电量,当电量耗尽,设备便不可用,知道在充电。你需要让你的应用程序最小化使用电池,你需要测试他的电池消耗性能,并且你需要测试管理电池使用的方法。

降低电池消耗的技术在2010 Google I/O大会上以Coding for Life-Battery Life That,Is为主题介绍。该介绍描述了变量操作对电池寿命的影响,以及你可以通过设计你的应用程序来减少这种影响的方法。当你编写减少电池消耗的代码时,你也要编写响应的单元测试。

外部资源依赖性

如果你的应用程序依赖于网络访问、SMS、蓝牙或GPS,那你就应该测试当这些资源不可有时会发生什么。

比如,如果你的应用程序使用网络,如果访问不可用时能通知用户,或者禁用依赖网络的特性,或者双管齐下。对于GPS,它可以切换到基于IP定位。它也可以等待WiFi访问之后才进行大数据传输,因为与3G或EDGE比较,WiFi可以最大化电池的使用。

你可以使用模拟器测试网路访问和宽带。学习更多请看“网络速度模拟”。要测试GPS,你可以使用模拟器控制台和LocationManager。学习更多有关模拟器控制台请看“使用模拟器控制台”

杂七杂八

(2011-04-26 05:45:21)

转载 标签: 分类: Android

杂谈

编写ContentProvider测试遇到的错误

Test run failed: Test run incomplete. Expected 1 tests, received 0 原因:

当继承ProviderTestCase时,必须提供一个不带参数的构造方法,而Eclipse自动生成一个带参数的构造方法,所以出错。 解决:

26

当继承ProviderTestCase时,必须提供一个不带参数的构造方法,并在该构造方法中调用super(Class providerClass, String providerAuthority)构造方法,明确指定两个参数。

27

安卓自动化测试执行总结以及疑问-Robotium

上一篇 / 下一篇 2011-09-19 01:06:51 / 个人分类:Robotium 查看( 204 ) / 评论( 1 ) / 评分( 0 / 0 )

经过4周左右时间摸索和实践,android的自动化算是完成了用例的任务了,在这个过程中遇到很多困难和尝试很多方案,对比wed自动化,终端产品的自动化算是比较新鲜同时不成熟,但是也算是一个成长的乐趣.

首先,由于我开始进行自动化测试的是公司开发的apk,所以有源代码且编译是没问题的,所以能够在这个基础上作为第一个Robotium自动化项目.首先我们通过eclipse创建测试项目,连接上被测的源代码工程.然后就可以很简单的编写用例了: Package被测对象包;

Import android.test.ActivityInstrumentationTestCase2; Import com.liliandroid.helloworld.ActivityMain; Import com.jayway.android.robotium.solo.Solo; Public

classUITextTestextendsActivityInstrumentationTestCase2{ Private Solo solo; Public UITextTest() {

super(\需要继承的被测对象的东东\}

Public void setUp()throws Exception {

solo=newSolo(getInstrumentation(), getActivity()); } Public

}

以上这步其实我相信很多做自动化测试的人已经都能够正常跑起来,但是困难点来了,假如我们想通过只有apk不要源代码的情况下执行用例的话,我们就要做许多操作了.通过我几个星期的摸索,首先我们需到这里下载一个关于创建测试的工程: http://robotium.googlecode.com/files/RobotiumForBeginners.pdf

关键点来了,这个工程中所有步骤都顺利,但是关于重新签名的这个地方暂时我还没看到相关同学解决掉,所以我就换了另外一个方式去解决签名问题,此方法通过网上的重新签名的一些共享来执行的(这里不建议自己创建签名,因为容易会对测试的apk有功能上的影响,以下是一

28

void 测试用例testcase()throwsException {

些网上重新签名的方法): pre-install apk的签名方法:

1. 在Eclipse里编写好测试apk的代码,例如要测试“打开信息这个应用,准备发送

短信息”;

2. 准备Linux系统环境,并配置好Android开发环境(包括SDK、JRE、环境变量

等);

3. 下载自动签名脚本

4. http://code.google.com/p/robotium/downloads/detail?name=sign-de

bug-any-apk.sh

5. 从Android系统中导出pre-install的应用(例如Mms.apk) 6. adbpull /system/app/Mms.apk

7. 准备Eclipse的默认签名工具debug.keystore文件;

8. 将脚本文件、Mms.apk、debug.keystore都拷贝到Linux系统中; 9. 修改脚本文件,并给它加权(注二); 10. 在终端中输入命令:

11. ./sign-debug-any-apk.shMms.apk Mms_signed.apk

12. 如果一切顺利,此apk应该已经签好名并生成新的文件“Mms_signed.apk”; 13. adb pull /data/system/packages.xml 14. Openpackages.xml and remove: 15.

17. Pushpackages.xml back to device: adb push packages.xml /data/system 18. Renamed“Mms_signed.apk”to “Mms.apk”, then push the apk back to the

device: adb push Mms.apk/system/app

19. 运行Eclipse里的测试代码,顺利的话你就能看到信息这个应用被调用并启动。

注一:

‐‐Un-zip the apk file

‐‐Delete the META--‐INF folder ‐‐Re‐zip the apkfile

29

‐‐In Dos prompt /Command prompt

>jarsigner -keystore~/.android/debug.keystore -storepass android -keypass android ApplicationToTest.apkandroiddebugkey

> zipalign 4 ApplicationToTest.apkTempApplicationToTest.apk 注二:

1. #!/bin/bash 2. set -e

3. ORIGINAL_APK=\

4. CLEAN_SIGNED_APK=\

5. UNPACK_DIRECTORY=\ 6. ZIPALIGNED_APK=\ 7. PWD=\

8. if [ -e \ 9. if [ \

10. echo \ 11. exit 2 12. fi

13. rm \ 14. rm \ 15. cd \ 16. jar xf \ 17. rm META-INF/CERT.*

18. jar cf \

19. jarsigner -keystore这里是你的debug.keystore存放路径-storepass android

-keypass android \ 20. zipalign 4 \ 21. else

22. echo \ 23. exit 1 24. fi

但是有一个问题,以上用到的一个sh文件中,他有一行代码用到了MKTEMP -T这个关键字,

30

本文来源:https://www.bwwdw.com/article/z9q2.html

Top