Robotium 教程:你的第一个 Android 框架

什么是 Robotium?

Robotium 是一个安卓测试框架,用于自动化原生和混合应用程序的测试用例。使用 Robotium,开发人员可以为安卓应用程序创建强大的自动 GUI 测试用例。此外,开发人员可以编写跨多个安卓活动的函数、系统和验收测试场景。

Robotium 测试框架

标准安卓测试框架存在以下一些限制

  • 无法处理多个活动
  • 测试执行性能慢
  • 测试用例复杂且难以实现

Robotium 框架是安卓应用程序测试的更好选择

Robotium 是一个开源框架,被认为是安卓测试框架的扩展。使用 Robotium,开发人员可以为安卓应用程序创建强大的自动 GUI 测试用例。此外,开发人员可以编写跨多个安卓活动的函数、系统和验收测试场景。

Advance Features of Robotium
Robotium 的高级功能

Robotium 测试用例类

Robotium 使用一组类 (com.jayway.android.robotium.solo) 进行测试。此类支持跨多个活动的测试用例。Solo 与 ActivityInstrumentationTestCase2 集成。

Robotium Test Case Classes
Robotium 和 ActivityInstrumentationTestCase2 的集成

测试人员可以使用 Robotium 测试用例类在不了解应用程序设计的情况下编写测试用例(黑盒测试)。与安卓测试用例类相比,这是一个出色的功能。

如何使用 Robotium

要在您的安卓测试项目中使用 Robotium,您需要遵循以下步骤

Use Robotium

使用 Robotium 对安卓应用程序进行测试。为确保您的安卓应用程序质量,您应遵循以下步骤

  1. 设计测试规范
  2. 开发测试程序
  3. 在目标设备上执行测试用例
  4. 收集测试结果
Android application
安卓应用程序测试过程测试过程

步骤 1) 设计测试规范

  • 这是测试您的应用程序的第一步。在此步骤中,您定义要测试的目标。在您的安卓应用程序中,有许多目标需要测试,例如 UI、Activity、组件、服务。明确定义应用程序中的目标将有助于实现广泛的测试覆盖率。
  • 规划应进行的测试类型(单元测试、功能测试、系统测试)。
  • 设计测试用例以实现最大覆盖率,同时最大限度地减少测试用例数量。测试的代码越多,早期发现错误的机会就越大。

步骤 2) 编写测试程序

本节指导您如何使用安卓 Junit Test 和 Robotium 编写安卓测试程序。假设您已经开发了一个名为 HelloAndroid 的安卓程序。此程序具有以下描述的一些功能

  • 在屏幕上显示文本“Hello world!”。
  • 当用户按下“开始”按钮时显示消息 HelloAndroid
HelloAndroid Application
HelloAndroid 应用程序

系统要求

  • 安卓平台预集成了 JUnit 3.0 框架。
  • 为了从 Eclipse 创建安卓测试项目,您的计算机必须已安装
  • 最新版本的安卓平台(目前是安卓 8.1)

您可以下载带有内置 ADT(安卓开发工具)的 Eclipse IDE。它包括基本的安卓 SDK 组件和 Eclipse IDE 的一个版本。

对于 Robotium 测试框架,您需要从 Robotium 网页下载 Robotium 库。

创建安卓测试项目

  • 点击文件 -> 新建 -> 其他
  • 选择:安卓 -> 安卓测试项目,如下图所示 -> 选择下一步
Create new Android test project
创建新的安卓测试项目

输入您的测试项目名称。按照命名约定,您的测试项目应命名为“HelloAndroidTest”

Add Test Project Name Base On Naming Convention
根据命名约定添加测试项目名称

选择要测试的目标应用程序。在这种情况下,这是 HelloAndroid,点击完成

Choose Target Application Under Test
选择要测试的目标应用程序

创建测试套件

根据您的测试规范,您开始为您的测试程序创建测试套件。您可以选择各种测试框架。在本教程中,我选择标准安卓测试框架 ActivityInstrumentationTestCase2。如果您想使用 Robotium 框架进行测试,您必须将 Robotium 库文件添加到项目文件夹中的 libs 目录。(您在项目文件夹中创建 lib 文件夹)。

测试用例定义了运行多个测试的夹具。要定义测试用例,您必须遵循以下程序结构

  • 实现 TestCase 的子类。
  • 定义存储夹具状态的实例变量
  • 通过重写 setUp() 初始化夹具状态
  • 通过重写 tearDown() 在测试后进行清理。
Test Program’s Structure
测试程序的结构
package com.example.helloandroid.test;

import com.example.helloandroid.HelloAndroid;
import com.jayway.android.robotium.solo.Solo;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView;

public class HelloAndroidTest extends ActivityInstrumentationTestCase2 <HelloAndroid> {
    
	private HelloAndroid mActivity;
	private TextView mView;
	private String resourceString;
	private Solo solo;
	
	public HelloAndroidTest () {
		// TODO Auto-generated constructor stub
		super("com.example.helloandroid",HelloAndroid.class);	
	}
	
	 @Override
	protected void setUp() throws Exception {
		// TODO Auto-generated method stub
	//	super.setUp();
		 
	 	mActivity = this.getActivity();
		solo = new Solo(getInstrumentation(),getActivity());
		mView = (TextView) mActivity.findViewById(com.example.helloandroid.R.id.textview2);
		resourceString = mActivity.getString(com.example.helloandroid.R.string.hello_world);
		
	}
	 
	 @Override
	protected void tearDown() throws Exception {
		// TODO Auto-generated method stub
		//super.tearDown();
		solo.finishOpenedActivities();
	}
	
	public void testPrecondition() {
		assertNotNull(mView);
	}
	
	/* test Target application contains a text display "Hello World!"*/
	public void testSearchText() {
		assertEquals(resourceString,(String) mView.getText());
	}
	
	/* test HelloAndroid Activity on target application is exist*/
	public void testCurrentActivity() throws Exception  {
    	solo.assertCurrentActivity("wrong activity", HelloAndroid.class);
    }
    
	/* test Application UI contains "Start" button */
	/* send event click button to target application */
    public void testSearchButton() throws Exception {
    	boolean found = solo.searchButton("Start");
    	solo.clickOnButton("Start");
    	assertTrue(found);
    }

	

}

添加测试用例

  • 在与 TestSuite 相同的包中,我们创建 TestCase 类
  • 要测试某个活动(即 HelloAndroid),请创建测试用例扩展 ActivityInstrumentationTestCase2<HelloAndroid>
  • 在此类中,测试人员可以通过 getActivity() 方法获取测试活动。
  • 您可以通过创建名称为“test + 原始方法名”的方法自由地为测试活动创建测试
  • 在测试方法中,测试人员可以使用安卓 JUnit 函数比较实际值和预期值。这些方法如下所示。
Example Methods of Robotium and Android Testing Framework
Robotium 和安卓测试框架的示例方法

上述这些测试套件验证了应用程序 GUI 必须显示文本“Hello World!”,并包含一个名为“Start”的按钮。

步骤 3) 运行测试

完成测试程序编写后,请按照以下步骤运行测试

  • 将安卓设备连接到您的电脑(如果您没有真实设备,则启动模拟器)。
  • 在您的 IDE 中,右键单击 -> 运行方式 -> 安卓单元测试
Running Test Program
运行测试程序

除了在 IDE 上运行测试,您还可以在命令行上运行测试。在这个测试程序中,测试包是 com.example.helloandroid.test。在 Linux 终端中,您可以使用以下命令运行此包中的所有测试

$ adb shell am instrument -w -e package com.example.helloandroid.test

步骤 4) 获取测试结果

测试执行后,您将获得测试结果。

在此测试程序中,执行了 4 个测试方法。在这种情况下,所有测试用例都通过了。

Test Result Output in Case All Test Cases Passed
所有测试用例通过时的测试结果输出

如果测试用例失败,将显示输出并显示哪些测试用例失败

Test Result Output in Case All Test Cases Failed
所有测试用例失败时的测试结果输出

源代码示例

本文包含一些源代码示例,可帮助您更清晰地理解本教程并快速掌握技术知识