在Android应用开发中,相信很少有人在坚持先由设计人员做完整的概要设计 、详细设计,然后交给程序员进行编码实现了。通常是在有一个大体框架的情况下,就开始进行具体编码开发了。在这种情形下,开发速度可以有很大的提高,但是最终代码质量却不可避免的降低了。如何能既保持开发速度,同时又能保证开发质量呢?相信测试驱动开发是一种比较可行的开发方法学。

测试驱动开发首先通过设计测试用例,对从用户需求到方法接口进行细化,在构想这些测试用例的过程,就是站在使用者角度上来思考系统的过程,而传统方法中设计人员通常是站在技术人员的角度来思考问题,两者比较,显然测试驱动开发更有助于开发出更符合用户需求的产品,同时开发出高复用性代码。

测试驱动开发先写测试,这样就保证了充分考虑到了方法使用者需要,可以使方法更加合理。接下来进行代码开发,以尽可能短的时间通过测试用例,在这个过程中暂时忘掉OO和设计模式吧。当通过测试用例之后,我们再回过头来审视我们的代码实现,再去除类间依赖关系,使用恰当的设计模式,这比在开始阶段凭空想象要好得多。反复上述过程,自然可以得到质量更高的代码和系统。

然而,在Android系统下,进行测试驱动开发又增加了额外的难度,怎样对Activity、Provider、Service、Broadcaster等进行单元测试,是一个必须要解决的问题,下面我们就以一个实际系统的开发,来看一看怎么解决这一系列的问题。

进行测试驱动开发,首先要做的就是建立一个真正可运行的骨架系统,做Android下的测试驱动开发也不例外。

先建立一个Android工程,这里以mhcs为例,采用Eclipse向导,建立该工程。假设这个工程在用户第一次使用时,需要显示三个介绍页面,用户在一张一张划过之后,才开始使用正常功能。接下来我们就以这个功能为例,详细描述一下在Android下怎样进行测试驱动开发。

首先,准备三张介绍图片,放入res/drawable目录下。我们定义FlipIntroActivity类来处理用户的划动操作及介绍图片显示。由于我们要在用户第一次运行时才向用户显示介绍页面,因些需要保存用户是否第一次使用系统的信息。我们利用Application的子类AppPreferences来管理应用所需的所有信息。

这时我们需要完成的功能就很清楚了,程序在第一次运行时显示介绍页面,而之后的运行中,不显示介绍页面。是否显示介绍页面,由AppPreferences类来管理。

下面在Eclipse里建立测试工程,选择新工程类型为Android Junit Test工程,同时选择上面建立的工程作为被测试工程。

好了,最小可运行骨架系统已经建立好了,下面就可以进入正式的测试驱动开发流程了。

首先写测试用例:新建类AppPreferencesTest,由于被测试类AppPreferences是Application的子类,因此AppPreferencesTest类需要继承ApplicationTestCase

public class AppPreferencesTest extends ApplicationTestCase<AppPreferences> {public AppPreferencesTest(Class<AppPreferences> applicationClass) {super(applicationClass);}}

我们首先测试AppPreferences在第一次运行时,可以返回true,在AppPreferencesTest类里添加如下测试代码:

public void testFirstRunTrue() {assertTrue(prefs.isFirstRun());}private AppPreferences prefs = new AppPreferences();

这如你所看到的,这段代码编译器立即使出错误,不要担心,测试驱动开发总是从不能通过的测试用例开始的,每次努力通过一个测试用例,在通过一个个测试用例的过程中取得进展。

下面我们首先编写代码,通过这个测试用例,我们在AppPreferences类中添加如下代码:

 public boolean isFirstRun() {return isFirstRun;}public void setFirstRun(boolean isFirstRun) {this.isFirstRun = isFirstRun;}private boolean isFirstRun = true;

但是,如果是第二次运行,系统不是还会显示true吗?这明显是不正确的!一点儿没错,这段代码确实没有实现我们之前的想法,但是这段代码却可以通过我们的测试用例,测试驱动开发的原则就是以尽量快的速度通过测试用例。

好了,在测试工程中选择AppPreferencesTest,然后选择Android Junit Test,系统运行,你会在Junit视图中看到绿色用例通过标记。

下面添加一段代码,测试当第二次运行时的情况:

 public void testSecondAndMoreRun() {prefs.isFirstRun();assertFalse(prefs.isFirstRun());}

运行上述工程,结果测试用例testSecondAndMoreRun不能通过,下面我们就来处理这种情况,在生产工程中的AppPreferences类中添加如下代码:

 public boolean isFirstRun() {boolean orgVal = isFirstRun;isFirstRun = false;return orgVal;}

这时再来运行测试工程的AppPreferencesTest类,又可以看到令我们心旷神怡的绿色通过标志了。

下面就剩下第一次运行可以通过,第二次运行不能通过。具体代码如下所示:

在生产项目的类AppPreferences中添加:

 @Overridepublic void onCreate() {super.onCreate();}public void onTerminate() {super.onTerminate();}public boolean isFirstRun() {prefs = getSharedPreferences("mhcs", MODE_PRIVATE);boolean orgVal = isFirstRun;isFirstRun = false;Editor editor = prefs.edit();editor.putBoolean(PREF_IS_FIRST_RUN, false);editor.commit();return orgVal;}public void setFirstRun(boolean isFirstRun) {this.isFirstRun = isFirstRun;}public final static String PREF_IS_FIRST_RUN = "isFirstRun";private SharedPreferences prefs = null; private boolean isFirstRun = true;

在测试项目的测试类中添加代码:

 public void testFirstRunTrue() {createApplication();prefs = getApplication();Editor editor = mContext.getSharedPreferences("mhcs", 0).edit();editor.clear().commit();assertTrue(prefs.isFirstRun());}public void testSecondAndMoreRun() {createApplication();prefs = getApplication();assertFalse(prefs.isFirstRun());}

尤其需要注意的是testFirstRunTrue方法中,先将SharedPreferences清空的处理,这样可以模拟程序安装后第一次运行。

运行测试项目的测试用例,终于可以看到完整功能的绿色通过标志了。

Android测试驱动开发实践相关推荐

  1. 测试驱动开发实践1————项目代码生成

    [内容指引] 领域驱动开发: 云端生成项目代码: 项目代码结构介绍. 一.领域驱动开发 1."云开发"开发者社交平台概述 "云开发"开发者社交平台是一个基于互联 ...

  2. TDD测试驱动开发入门实践

    最近和团队同学们分享了测试驱动开发实践,把分享的内容同步在博客上,主要分为三个方面,简单介绍软件测试的发展历程,为什么需要使用TDD,TDD的在编码中的实践. 一,软件测试的发展历程 调试为主:  怎 ...

  3. 对测试驱动开发的一些理解

    对测试驱动开发的一些理解 测试驱动开发解决什么问题? 系统测试和集成测试不容易覆盖一些代码细节,难以做到很高的代码覆盖率:测试驱动开发编写的测试一般是单元测试,而且由开发者编写,针对单个模块容易做到各 ...

  4. 「敏捷架构」核心实践:测试驱动开发(TDD)简介

    测试驱动开发(TDD) 是一种渐进的开发方法,它结合了测试优先的开发,即在编写足够的产品代码以完成测试和重构之前编写测试.TDD的主要目标是什么?一个观点是TDD的目标是规范而不是验证(Martin, ...

  5. 【架构 Flutter实践 Clean架构 TDD测试驱动开发---1.0】

    ----------- 2022-11-12 补充 ----------- 最近在开发中尝试用了clean架构,感觉就是 麻烦...太多模板代码,很容易过度开发. 我认为了解这些理念是很重要的,但应该 ...

  6. 测试驱动开发(TDD)的实践

    测试驱动开发(TDD)的实践 本文作者: Mr.J 本文链接: https://jiangtj.com/articles/almond/test-driven%20development/ 测试驱动开 ...

  7. 测试驱动开发与行为驱动开发中的测试先行方法

    Gil Zilberfeld将在 Agile Practitioners会议上举办小型研讨会,讨论测试先行(test first)方法,测试驱动开发(TDD)和行为驱动开发(BDD)的基础. \\ \ ...

  8. 测试驱动开发 测试前移_测试驱动的开发可能看起来是工作的两倍-但无论如何您都应该这样做...

    测试驱动开发 测试前移 by Navdeep Singh 通过Navdeep Singh 测试驱动的开发可能看起来是工作的两倍-但无论如何您都应该这样做 (Test-driven developmen ...

  9. 书评:测试驱动开发的艺术

    读罢<测试驱动开发的艺术>,忽然想起中国传统文化中的"道器之辩".<易经>曰:形而上者谓之道,形而下者谓之器.中国的传统文化常常是重道轻器,认为道本器末,即 ...

最新文章

  1. 百度之星12月30号题目之维基解密
  2. 在 Flutter 中使用 NavigationRail 和 BottomNavigationBar
  3. cordova报错:ANDROID_SDK_ROOT=undefined (recommended setting)
  4. 边界化难题终结者!将自监督学习应用到自动驾驶上 | CVPR 2021
  5. centos / Linux 服务环境下安装 Redis 5.0.3
  6. 【pyqt5学习】——graphicView显示opencv图像
  7. Spring技术栈系列教程-- SpringMVC 、SpringBoot 、SpringCloud
  8. 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式
  9. OpenAI升级Codex,直接将书面语言转为计算机代码;区块链网站被黑客偷走6亿美元加密货币|极客头条...
  10. 云服务器如何清理垃圾释放空间?
  11. ORCALE常用查询语句
  12. Java longTime 和C#日期转换
  13. keil5破解失败【经验分享】
  14. 关于2020年美赛F奖的经验贴
  15. 看 AWS 如何通过 Nitro System 构建竞争优势
  16. FSA-Net 模型运行——代码调试
  17. 18650锂电池知识全解析
  18. 提示未登录,点确认,跳到登陆页
  19. 基于java的城市公交查询管理系统
  20. 安装android到u盘安装程序,即插即用,把安卓系统装进U盘里

热门文章

  1. 打开新世界大门,测试人可以用Chrome插件干什么?
  2. Linux内核之devfs、sysfs、udev
  3. (20)全民小视频引流脚本模块化开发14-给脚本添加本地授权By飞云脚本学院
  4. c语言git代码注释风格,git代码格式化上传
  5. 工具 | Windows 功能猎手 (WFH)
  6. Codasip通过收购Cerberus增强RISC-V处理器设计的安全性
  7. 马洛斯需求层次模型在用户体验中的理解
  8. 公租自行车-北京经济技术开发区
  9. latex 输入上极限和下极限
  10. 热门软件看点:QQ和它的对手们 收藏 转载