Android開發中單元測試的兩種方式
Android開發中單元測試的兩種方式
一位優秀的程式設計師也同樣不能保證自己的程式沒有bug,因此編寫合適的測試程式是完全有必要的,這樣也會降低程式在後期出現各種奇奇怪怪bug的可能,降低維護成本,未雨綢繆將bug扼殺在搖籃之中。
看到網上有很多依舊用寫java單元測試的方式在寫android程式的單元測試程式——junit,當然我一直都反感將不合時宜的東西強搬到新的技術應用以獲取一席之地的這種做法,不斷的應用新的方法提高效率,完善程式才是真理!廢話不多說,直接說到今天的重點:Android開發中單元測試的兩種辦法;第一種是直接附著在工程體內,第二種則是新建一個android測試工程;這兩種方法都不錯,也異曲同工;當然後一種更為正規,也更是我們應該掌握的。
第一種單元測試方法:
將測試類直接放在被測試工程中
編寫一個測試類,這個類是直接放在需要測試的工程junitest中的;當然為了實現測試這個工程的目的進行相關的配置是必須的,在此之前我將這個工程的程式碼做簡單說明:junitest工程原始碼中MainActivity.java是自帶無修改的,PersonService.java是一個簡單的功能類以作測試之用:
package com.example.server; public class PersonService { public PersonService() { // TODO Auto-generated constructor stub } public void save(String username) { String sub = username.substring(6); } public int add(int a, int b) { return a+b; } }
重點就是測試PersonService.java中的兩個函式save和add的功能是否正常。
好,瞭解了工程程式碼之後我們開始配置做測試單元的準備工作,一共兩點:
1、在AndroidManifest.xml檔案中:
<uses-library android:name="android.test.runner"/>
這一行放在application節點之中
這一個節點放在application節點之外,注意將com.example.server替換成被測試的工程的包名。<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.server" android:label="this is my test class"></instrumentation>
2、編寫測試類
我是以test.java做的demo,這個類的編寫需要注意的是一定要繼承一個測試框架類AndroidTestCase;然後在這個繼承類中寫被測試工程的各個函式的測試函式。
這裡我將我配置的AndroidManifest.xml和測試類都貼出來:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.server"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.server.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="android.test.runner"/>
</application>
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.server"
android:label="this is my test class"></instrumentation>
</manifest>
和測試用例:
package com.example.test;
import junit.framework.Assert;
import com.example.server.PersonService;
import android.test.AndroidTestCase;
public class test extends AndroidTestCase {
public void testSave() throws Exception{
PersonService service = new PersonService();
service.save(null);
}
public void testAdd() throws Exception{
PersonService service = new PersonService();
int actual = service.add(1, 2);
Assert.assertEquals(3, actual);
}
}
然後我們點選測試類,在對應的outline框中應該是能看到對應函式的
選擇需要測試的函式,選擇Run as --> Android Junit Test然後選擇指定的模擬器或真機應該就能通過Junit欄對應的標示來分析被測試之函式是否符合要求了。
(綠色表示是正確的)
(紅色表示有錯誤,後面則將錯誤的詳細資訊都打印出來了)
附加:剛剛在做demo的時候突然一直出現Test fail ,no test resault。一直在需找問題的所在,最後又神奇的正常……寫程式不怕錯誤,就怕錯的不明不白,正常的不知所措!剛剛的問題很有可能是我私自刪除了建構函式造成的……看來程式還是要精心呵護的。
第二中單元測試方法
單獨寫一個android測試工程來測試
這樣做其實是更規範的做法,並且需要我們掌握,而且相對而言簡單,省事兒。
1、首先就是新建android測試工程
2,按照提示,選擇自己是要測試哪一個工程:
3、最後就直接新建測試類
如同方法一中所說進行測試就可以了。這時候我們開啟這個測試類的Androidmanifest.xml檔案我們發現,原先需要我們自己配置的早就已經配置好了,這就是這中測試方法的方便之處了。
最後:關於單元測試,自己總結的幾點:
1、配置AndroidManifest.xml,其中就只有兩處
2、繼承AndroidTestCase
3、寫的測試函式一定要是void public的;並且要throws Exception因為在測試框架中,這樣寫利於測試框架得到異常資訊
4、寫的測試函式名最好為Test + 被測函式名