在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中添加:
@Override
public 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清空的处理,这样可以模拟程序安装后第一次运行。
运行测试项目的测试用例,终于可以看到完整功能的绿色通过标志了。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341