自动化单元测试可以做许多的事,并帮你节省时间。它也可以被用作快速检验新建工程或进行冒烟测试。始终,单元测试是作为一种有效的、系统的检验应用程序各功能执行的方式。Android SDK支持JUnit的自动化单元测试。本教程假设你已熟悉Android和JUnit在Eclipse的使用。

创建一个Android的JUnit项目
如果你的Eclipse中已经有Android项目,就不用再创建了。如果你的Eclipse中没有Android项目,你可以创建一个JUnit项目,在创建JUnit项目的同时也会为你创建Android项目。

对现有的Android项目,在Eclipse中右键单击,选择“Android Tools”,然后“New Test Project...”,如下图:

如果是新建Android项目,在“New Android Project”对话框中,按“Next”按钮,如下图:

无论按照上面哪种方式,你都会在这个时候创建Android项目的新测试项目。创建测试项目的对话框,如下图所示,通常会自动填写上一些标准的命名约定等细节。如果没有,请自己填写,并创造该项目。


在Android中创建一个JUnit测试用例
Android应用程序通常是由一些Activity类组成的。事实上,每一个ACtivity都可以是一个独立实体,进行测试。Android SDK中包含了几个类来测试ACtivity类。现在我们将使用一个。

右键单击你的测试项目。选择“New”,然后“JUnit Test Case”:

在新建JUnit测试用例对话框上填写,使用超类是android.test.ActivityInstrumentTestCase2,其中T是我们要测试的Activity,如下图:

点击“完成”按钮,这个类就创建成功了。注意:由向导创建的默认构造函数是不正确的。我们需要修改它,让它不带任何参数,调用不同的super()的方法,代码如下:

1 public ScreenValidation() {
2    super("com.mamlambo.testingproject.TestingProjectActivity",
3      TestingProjectActivity.class);
4 }

setUp()方法中,应配置运行这个测试用例所需的所有东西。Activity实例随时可以被getActivity()方法调用。例如:如果我们想在测试中显示一个TextView在Activity上,我们可以实现setUp()方法,如下:

1 TextView helloText;
2 protected void setUp() throws Exception {
3   super.setUp();
4   helloText = (TextView) getActivity().
5      findViewById(R.id.hello_textview);
6 }

在Android中添加单元测试
此时你可以创建各种测试。你可以获取到Activity布局上所有控件,以及在应用程序的任何代码。由于使用Activity测试用例,我们可能感兴趣于用户界面,布局,及功能。让我们看看TextView控件显示在屏幕上。

01 public void testHelloTextVisibility() {
02    View container = getActivity().findViewById(R.id.container_layout);
03    int boundaryWidth = container.getWidth();
04    int boundaryHeight = container.getHeight();
05  
06    int[] location = new int[2];
07    container.getLocationOnScreen(location);
08  
09    int[] helloTextLocation = new int[2];
10    helloText.getLocationOnScreen(helloTextLocation);
11  
12    Rect textRect = new Rect();
13    helloText.getDrawingRect(textRect);
14  
15    boolean widerThanBoundary = (textRect.width() > boundaryWidth);
16    boolean tallerThanBoundary = (textRect.height() > boundaryHeight);
17    boolean extendsOffRight = location[0] + boundaryWidth
18      > helloTextLocation[0] + textRect.width();
19    assertTrue("Text wider than boundary", widerThanBoundary);
20    assertTrue("Text taller than boundary", tallerThanBoundary);
21    assertTrue("Text goes off right side", extendsOffRight);
22  
23    // ... and so on
24  }

所有的测试方法必须用“test”做前缀。上面,我们已经创建了一个测试名为“HelloTextVisibility”的方法。如果测试通过或失败,assertFalse()都会被调用。(assertTrue()方法只有是true时调用。)

运行JUnit测试用例
运行测试和测试用例,点击Eclipse的Debug,选择Android JUnit测试。如果你喜欢,你还可以创建一个Android JUnit测试配置,自定义这些设置。
如下图,我们的小应用程序在横屏模式下,“Hello Text Visibility”测试通过:

但在竖屏模式下,未能通过测试:

很显然,我们的布局设计在竖屏模式下显示不正确。(注:这可能是设置的宽度像素超过了手机的,而没有使用合适的单位,如DP或是match_parent。)

Android应用程序的质量在于单元测试
创建单元测试时,必须小心谨慎。如果测试用例不正确,测试的东西通过了,也没有价值。这是非常糟糕的,因为它可能掩盖了一些问题。所以测试用例与代码本身一样重要。测试测试用例的主要方式是通过做代码审查,并确保它们确实在测试。

当然,测试Android框架的功能对于你的app来说,没有起到特别大的作用。比如,测试设置文本字段的值,然后读取它,看它是否相同。测试常规的TextView,并不是特别有意义的(除非你的SDK在一个新的设备上使用)。然而,如果是测试你自己实现的TextView,那就有必要了。

这并不是说任何代码框架都是那样的完美无缺,但测试的事情是值得花许多心思的去写测试开始的。如果失败了,比起的你的应用程序,你将有更大的问题。还有是对SDK之间的细微差别的测试,在上面的例子中,我们没有这么做,是因为我们使用了正确的SDK。

因此,如果你是自动化单元测试的新手,我们建议你做一些这方面的课题研究。一个不错的地方是JUnit.org

结论
在本教程中,你已经学会如何快速添加一个新的测试项目,并在Eclipse的Android项目中使用JUnit对你的app执行自动化测试。单元测试可以为逻辑测试,功能测试和用户界面测试等,不再是专门手动测试移动应用。然而,使用一个包含自动化单元测试的套件,有几大好处:它可以节省时间,金钱和资源,以及提供一套可靠的,重复性的测试,并且可以运行在许多不同的设备配置中。

Android JUnit 入门指南的更多相关文章

  1. Android Studio入门指南 (历上最全,全球首发)

    下载地址:http://pan.baidu.com/s/1CEMma 8月份的时候因为Android开发团队全部使用Android Studio进行开发,所以我整理了Android Studio的一些 ...

  2. Android Studio 入门指南

    转载: 原文链接:http://www.codeceo.com/article/android-studio-guide.html 写在前面 作为一个Android 开发者,你应该很了解Android ...

  3. android -------- NDK 入门指南

    NDK介绍 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具. 可用以从您自己的源代码构建,或者利用现有的预构建库. NDK 不适用于大多数初学的 A ...

  4. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  5. Android 虚拟现实(virtual reality)入门指南

    入门指南 本文档介绍怎样使用实验性的 Cardboard SDK for Android 创建您自己的虚拟实境 (VR) 体验. Android 演示版应用:Treasure Hunt 本教程中的代码 ...

  6. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  7. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  8. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  9. 一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档

    接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方 ...

随机推荐

  1. BZOJ 4145 [AMPPZ2014] The Prices 解题报告

    感觉也是一个小清新题.. 我们考虑设立状态 $Dp[i][s]$ 表示考虑了前 $i$ 个商店后,购买状态为 $s$ 的最小花费. 转移的话就枚举每个商店 $i$,首先令: $$Dp[i][s] = ...

  2. 使用自由软件Icarus Verilog Simulator进行仿真

    Icarus Verilog Simulator(http://iverilog.icarus.com/home)使用iverilog作为源代码编译器,编译生成vvp程序文本,使用vvp作为运行时引擎 ...

  3. C/C++/Java 程序计时功能函数

    编写程序肯定要使用计时功能,来判断程序的执行时间.今天Google了一下,自己就梳理总结一下: (1)C/C++程序计时 C/C++中使用的计时函数是clock(). C语言中的头文件对应是#incl ...

  4. Android中ActionBar及Overflow的显示

    最近在按照Android的API文档学习Android中actionbar的使用,Action bar 最基本的形式,就是为 activity 显示标题,并且在标题左边显示一个 app icon.在这 ...

  5. 实用的表格内省略号和换行(兼容IE6)

    让连续的英文数字字符换行显示 word-break: break-all; 让单行文字超出的时候使用点点点表示 white-space: nowrap; overflow: hidden; text- ...

  6. vue路由使用踩坑点:当动态路由再使用路由name去匹配跳转时总是跳转到根路由的问题

    闲话少说,直接问题: 之前我的路由时这么写的 { path:'/serverInfo/:id', name:'serverInfo', component:() => import('@/vie ...

  7. [android错误] Installation error: INSTALL_FAILED_VERSION_DOWNGRA

    错误表现: [2014-06-27 18:19:51 - XXX] Installing XXXX.apk... [2014-06-27 18:20:00 - XXX] Installation er ...

  8. c#实现验证码功能(多种模式下分别实现验证功能)详细,带注释

    网上找了很多验证相关的代码,发现有很多瑕疵.现在本人整理测试了一个实现验证码功能的代码,里面有纯数字,纯英文,英文和数字混合等三种模式.并且在必要地方都已经备有注释,希望可以帮到那些需要的人. 验证码 ...

  9. poj 3345 Bribing FIPA (树形背包dp | 输入坑)

    题目链接:  poj-3345  hdu-2415 题意 有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价钱    其中有一些国家是老大和小弟的关系,也就是说,如果你获 ...

  10. 详解 Spring 3.0 基于 Annotation 的依赖注入实现

    Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的.然而,直到 Spring 3.0 以前,使用 XML 进行依赖配置几乎是唯一的选择.Spring 3.0 的出现改变了这一状 ...