Android官方开发文档Training系列课程中文版:Activity测试之UI组件测试
原文地址:http://android.xsoftlab.net/training/activity-testing/activity-ui-testing.html
一般來(lái)說(shuō),正因?yàn)锳ctivity含有UI組件,所以使得用戶可以與程序交互。這節(jié)課將會(huì)介紹如何測(cè)試Activity中的Button組件。在課程學(xué)習(xí)之后便可以使用相同的方法對(duì)其它UI組件進(jìn)行測(cè)試。
Note:這節(jié)課中所涉及的UI測(cè)試被稱(chēng)為白盒測(cè)試,因?yàn)殚_(kāi)發(fā)者本身持有被測(cè)試的源代碼。Android設(shè)備框架適用于UI組件的白盒測(cè)試。另一種測(cè)試類(lèi)型被稱(chēng)為黑盒測(cè)試,因?yàn)椴荒軌虻玫匠绦虻脑创a,故此得名。這種測(cè)試適用于與其它APP或系統(tǒng)交互的測(cè)試情況。黑盒測(cè)試在這里并不會(huì)涵蓋。有關(guān)更多如何執(zhí)行黑盒測(cè)試的相關(guān)內(nèi)容,請(qǐng)參見(jiàn)UI測(cè)試指南。
創(chuàng)建UI測(cè)試用例
雖然Activity運(yùn)行于UI線程,但是測(cè)試程序本身是運(yùn)行在子線程中的。這意味著,雖然TestAPP可以引用UI線程的對(duì)象,但是如果要更改這些對(duì)象的屬性或者發(fā)送事件給UI線程,那么將會(huì)得到一個(gè)WrongThreadException錯(cuò)誤。
為了可以安全的發(fā)送Intent到Activity或者在UI線程中運(yùn)行測(cè)試方法,開(kāi)發(fā)者可以使測(cè)試類(lèi)繼承于ActivityInstrumentationTestCase2類(lèi)。
設(shè)置測(cè)試先決條件
當(dāng)為UI測(cè)試設(shè)置先決條件時(shí),則需要在setUp()方法中指定TouchMode。設(shè)置TouchMode為true可以使后面的測(cè)試方法在自動(dòng)化點(diǎn)擊UI組件時(shí)防止真正點(diǎn)擊(例如,測(cè)試Button只是調(diào)用了它的onclick方法)。另外要確保在調(diào)用getActivity()方法之前調(diào)用了setActivityInitialTouchMode()方法。
例如:
public class ClickFunActivityTestextends ActivityInstrumentationTestCase2 {...@Overrideprotected void setUp() throws Exception {super.setUp();setActivityInitialTouchMode(true);mClickFunActivity = getActivity();mClickMeButton = (Button) mClickFunActivity.findViewById(R.id.launch_next_activity_button);mInfoTextView = (TextView) mClickFunActivity.findViewById(R.id.info_text_view);} }添加測(cè)試方法
一般需要測(cè)試的點(diǎn)會(huì)包含以下部分:
- 當(dāng)Activity啟動(dòng)時(shí),驗(yàn)證Button的布局是否顯示正確。
- 驗(yàn)證TextView在初始化時(shí)是否是隱藏的。
- 驗(yàn)證Button按下后,TextView上的文本是否變?yōu)榱似谕闹怠?/li>
下面將會(huì)演示如何測(cè)試以上部分:
驗(yàn)證Button的布局參數(shù)
開(kāi)發(fā)者可能需要以下代碼來(lái)驗(yàn)證Button的布局是否正確:
@MediumTest public void testClickMeButton_layout() {final View decorView = mClickFunActivity.getWindow().getDecorView();ViewAsserts.assertOnScreen(decorView, mClickMeButton);final ViewGroup.LayoutParams layoutParams =mClickMeButton.getLayoutParams();assertNotNull(layoutParams);assertEquals(layoutParams.width, WindowManager.LayoutParams.MATCH_PARENT);assertEquals(layoutParams.height, WindowManager.LayoutParams.WRAP_CONTENT); }在調(diào)用assertOnScreen()方法時(shí),應(yīng)當(dāng)將rootView以及需要驗(yàn)證的View傳遞進(jìn)去。如果需要驗(yàn)證的View沒(méi)有在rootView中出現(xiàn),那么判斷方法會(huì)拋出一個(gè)AssertionFailedError異常。
開(kāi)發(fā)者還可以通過(guò)Button的布局參數(shù)來(lái)驗(yàn)證Button的布局是否正確,然后通過(guò)判斷方法來(lái)驗(yàn)證Button的高寬是否是期望中的值。
@MediumTest注解說(shuō)明了這個(gè)測(cè)試方法應(yīng)當(dāng)如何分類(lèi)。如何分類(lèi)取決于測(cè)試方法的執(zhí)行時(shí)間。
驗(yàn)證TextView的布局參數(shù)
開(kāi)發(fā)者也可能需要通過(guò)以下代碼來(lái)驗(yàn)證TextView在初始化時(shí)是否是隱藏的:
@MediumTest public void testInfoTextView_layout() {final View decorView = mClickFunActivity.getWindow().getDecorView();ViewAsserts.assertOnScreen(decorView, mInfoTextView);assertTrue(View.GONE == mInfoTextView.getVisibility()); }開(kāi)發(fā)者可以通過(guò)getDecorView()方法獲得Activity的DecorView引用。DecorView在布局層級(jí)中屬于最高等級(jí)的ViewGroup.
驗(yàn)證Button的行為
開(kāi)發(fā)者可以根據(jù)以下測(cè)試方法來(lái)驗(yàn)證在Button按下后TextView是否變?yōu)榭梢?jiàn)狀態(tài)。
@MediumTest public void testClickMeButton_clickButtonAndExpectInfoText() {String expectedInfoText = mClickFunActivity.getString(R.string.info_text);TouchUtils.clickView(this, mClickMeButton);assertTrue(View.VISIBLE == mInfoTextView.getVisibility());assertEquals(expectedInfoText, mInfoTextView.getText()); }為了可以自動(dòng)點(diǎn)擊Button,需要調(diào)用clickView()方法。該方法需要傳入測(cè)試用例的引用以及對(duì)應(yīng)Button的引用。
Note: 輔助類(lèi)TouchUtils提供了一些用于模擬交互的簡(jiǎn)單方法,開(kāi)發(fā)者可以使用這些方法來(lái)模擬點(diǎn)擊,拖拽等事件。
Note: TouchUtils中的方法用于從測(cè)試線程向UI線程中發(fā)送事件。開(kāi)發(fā)者最好不要在UI線程中直接調(diào)用TouchUtils的相關(guān)方法,否則會(huì)引起WrongThreadException異常.
測(cè)試注解
以下注解可以用來(lái)標(biāo)明測(cè)試方法的大小:
@SmallTest
@MediumTest
@LargeTest
一般來(lái)說(shuō),一個(gè)只有幾毫秒的剪短測(cè)試一般應(yīng)該標(biāo)為@SmallTest。稍長(zhǎng)一點(diǎn)的,大概100毫秒左右的,通常應(yīng)該標(biāo)為@MediumTest或@LargeTest,測(cè)試的執(zhí)行時(shí)間通常取決于是否需要訪問(wèn)本地資源或者網(wǎng)絡(luò)資源。
開(kāi)發(fā)者應(yīng)當(dāng)通過(guò)注解來(lái)標(biāo)記測(cè)試方法,以便更好的組織、運(yùn)行測(cè)試。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:Activity测试之UI组件测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 经典的K-means聚类算法
- 下一篇: Android官方开发文档Trainin