在正式进行Android测试驱动开发之前,不得不先提一下Android应用架构问题。在传统软件开发中,MVC架构得到了广泛的应用,然而在Android开发中,很少见应用采用了MVC架构(不要说Android及Widget全部采用的是MVC架构,那是系统的事,我们讲的是应用程序开发),究其原因可能是初期Android应用大多较为简单,没有采用的必要,而后期一直在沿用初期的习惯。但是遇到一些复杂的应用,例如同样的数据在多个Activity中显示,如果数据分散在多个Activity中,那么数据发生更新,很有可能出现数据不一致的情况,尤其是Android应用为节省带宽大量使用缓存的情况下,这种情况更加突出。我所经历的项目中,大部分项目都或多或少存在这个问题。因此,采用MVC架构开发Android应用程序也许是一个值得尝试的方法。所以,在这里我们也会采用MVC架构来做应用程序的开发,虽然我们的架构未必在理论上很完备,也不一定能解决实际应用中的所有问题,但是采用MVC架构的的确确可以提高程序的质量,同时也会使程序的可测试性大大增强。

言归正传,我们现在就开测试驱动开发。

首先建立一个Android工程,例如wkj,然后建立一个Android测试工程如WkjTest,这样就构成了一个Android测试开发的起点,下面就让我们正式开始Android测试驱动开发吧!

我们开始编写第一个测试用例,由于是空工程,我们首先要测试的是MainActivity正确显示出AppModel所提供的应用名称-维康街。什么?Android创建的工程显示的是Hello World,怎么会是维康街?而且AppModel是个什么东西?细心的读者的这些问题没错,这就是测试驱动开发的工作模式:先写出失败的测试程序,然后再通过编程来通过这些测试用例。

打开WkjTest工作,创建新类MainActivityTest,并指定该类继承自android.test.ActivityInstrumentationTestCase2,代码如下所示:

package com.bjcic.wkj.test;import com.bjcic.wkj.MainActivity;import android.app.Activity;import android.test.ActivityInstrumentationTestCase2;import android.widget.TextView;public class MainActivityTest extends ActivityInstrumentationTestCase2 {public MainActivityTest() {super(MainActivity.class);}/** * 每个测试用例开始运行前必须执行的代码 */@Overrideprotected void setUp() throws Exception {super.setUp();setActivityInitialTouchMode(false);activity = getActivity();}/** * 每个测试用例运行结束时必须执行的代码 */@Overrideprotected void tearDown() throws Exception {super.tearDown();}/** * 测试界面上标题文字为:维康街 */public void testTemp001() {titleTxtv = (TextView)activity.findViewById(com.bjcic.wkj.R.id.j_titleTxtv);assertEquals(activity.getString(com.bjcic.wkj.R.string.welcome_msg), titleTxtv.getText());}private Activity activity = null; private TextView titleTxtv = null;}

在WkjTest工程中,选中MainActivityTest类,点右键,选择Run As....然后选Android JUnit Test,在随后弹出的界面选择测试设备,运行程序后,在Junit视图会显示,执行了test001测试用例,并且该测试用例失败了,这正是我们目前所需要的结果。

另外,注意我们对测试用例的命名,testTemp001,表明是临时性的测试用例。采用这种方式命名的测试用例,表明是在开发过程中使用的临时测试用例,不是用于回归测试中的正式测试用例。

下面开始编写功能性代码,来使这个测试用例通过。

还记得在本文开头处提到的MVC架构吗?现在我们就开始来一步步实现这个MVC架构。我们将Activity当作视图View,View读取Model中数据并显示到界面上,testTemp001这是为了测试这一工作模式。

在Android中怎样来实现一个Model呢?实现Model当然有很多种方式,我在这里采用扩展Application类来当作Model,即定义AppModel并继承Application,这样做的好处是Model不用采用Singleton模式也可以实现单例模式了,而且可以很方便在Activity中获取到。在我们这个最简单的应用中,需要Model中存在welcom_msg信息,这时在MainActivity中才可以通过向Model请求数据并显示在界面中。

AppModel类如下所示:

package com.bjcic.wkj;import android.app.Application;public class AppModel extends Application {// 生命周期方法开始public void onCreate() {super.onCreate();welcomeMsg = getString(R.string.welcome_msg);}public void onTerminate() {super.onTerminate();}// 生命周期方法结束private String welcomeMsg = null;public String getWelcomeMsg() {return welcomeMsg;}public void setWelcomeMsg(String welcomeMsg) {this.welcomeMsg = welcomeMsg;}}

在MainActivity中添加如下代码:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);appModel = (AppModel)getApplication();}@Overridepublic void onResume() {super.onResume();((TextView)findViewById(R.id.j_titleTxtv)).setText(appModel.getWelcomeMsg());}private AppModel appModel = null;

最后在Manifest文件中添加:

 

这时再回到WkjTest工程,选中MainActivityTest类,右键选择Run As .... =>Android JUnit Test,这时Junit视图将显示测试用例通过。就这样,我们的第一个测试驱动开发周期就结束了。



更多相关文章

  1. Android开发者必知的开发资源
  2. Android平台架构及特性(1)
  3. CTS bug排除
  4. 开发自己的监控系统三、移动篇(android)
  5. 利用HTML5开发Android笔记
  6. Android(安卓)开发未来的出路何在? | 技术头条
  7. Dojo Mobile:iPhone/Android的Web应用开发利器
  8. 移动开发参考书之Android篇
  9. 万树:Java和Android有什么联系?有什么区别?学哪个好?

随机推荐

  1. Android(安卓)Series: GET, POST and Mul
  2. android 将Bitmap转YUV420sp(实例)
  3. android中用HTTP请求将经纬度解析为具体
  4. Android(安卓)数据存储方式有哪几种
  5. SystemUI下的RecentActivity
  6. android使用Activity
  7. Eclipse运行工程报AVD没有找到错误解决过
  8. Cocos 2d-x 3.8 在ubuntu下使用QtCreator
  9. Android(安卓)OpenGL ES 包及流程摘要
  10. 在Android中访问WebService接口