標籤:
Android提供了上面的多個測試類別,可以允許我們對於單個方法、Activity、Service、Application等多個對象進行測試,單元測試可以很方便的讓我們對代碼進行測試,並且方便對重構後的代碼進行檢查。本篇將簡要的講解如何對Android中的對象進行測試。
一、準備工作
二、測試與Android運行環境無關的方法
2.1 InstrumentationTestCase
當你要測試與Android環境無關的方法時,推薦繼承InstrumentationTestCase來進行測試。比如下面的比大小的方法就很適合做這樣的測試。
public static int getMax(int a, int b) { return a >= b ? a : b; }
得到版本號碼的代碼因為涉及到了Context所以和android啟動並執行環境有關,我們必須要傳入一個上下文(context)對象,這時繼承InstrumentationTestCase就沒有辦法進行測試了。
/** 取得當前應用的版本號碼 * @param context * @return */ public static String getVersionName(Context context) { try { PackageInfo manager = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return manager.versionName; } catch (NameNotFoundException e) { return "Unknown"; } }
那麼是不是用它就不能對activity這樣的東西進行測試了呢?也不是,我們仍舊可以用它來測試Activity,前題是要通過代碼初始化對象,但因為它的子類可以針對Activity進行完善的測試,所以我們一般不用它來做測試activity的工作。第二節中,先給出了一個簡單的demo,然後給出用它測試activity的demo。
2.2 舉例
測試的目標類——MyUtils:
package com.kale.androidtest;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager.NameNotFoundException;public class MyUtils { public static int getMax(int a, int b) { return a >= b ? a : b; }}
測試類別——MySimpleTest:
package com.kale.androidtest.test;import com.kale.androidtest.MyUtils;import android.test.InstrumentationTestCase;public class MySimpleTest extends InstrumentationTestCase { public void testGetMax(){ int max = MyUtils.getMax(1, 3); assertEquals(3, max); }}
附:測試Activity
activity的代碼就不貼了,裡面有個editText,這裡的測試也是簡單的例子,表示它可以用來測試activity,例子沒有任何實際意義。
package com.kale.androidtest.test;import android.content.Intent;import android.os.SystemClock;import android.test.InstrumentationTestCase;import android.widget.EditText;import com.kale.androidtest.MyActivity;/** * @author:Jack Tony * @description : * @web: http://www.oschina.net/question/54100_27061 * @date :2015年2月19日 */public class MySampleTest2 extends InstrumentationTestCase { MyActivity mActivity; EditText mEditText; @Override protected void setUp() throws Exception { // 用intent啟動一個activity Intent intent = new Intent(); intent.setClassName("com.kale.androidtest", MyActivity.class.getName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mActivity = (MyActivity) getInstrumentation().startActivitySync(intent); } /** * @description 測試是否初始化完成 * */ public void testInit() { mEditText = mActivity.getEditText(); assertNotNull(mActivity); assertNotNull(mEditText); } /** * @description 測試得到activity中editText中的文字 * */ public void testGetText() { mEditText = mActivity.getEditText(); String text = mEditText.getText().toString(); assertEquals("", text); } /** * @description 測試設定文字的方法 * */ public void testSetText() { mEditText = mActivity.getEditText(); // 在主線程中設定文字 getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { mEditText.setText("kale"); } }); // 暫停1500ms SystemClock.sleep(1000); assertEquals("kale", mEditText.getText().toString()); } /** * 垃圾清理與資源回收 * * @see android.test.InstrumentationTestCase#tearDown() */ @Override protected void tearDown() { mActivity.finish(); try { super.tearDown(); } catch (Exception e) { e.printStackTrace(); } }}
三、測試Application
Android單元測試