編寫:huanglizhuo - 原文:http://developer.android.com/training/activity-testing/activity-basic-testing.html
為了驗證應用的佈局設計和功能是否符合預期,為應用的每個Activity建立測試非常重要。對於每一個測試,我們需要在測試用例中創建一個個獨立的部分,包括測試數據,前提條件和Activity的測試方法。之後我們就可以運行測試並得到測試報告。如果有任何測試沒有通過,這表明在我們代碼中可能有潛在的缺陷。
注意: 在測試驅動開發(TDD)方法中, 不推薦先編寫大部分或整個應用,並在開發完成後再運行測試。而是應該先編寫測試,然後及時編寫正確的代碼,以通過測試。通過更新測試案例來反映新的功能需求,並以此反覆。
Activity測試都是通過結構化的方式編寫的。請務必把測試代碼放在一個單獨的包內,從而與被測試的代碼分開。
按照慣例,測試包的名稱應該遵循與應用包名相同的命名方式,在應用包名後接“.tests”。在創建的測試包中,為我們的測試用例添加Java類。按照慣例,測試用例名稱也應遵循要測試的Java或Android的類相同的名稱,並增加後綴“Test”。
要在Eclipse中創建一個新的測試用例可遵循如下步驟:
a. 在Package Explorer中,右鍵點擊待測試工程的src/文件夾,New > Package。
b. 設置文件夾名稱<你的包名稱>.tests
(比如, com.example.android.testingfun.tests
)並點擊Finish。
c. 右鍵點擊創建的測試包,並選擇New > Calss。
d. 設置文件名稱<你的Activity名稱>Test
(比如, MyFirstTestActivityTest
),然後點擊Finish。
測試數據集包含運行測試前必須生成的一些對象。要建立測試數據集,可以在我們的測試中覆寫setUp()和tearDown()方法。測試會在運行任何其它測試方法之前自動執行setUp()方法。我們可以用這些方法使得被測試代碼與測試初始化和清理是分開的。
在你的Eclipse中建立測試數據集:
1 . 在 Package Explorer中雙擊測試打開之前編寫的測試用例,然後修改測試用例使它繼承ActivityTestCase的子類。比如:
public class MyFirstTestActivityTest
extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
2 . 下一步,給測試用例添加構造函數和setUp()方法,併為我們想測試的Activity添加變量聲明。比如:
public class MyFirstTestActivityTest
extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
private MyFirstTestActivity mFirstTestActivity;
private TextView mFirstTestText;
public MyFirstTestActivityTest() {
super(MyFirstTestActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mFirstTestActivity = getActivity();
mFirstTestText =
(TextView) mFirstTestActivity
.findViewById(R.id.my_first_test_text_view);
}
}
構造函數是由測試用的Runner調用,用於初始化測試類的,而setUp()方法是由測試Runner在其他測試方法開始前運行的。
通常在setUp()
方法中,我們應該:
setUp()
調用父類構造函數,這是JUnit要求的。我們可以使用getActivity()方法得到正在測試的Activity的引用。
我們最好在執行測試之前,檢查測試數據集的設置是否正確,以及我們想要測試的對象是否已經正確地初始化。這樣,測試就不會因為有測試數據集的設置錯誤而失敗。按照慣例,驗證測試數據集的方法被稱為testPreconditions()
。
例如,我們可能想添加一個像這樣的testPreconditons()
方法:
public void testPreconditions() {
assertNotNull(“mFirstTestActivity is null”, mFirstTestActivity);
assertNotNull(“mFirstTestText is null”, mFirstTestText);
}
Assertion(斷言,譯者注)方法源自於JunitAssert類。通常,我們可以使用斷言來驗證某一特定的條件是否是真的。
在這兩種情況下,Runner都會繼續運行其它測試用例的測試方法。
下一步,添加一個或多個測試方法來驗證Activity佈局和功能。
例如,如果我們的Activity含有一個TextView,可以添加如下方法來檢查它是否有正確的標籤文本:
public void testMyFirstTestTextView_labelText() {
final String expected =
mFirstTestActivity.getString(R.string.my_first_test);
final String actual = mFirstTestText.getText().toString();
assertEquals(expected, actual);
}
該 testMyFirstTestTextView_labelText()
方法只是簡單的檢查Layout中TextView的默認文本是否和strings.xml
資源中定義的文本一樣。
注意:當命名測試方法時,我們可以使用下劃線將被測試的內容與測試用例區分開。這種風格使得我們可以更容易分清哪些是測試用例。
做這種類型的字符串比較時,推薦從資源文件中讀取預期字符串,而不是在代碼中硬性編寫字符串做比較。這可以防止當資源文件中的字符串定義被修改時,會影響到測試的效果。
為了進行比較,預期的和實際的字符串都要做為assertEquals()方法的參數。如果值是不一樣的,斷言將拋出一個AssertionFailedError異常。
如果添加了一個testPreconditions()
方法,我們可以把測試方法放在testPreconditions之後。
要參看一個完整的測試案例,可以參考本節示例中的MyFirstTestActivityTest.java。
##構建和運行測試
我們可以在Eclipse中的包瀏覽器(Package Explorer)中運行我們的測試。
利用如下步驟構建和運行測試:
連接一個Android設備,在設備或模擬器中,打開設置菜單,選擇開發者選項並確保啟用USB調試。
在包瀏覽器(Package Explorer)中,右鍵單擊測試類,並選擇Run As > Android Junit Test。
在Android設備選擇對話框,選擇剛才連接的設備,然後單擊“確定”。
在JUnit視圖,驗證測試是否通過,有無錯誤或失敗。
本節示例代碼AndroidTestingFun.zip