Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發筆記(一百一十三)測試工具

Android開發筆記(一百一十三)測試工具

編輯:關於Android編程

單元測試TestCase

Android的sdk提供了對項目進行單元測試的功能,開發包的android.test下面便是專門用來單元測試的類。單元測試的作用是通過模擬文本輸入和手勢輸入(如點擊操作),從而讓app自動執行一系列的操作,這樣就能夠檢查程序是否運行正常。


下面是搭建測試工程的具體步驟:
1、首先當然你得有一個待測試的app工程,最簡單的如帶有一個編輯框的Hello World工程;
2、其次在ADT中創建測試工程,操作步驟為依次選擇菜單“File”——“New”——“Other...”——“Android Test Project”,然後在彈窗中選擇待測試的工程,點擊Finish按鈕完成創建。
打開測試工程的AndroidManifest.xml,會看到裡面多了兩處配置,截圖如下:
\
第一處配置是instrumentation節點,表示要對哪個工程進行測試,其中android:name屬性固定填“android.test.InstrumentationTestRunner”,android:targetPackage屬性填待測試的工程包名。
另一處配置是uses-library節點,android:name屬性值固定填“android.test.runner”。
3、在測試工程中創建一個TestCase的派生類,該派生類可從ActivityTestCase可繼承自ActivityTestCase,也可繼承自InstrumentationTestCase。
4、右擊測試工程,在右鍵菜單中依次選擇“Run As”——“Android JUint Test”,即可在測試設備上看到單元測試的運行頁面。


下面是一個TestCase派生類的代碼例子:
import android.os.SystemClock;
import android.test.InstrumentationTestCase;
import android.util.Log;

public class Sampletest extends InstrumentationTestCase {
	private final static String TAG = "Sampletest";

    private MainActivity activity = null;
    private Button btn = null;
    private TextView tv = null;
    
    //初始化設置,初始化頁面對象與控件對象
    @Override  
    protected void setUp()  {
        try {
            super.setUp();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Intent intent = new Intent();
        intent.setClassName("com.example.test", MainActivity.class.getName());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        activity = (MainActivity) getInstrumentation().startActivitySync(intent);
        tv = (TextView) activity.findViewById(R.id.tv);
        btn = (Button) activity.findViewById(R.id.btn);
    }
    
    //垃圾清理與資源回收,測試完畢退出頁面
    @Override  
    protected void tearDown()  {
        activity.finish();
        try {
            super.tearDown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //活動功能測試,凡是public且以test打頭的函數,均會被JUnit測試到
    public void testActivity() throws Exception {
        Log.d(TAG, "test the Activity");
        SystemClock.sleep(1000);//先sleep一會,這時的文字是hello  
        for(int i=0; i<1000; i++) { //點擊1000次  
            getInstrumentation().runOnMainSync(new PerformClick(btn));
        }
        SystemClock.sleep(2000);//再sleep一會,這時看到的文字是Hello Android
        Log.d(TAG,  tv.getText().toString());
        assertEquals("Hello World", tv.getText().toString());
        //注意,這裡做了一個判斷,判斷當前tv標簽控件的文字是不是Hello World,當然不是,所以這句判斷是錯的!!!!  
    }

    private class PerformClick implements Runnable {
        Button btn;
        public PerformClick(Button button) {
            btn = button;
        }
  
        public void run() {
            btn.performClick();
        }
    }
}


如果你是在Android Studio上開發,那在創建Android工程時便已生成測試類,默認名稱是ApplicationTest.java,測試代碼的編寫規則同Eclipse,這裡就不再贅述。


自動化測試框架Robotium

上面提到的測試代碼編寫,其實比較繁瑣,一般只用於單個頁面的測試,所以簡單帶過不作詳述。實際工作中常用的是Robotium這個工具,它是Android官方提供的測試框架,不但方便開發者編寫測試代碼進行調試,而且也支持在多個頁面中跳轉測試。


使用Robotium仍然是要一步一步創建測試工程,只不過在測試工程中導入Robotium的jar包,並在TestCase中使用Solo類編寫測試代碼。Robotium的最新jar包是robotium-solo-5.3.1.jar,下載地址是 http://pan.baidu.com/s/1qXHT9OK


Robotium的代碼編寫不難,我就直接上官方的demo代碼,補充中文注釋便一目了然了,代碼如下:
import com.robotium.solo.Solo;
import com.example.android.notepad.NotesList;

import android.test.ActivityInstrumentationTestCase2;

public class NotePadTest extends ActivityInstrumentationTestCase2{

	private Solo solo;

	public NotePadTest() {
		super(NotesList.class);
	}

	@Override
	public void setUp() throws Exception {
		//初始化一個Solo對象
		solo = new Solo(getInstrumentation(), getActivity());
	}

	@Override
	public void tearDown() throws Exception {
		//測試結束要關閉所有打開的頁面
		solo.finishOpenedActivities();
	}

	//測試添加記錄
	public void testAddNote() throws Exception {
		//解鎖屏幕
		solo.unlockScreen();
		//點擊菜單項“Add note”
		solo.clickOnMenuItem("Add note");
		//聲明NoteEditor這個頁面已經打開
		solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); 
		//往序號為0的編輯框輸入“Note 1”
		solo.enterText(0, "Note 1");
		//回到上一頁
		solo.goBack(); 
		//點擊菜單項“Add note”
		solo.clickOnMenuItem("Add note");
		//往序號為0的編輯框輸入“Note 2”
		//注意enterText和typeText的區別在於:typeText是模擬鍵盤輸入,
		//所以typeText的字符串中如果包含“\n”會轉為換行符,而enterText只會原樣顯示字符串“\n”
		solo.typeText(0, "Note 2");
		//回到上一頁
		solo.goBack(); 
		//捕捉屏幕截圖並保存到默認路徑:Environment.getExternalStorageDirectory()+"Robotium-Screenshots/".
		solo.takeScreenshot();
		//檢查是否找到“Note 1”和“Note 2”
		boolean notesFound = solo.searchText("Note 1") && solo.searchText("Note 2");
		//如果找到則通過測試
		assertTrue("Note 1 and/or Note 2 are not found", notesFound); 
	}
	
	public void testEditNote() throws Exception {
		//點擊列表視圖的第二項,即進入到該記錄的編輯頁面
		solo.clickInList(2); 
		//隱藏軟鍵盤
		solo.hideSoftKeyboard();
		//變更屏幕方向為水平方向
		solo.setActivityOrientation(Solo.LANDSCAPE);
		//點擊菜單項“Edit title”
		solo.clickOnMenuItem("Edit title");
		//往序號為0的編輯框追加輸入“ test”
		solo.enterText(0, " test");
		//回到上一頁
		solo.goBack();
		//設置屏幕方向為垂直方向
		solo.setActivityOrientation(Solo.PORTRAIT);
		//使用通配符查找是否存在指定文本
		boolean noteFound = solo.waitForText("(?i).*?note 1 test"); 
		//如果找到則通過測試
		assertTrue("Note 1 test is not found", noteFound); 
	}
	
	public void testRemoveNote() throws Exception {
		//使用通配符查找是否存在包含test的文本
		solo.clickOnText("(?i).*?test.*");
		//點擊菜單項“Delete”
		solo.clickOnMenuItem("Delete");
		//查找是否存在文本“Note 1 test”
		boolean noteFound = solo.searchText("Note 1 test");
		//如果沒找到則通過測試
		assertFalse("Note 1 Test is found", noteFound);  
		//長按文本“Note 2”
		solo.clickLongOnText("Note 2");
		//在彈出的上下文菜單中點擊文本“Delete”
		solo.clickOnText("Delete");  
		//等待100毫秒後查找是否存在文本“Note 2”
		noteFound = solo.waitForText("Note 2", 1, 100);
		//如果沒找到則通過測試
		assertFalse("Note 2 is found", noteFound);  
	}
}


功能測試/常用模擬器

ADT和Adnroid Studio都提供了自帶的模擬器,用於開發者測試app的頁面功能,可是眾所周知,自帶的模擬器又耗資源、運行又慢,所以實際開發中基本不用自帶模擬器。那麼調試app的設備主要有下面幾種:
1、下載並安裝國外模擬器Genymobile,還要在Eclipse中安裝Genymobile插件,這樣便能在Eclipse中使用Genymobile。但該模擬器搭建環境很繁瑣,首先下載前要在它的官網注冊,安裝時又要指定虛擬機,不夠傻瓜。
2、安裝國內的模擬器,比如博主一開始用的是夜神模擬器,後來又改用逍遙安卓模擬器。總的來說,國產模擬器不但操作方便,而且比國外模擬器更貼近國人的使用習慣。
3、把真機用數據線插到電腦的usb口,直接使用真機測試app。但這對真機的要求比較高,如果真機的系統版本比較老,那就無法測試高版本上的新特性。


性能測試工具

DDMS

DDMS是ADT自帶的測試監控服務,實際開發中一般主要用到它的三個功能:
1、首先當然是LogCat服務,開發者都在該日志窗口查看app運行日志;
2、其次是File Explorer窗口,通過該窗口我們可以往測試設備上傳文件,或者下載文件;
3、再次就是檢查內存洩漏時用到的Heap窗口,有關內存洩漏的介紹參見《Android開發筆記(七十五)內存洩漏的處理》,下面是Heap窗口的內存數據截圖:
\


APT

APT是一個用於app性能測試的Eclipse插件,源碼主頁在https://code.csdn.net/Tencent/apt/tree/master。
使用的時候,只需把最新的jar包如APT_Eclipse_Plugin_1.1.8.jar復制到Eclipse的plugins目錄,然後重啟Eclipse即可。在ADT上依次選擇菜單“Window”——“Open Perspective”——“Other”——“APT”即可打開APT透視圖,即可在該頁面查看手機上各進程的cpu和內存使用情況。
不過我這邊打開APT後並未看到詳細的運行情況,不知咋回事,查看APT的項目主頁,發現它最後一次更新時間是2014年12月份,其開發團隊後面轉去另一個性能測試項目GT了,所以想想還是不必深究APT了。


GT

GT的官網是http://gt.qq.com/。下面是官網對它的介紹:GT(隨身調)是APP的隨身調測平台,它是直接運行在手機上的“集成調測環境”(IDTE, Integrated Debug Environment)。利用GT,僅憑一部手機,無需連接電腦,您即可對APP進行快速的性能測試(CPU、內存、流量、電量、幀率/流暢度等等)、開發日志的查看、Crash日志查看、網絡數據包的抓取、APP內部參數的調試、真機代碼耗時統計等。
使用GT要在官網下載GT安裝包,如最新版本是GT_2.2.6.4.apk,把該apk包安裝到手機上,啟動GT後就能對指定app進行性能監控。下面是GT的首頁截圖:
\


機型測試網站

app在真機和模擬器上測試通過了,這並不意味著萬事大吉,因為Android是個開源的系統,各廠家都可以進行定制修改,所以在A品牌手機上運行正常的app,也許在B品牌手機上就會發生崩潰。可是Android的手機廠家不像ios只有蘋果一家,而是百花齊放、千軍萬馬,國內廠家就有華為(mate、榮耀)、小米(小米、紅米)、步步高(vivi、oppo)、聯想、中興、酷派、魅族、TCL、HTC等等,國外廠家則有三星、LG、索愛等等,要想在這麼多品牌手機上都測試一遍,測試人員都要累趴了。


基於此,現在有多個專業的雲測試網站,它們提供了少則一百、多則上萬機型的兼容測試服務,開發者只需注冊並上傳app安裝包,即可在一天之內收到多種機型的測試報告,極大方便了我們的測試工作。下面是幾個比較大的雲測試網站:
TestIn : http://testin.cn/
易測雲 : http://www.yiceyun.com/
智測雲 : http://www.smarterapps.cn/
百度MTC : http://mtc.baidu.com/
騰訊優測 : http://utest.qq.com/
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved