Android官方开发文档Training系列课程中文版:Activity测试之UI组件测试

简介: 原文地址:http://android.xsoftlab.net/training/activity-testing/activity-ui-testing.html一般来说,正因为Activity含有UI组件,所以使得用户可以与程序交互。

原文地址:http://android.xsoftlab.net/training/activity-testing/activity-ui-testing.html

一般来说,正因为Activity含有UI组件,所以使得用户可以与程序交互。这节课将会介绍如何测试Activity中的Button组件。在课程学习之后便可以使用相同的方法对其它UI组件进行测试。

Note:这节课中所涉及的UI测试被称为白盒测试,因为开发者本身持有被测试的源代码。Android设备框架适用于UI组件的白盒测试。另一种测试类型被称为黑盒测试,因为不能够得到程序的源代码,故此得名。这种测试适用于与其它APP或系统交互的测试情况。黑盒测试在这里并不会涵盖。有关更多如何执行黑盒测试的相关内容,请参见UI测试指南

创建UI测试用例

虽然Activity运行于UI线程,但是测试程序本身是运行在子线程中的。这意味着,虽然TestAPP可以引用UI线程的对象,但是如果要更改这些对象的属性或者发送事件给UI线程,那么将会得到一个WrongThreadException错误。

为了可以安全的发送Intent到Activity或者在UI线程中运行测试方法,开发者可以使测试类继承于ActivityInstrumentationTestCase2类。

设置测试先决条件

当为UI测试设置先决条件时,则需要在setUp()方法中指定TouchMode。设置TouchMode为true可以使后面的测试方法在自动化点击UI组件时防止真正点击(例如,测试Button只是调用了它的onclick方法)。另外要确保在调用getActivity()方法之前调用了setActivityInitialTouchMode()方法。

例如:

public class ClickFunActivityTest
        extends ActivityInstrumentationTestCase2 {
    ...
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        setActivityInitialTouchMode(true);
        mClickFunActivity = getActivity();
        mClickMeButton = (Button) 
                mClickFunActivity
                .findViewById(R.id.launch_next_activity_button);
        mInfoTextView = (TextView) 
                mClickFunActivity.findViewById(R.id.info_text_view);
    }
}

添加测试方法

一般需要测试的点会包含以下部分:

  • 当Activity启动时,验证Button的布局是否显示正确。
  • 验证TextView在初始化时是否是隐藏的。
  • 验证Button按下后,TextView上的文本是否变为了期望的值。

下面将会演示如何测试以上部分:

验证Button的布局参数

开发者可能需要以下代码来验证Button的布局是否正确:

@MediumTest
public void testClickMeButton_layout() {
    final View decorView = mClickFunActivity.getWindow().getDecorView();
    ViewAsserts.assertOnScreen(decorView, mClickMeButton);
    final ViewGroup.LayoutParams layoutParams =
            mClickMeButton.getLayoutParams();
    assertNotNull(layoutParams);
    assertEquals(layoutParams.width, WindowManager.LayoutParams.MATCH_PARENT);
    assertEquals(layoutParams.height, WindowManager.LayoutParams.WRAP_CONTENT);
}

在调用assertOnScreen()方法时,应当将rootView以及需要验证的View传递进去。如果需要验证的View没有在rootView中出现,那么判断方法会抛出一个AssertionFailedError异常。

开发者还可以通过Button的布局参数来验证Button的布局是否正确,然后通过判断方法来验证Button的高宽是否是期望中的值。

@MediumTest注解说明了这个测试方法应当如何分类。如何分类取决于测试方法的执行时间。

验证TextView的布局参数

开发者也可能需要通过以下代码来验证TextView在初始化时是否是隐藏的:

@MediumTest
public void testInfoTextView_layout() {
    final View decorView = mClickFunActivity.getWindow().getDecorView();
    ViewAsserts.assertOnScreen(decorView, mInfoTextView);
    assertTrue(View.GONE == mInfoTextView.getVisibility());
}

开发者可以通过getDecorView()方法获得Activity的DecorView引用。DecorView在布局层级中属于最高等级的ViewGroup.

验证Button的行为

开发者可以根据以下测试方法来验证在Button按下后TextView是否变为可见状态。

@MediumTest
public void testClickMeButton_clickButtonAndExpectInfoText() {
    String expectedInfoText = mClickFunActivity.getString(R.string.info_text);
    TouchUtils.clickView(this, mClickMeButton);
    assertTrue(View.VISIBLE == mInfoTextView.getVisibility());
    assertEquals(expectedInfoText, mInfoTextView.getText());
}

为了可以自动点击Button,需要调用clickView()方法。该方法需要传入测试用例的引用以及对应Button的引用。

Note: 辅助类TouchUtils提供了一些用于模拟交互的简单方法,开发者可以使用这些方法来模拟点击,拖拽等事件。

Note: TouchUtils中的方法用于从测试线程向UI线程中发送事件。开发者最好不要在UI线程中直接调用TouchUtils的相关方法,否则会引起WrongThreadException异常.

测试注解

以下注解可以用来标明测试方法的大小:

  • @SmallTest

  • @MediumTest

  • @LargeTest

一般来说,一个只有几毫秒的剪短测试一般应该标为@SmallTest。稍长一点的,大概100毫秒左右的,通常应该标为@MediumTest或@LargeTest,测试的执行时间通常取决于是否需要访问本地资源或者网络资源。

开发者应当通过注解来标记测试方法,以便更好的组织、运行测试。

目录
相关文章
|
1月前
|
缓存 搜索推荐 索引
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。
110 7
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2天前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
65 38
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
|
29天前
|
前端开发 搜索推荐 开发者
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图
Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。
63 12
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图
|
29天前
|
搜索推荐 前端开发 开发者
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。
72 11
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
|
29天前
|
UED 开发者
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
高级动画可以显著提升用户体验,为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画,包括弹性动画、透明度渐变和旋转缩放组合动画等示例。
63 12
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
|
25天前
|
UED
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
本篇将带你实现一个自定义评分星级组件,用户可以通过点击星星进行评分,并实时显示评分结果。为了让界面更具吸引力,我们还将添加一只小猫图片作为评分的背景装饰。
63 6
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
|
29天前
|
UED
「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础
在应用开发中,动画效果可以增强用户体验。鸿蒙框架提供了 translate、scale 和 rotate 等动画功能,允许对组件进行平移、缩放和旋转等操作。本篇将介绍 Animation 组件的基础知识和示例代码。
77 10
「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础
|
27天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
在鸿蒙应用开发中,Canvas 组件不仅用于基础绘图,还提供了处理复杂路径和渐变效果的多种手段,帮助开发者实现精美的静态图形。本篇将介绍如何在 Canvas 中绘制复杂路径、创建渐变填充效果。
45 7
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
|
29天前
|
大数据 UED
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List 和 Grid 组件展示数据列表
List 和 Grid 是鸿蒙开发中的核心组件,用于展示动态数据。List 适合展示垂直或水平排列的数据列表,而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件,并通过按钮实现布局切换,提升界面的灵活性和用户体验。
63 9
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List 和 Grid 组件展示数据列表