你應該開始編寫和啟動測試作為你的android程序開發(fā)周期的一部分。寫的好的測試能夠幫助你更早的發(fā)現(xiàn)bug和使你對你的代碼有信心。
一個測試用例定義了一些對象和方法的集合,用于啟動多樣的彼此獨立的測試。測試用例可以被組織進測試套件內(nèi)和啟動編程,以一個可重復的規(guī)則,測試框架提供了測試啟動的方式。
這節(jié)課將會教你如何使用android的自定義測試框架(基于流行的Junit框架)。你可以編寫你的測試用例來驗證你程序里的指定行為,和檢查在不同的android設備中的一致性表現(xiàn)。你的測試用例也可以作為一種內(nèi)部代碼文檔的服務,來描述應用組件的期望行為。
課程
- 配置你的測試環(huán)境
學習如何創(chuàng)建測試工程. - 創(chuàng)建和啟動一個測試用例
學習如何編寫測試用例來驗證Activity的期望的屬性, 和使用 andorid 框架自帶的 Instrumentation 測試啟動器 來啟動它。 - 測試UI組件
學習如何測試你的Activity中的特殊UI組件的 行為. - 創(chuàng)建單元測試
學習如何執(zhí)行單元測試來驗證一個隔離的activity的行為。 - 創(chuàng)建功能測試
學習如何執(zhí)行功能測試來驗證多個activity之間的交互。
配置你的測試環(huán)境
在你開始編寫和啟動你的測試之前,你應該先配置你的測試環(huán)境。這節(jié)課教你如何配置Eclipse 來編寫和啟動測試,和如何通過命令提示行方式使用Gradle框架構(gòu)建和啟動測試。
Note: 為了幫助你開始,這個課程時基于Eclipse和ADT插件的。然而,為了你個人的測試環(huán)境,你可以自由選擇IDE或者選擇命令提示行方式。
配置Eclipse測試環(huán)境
Eclipse 和 ADT插件提供了一個可以支持你創(chuàng)建,構(gòu)建,和啟動Android程序測試用例的圖形界面的集成開發(fā)環(huán)境。Eclipse 提供了一個非常使用的特性,它可以為你的Android程序項目自動生成一個合適的新的測試工程。.
配置步驟:
下載和安裝 ADT 插件,如果你還沒裝過的話.
導入或者創(chuàng)建一個你像要創(chuàng)建的Android工程。
生成一個符合你的項目的測試工程 ,你需要為你的項目創(chuàng)建(生成)測試工程:
在左側(cè)的 包管理區(qū)( Package Explorer), 右鍵點擊你的項目, 選擇 Android Tools > New Test Project.
在新的創(chuàng)建項目的對話框中(New Android Test Project ), 為你的項目設置對應的屬性的值并點擊完成.
You should now be able to create, build, and run test cases from your Eclipse environment. 了解更多請閱讀Creating and Running a Test Case.
配置命令提示行的方式的測試環(huán)境
如果你使用 Gradle version 1.6或者更高版本作為你的構(gòu)建環(huán)境, 你可以使用 Gradle Wrapper配置你的測試環(huán)境. 確保在你的 gradle.build 文件,在defaultConfig節(jié)點中的 minSdkVersion 屬性被設置成 8 or higher. 你可以參考包含在下載文件中的訓練課程中的示例 samplegradle.build 文件。
使用 Gradle Wrapper 啟動測試:
連接一個物理設備到你的機器,或者開啟一個模擬器.
在你的工程文件夾中,執(zhí)行下面的命令:
./gradlew build connectedCheck
要學習更多 using Gradle for Android testing, 請參考 Gradle Plugin User Guide.
要學習更多 using command line tools other than Gradle for test development, see Testing from Other IDEs.
創(chuàng)建和啟動一個測試用例(Creating and Running a Test Case)
為了驗證在你的布局設計和基礎行為中沒有發(fā)生 回退 ,非常重要的是為你的程序的每一個activity添加測試用例。在每一個測試中,你需要去創(chuàng)建每個用例的獨特部分, 包括測試裝置(test fixture), 預先準備好的測試方法, 和 Activity 的測試方法(函數(shù),method). 你可以啟動你的測試來得到一個測試報告. 如果一些測試失敗了, 這指示了在你的代碼中可能存在缺陷( defect).
注意: 在測試驅(qū)動開發(fā)(TDD)中,在開發(fā)周期中先寫出較多甚至全部的程序代碼和較晚的啟動測試 的方式被取代, 你可以漸進的( progressively) 編寫足夠的代碼去 滿足(satisfy)你的測試依賴的需要, 更新你的測試用例去表達(reflect)新的功能性需求, 和多次迭代(iterate)這種方式.
創(chuàng)建一個用例(Create a Test Case)
Activity 測試使用結(jié)構(gòu)化的方式編寫。確保放置你的測試在一個獨立的包內(nèi),區(qū)別于下面的測試代碼。
通常, 你的測試的包名應該和你的程序的包名類似,而加上".tests"后綴。 在你創(chuàng)建的包內(nèi),添加一個java的類。通常,你的測試用例的名字也你要測試的類類似,而以作為“Test”后綴。
要在Eclipse中創(chuàng)建測試用例:
- In the Package Explorer, right-click on the /src directory for your test project and select New > Package.
- Set the Name field to <your_app_package_name>.tests (for example,com.example.android.testingfun.tests) and click Finish.
- Right-click on the test package you created, and select New > Class.
- Set the Name field to <your_app_activity_name>Test (for example, MyFirstTestActivityTest) and click Finish.
配置你的測試裝置(Set Up Your Test Fixture)
一個測試裝置由很多對象構(gòu)成,這些對象必須被初始化以用來啟動一個或者多個測試。要設置測試裝置,你可以重載setUp() 和 tearDown() 方法。測試啟動器會自動的 在啟動任何其他測試方法之前運行setUp() 方法,在每個方法執(zhí)行完畢后執(zhí)行tearDown()方法。你可以使用這兩個方法來初始化和清理操作,以區(qū)別于其他的測試方法。
要在Eclipse中設置你的測試裝置:
在包管理器中( Package Explorer ),在你上次創(chuàng)建的測試用例的類上雙擊鼠標,將在 java編輯器中(Eclipse Java editor)打開這個文件,這時修改你的類使它集成自 ActivityTestCase .
For example:
public class MyFirstTestActivityTest
extends ActivityInstrumentationTestCase2<MyFirstTestActivity> {
繼續(xù), 添加構(gòu)造方法和 setUp() 方法, 并且為你要測試的 Activity添加 變量的聲明.
For example:
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);
}
}
構(gòu)造方法將被測試啟動器調(diào)用以用來初始化這個測試類,setUp() 將在其他測試方法運行之前被調(diào)用。
典型情況下, 在 setUp() 中, 你可以:
為setUp()調(diào)用子類的構(gòu)造,它在JUnit中是必須的。(感覺不太懂,原文:Invoke the superclass constructor for setUp(), which is required by JUnit).
初始化你的測試裝置的狀態(tài),通過下面的方式:Initialize your test fixture state by:
定義存儲測試裝置狀態(tài)的實例變量。
創(chuàng)建和存儲一個 你要測試的Activity 的實例的引用。
獲得一個 你要測試的Activity 的 UI組件 的變量引用。
你可以使用 getActivity() 方法去獲得 你要測試的 Activity 的引用。
添加測試前置條件 (Add Test Preconditions)
作為明智的(sanity) 檢查, 一個很好的實踐就是驗證測試裝置是否被正確的配置好,和驗證你要測試的對象是否被正確的實例化和初始化。你不會希望看到因為測試裝置的配置錯誤而導致測試失敗。通常,驗證測試裝置的方法名稱叫做 testPreconditions();
比如, 你可能想添加一個testPreconditons()方法,像下面這樣:
public void testPreconditions() {
assertNotNull(“mFirstTestActivity is null”, mFirstTestActivity);
assertNotNull(“mFirstTestText is null”, mFirstTestText);
}
斷言( assertion )方法來自于 JUnit Assert 類。一般情況,你可以使用斷言去驗證一個指定的表達式是否是真(true)。
如果條件是 false,斷言方法拋出 AssertionFailedError 異常,它是測試啟動器典型的報告。你可以提供一個字符串作為斷言方法的第一個參數(shù),以使得在發(fā)生失敗時提供更多詳細的上下文信息。
如果條件是 true, 測試通過。
在兩種情形下,測試啟動器繼續(xù)執(zhí)行測試用例中的其他測試方法。
添加測試方法驗證你的Activity (Add Test Methods to Verify Your Activity)
繼續(xù),添加一個或多個測試方法驗證Activity的布局和功能行為。
例如, 如果你的 Activity 包含了一個 TextView, 你可以添加一個測試方法去驗證它的文本(Lable) 是否是正確的,像下面這樣:
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() 簡單的檢查了TextView的在布局文件中設置的默認文本是否和期望的在strings.xml中定義的文本一致。
注意: 當你為一個測試方法命名時, 你可以使用 下劃線(an underscore) 來區(qū)分 被測試的對象 和 被測試的情景。這個風格使得可以更容易的看到被測試的明確的對象。
當執(zhí)行這樣的 字符串類型的比較時,一個較好的實踐是從你的資源文件中讀取它,而不是 應編碼(在代碼直接寫)。這樣可以預防在你更改更改為本后使得你的測試很容易的被中斷。
要執(zhí)行(perform)比較, 需要傳入期望的和實際的兩個字符串的值作為 assertEquals()的參數(shù),如果值不相同,斷言將會拋出一個 AssertionFailedError 異常。
如果你添加了一個 testPreconditions() 方法, 在你的代碼中,請放置其他的測試方法在testPreconditions()之后。
要活的一個完成的測試例子, 請閱讀 在示例中的 MyFirstTestActivityTest.java .
構(gòu)建和啟動你的測試(Build and Run Your Test)
你可以很容易的在 EclipseYou 的 包管理中(Package Explorer) 構(gòu)建和啟動你的測試。
要構(gòu)建和啟動你的測試:
將你的Android設備和你的機器(電腦)連接,并在設備或者模擬器中,打開 設置 菜單,選擇 開發(fā)者模式,并確保 USB 調(diào)試是打開的。
在項目管理器(Project Explorer)中, 右擊你剛剛創(chuàng)建的測試類并選擇 Run As > Android Junit Test.
在 設備選擇對話框 中,選擇你剛剛的設備,并點擊 確定 。
在 JUnit 視圖(JUnit view)中, 核實測試通過或者失敗了。
比如, 如果沒有發(fā)生錯誤, 結(jié)果類似下面這樣:
[圖片丟失]
測試視圖(UI)組件(Testing UI Components )
典型的, 你的 Activity 包含了 用戶接口組件,比如按鈕,文本框,復選框,pickers 等。它使得用戶可以和你的Android 程序交互。這節(jié)課講述了如何測試一個擁有簡單按鈕的UI。你可以使用這樣的通用步驟來測試更為復雜類型的UI組件。
注意: 在這節(jié)課中講述的UI測試的類型被稱為 白盒測試,因為你在這里必須使用應用程序的源代碼。安卓測試框架(Android Instrumentation framework )適合用于在應用程序內(nèi)部創(chuàng)建白盒測試??晒┻x擇的另一個類型是 黑盒測試,這種方式你無法訪問應用程序源代碼。在測試程序如何和其他程序或者系統(tǒng)進行交互過程,它將會很有用。本節(jié)課不講黑盒測試。要了解更多黑盒測試,請閱讀 UI Testing guide.
要獲得完整的示例,請閱讀 示例代碼中的 ClickFunActivityTest.java
使用Instrumentation創(chuàng)建測試用例來進行UI測試
當測試一個包含UI組件的Activity時,在測試下的Activity運行在一個UI線程。然而,測試應用程序本身運行在 與測試應用相同進程的另外的線程中。這意味著你的測試程序可以引用一個視圖對象,但是如果它試圖去更改那些對象的屬性或者向UI線程發(fā)送事件,你通常會受到一個 WrongThreadException 錯誤。
要想安全的注入(inject) Intent 對象到你的Activity中,或者 在UI線程執(zhí)行測試方法。你可以繼承自 ActivityInstrumentationTestCase2 類.
要了解更多,請閱讀: Testing on the UI thread .
設置你的測試裝置(Set Up Your Test Fixture)
當你為了UI測試而設置測試裝置時,你需要在你的setUp() 方法中指定 觸摸模式( touch mode )設置 觸摸模式為true,以防止 當你在測試方法中以編程方式點擊它之后,而 UI控件僅獲得焦點(比如,一個按鈕將會觸發(fā)它的 點擊 監(jiān)聽器)。確保你在調(diào)用getActivity()之前就調(diào)用 setActivityInitialTouchMode() 方法。.
例如:
public class ClickFunActivityTest
extends ActivityInstrumentationTestCase2 {
...
@Override
protected 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);
}
}
添加測試方法以驗證UI行為 (Add Test Methods to Validate UI Behavior)
你的測試目標(goals)可能包括下面這些:
- 當一個Activity啟動后,核實 一個按鈕被正確的顯示出來。
- 核實一個 TextView 在初始是被隱藏的。
- 當一個按鈕被按下后,核實一個TextView正確的顯示了一個期望的字符串。
下面的章節(jié) 演示(demonstrates)了如何實現(xiàn)這些方法
驗證一個按鈕的布局參數(shù)(Verify Button Layout Parameters)
你可以添加一個測試方法去驗證按鈕被正確的顯示,像下面這樣:
@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() 方法時, 你需要傳入 根視圖對象 和 你希望在屏幕上展示的視圖對象。如果期望的視圖沒有在根視圖內(nèi)找到,那么會拋出AssertionFailedError 異常,或者測試會通過.
你也可以驗證Button對象的布局是否正確,通過它的ViewGroup.LayoutParams對象獲得一個引用,再調(diào)用斷言方法驗證Button 對象的寬度和高度屬性是否是期望的值。
注解 @MediumTest 指示了這個測試是如何分組的,相對它的絕對運行時。要了解更多 如何使用 測試 尺寸 的注解,請閱讀: Apply Test Annotations.
驗證 TextView 的布局參數(shù) ( Verify TextView Layout Parameters)
你可以驗證一個TextView在初始化時是隱藏的,像下面這樣:
@MediumTest
public void testInfoTextView_layout() {
final View decorView = mClickFunActivity.getWindow().getDecorView();
ViewAsserts.assertOnScreen(decorView, mInfoTextView);
assertTrue(View.GONE == mInfoTextView.getVisibility());
}
你可以調(diào)用 getDecorView() 方法來獲得一個Activity的裝飾視圖( decor view )的引用。這個裝飾視圖 是 在局部繼承體系中的最頂級的 ViewGroup (FrameLayout) 對象。
驗證按鈕行為 (Verify Button Behavior)
你可以驗證當一個按鈕按下后,使得一個TextView變?yōu)榭梢?,例如?/p>
@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());
}
要編程化的在測試中點擊一個按鈕,調(diào)用 clickView().To programmatically click a Button in your test, call clickView(). You must pass in a reference to the test case that is being run and a reference to the Button to (操縱)manipulate.
注意: TouchUtils 這個輔助類 可以很方便的幫助我們模擬 和應用程序的觸摸交互。你可以使用這些方法來模擬 點擊,滑動,拖放視圖控件或者屏幕的行為。
警告: TouchUtils 方法被設計用于從測試線程安全的發(fā)送事件到UI線程。你不能在UI線程或者使用了@UIThread.注解的方法上直接執(zhí)行 TouchUtils 方法,會引發(fā)WrongThreadException 異常。
使用測試注解(Apply Test Annotations)
下面的這些注解可以指示測試方法的尺寸:
@SmallTest
標記一個測試運行于小的測試.
@MediumTest
標記一個測試運行于中等的測試.
@LargeTest
標記一個測試運行于較大的測試.
典型情況, 一個小的測試耗時數(shù)毫秒,標記為@SmallTest 。更長一點的(100毫秒或更多)通常標記為@MediumTest或者 @LargeTests, 依賴于是否訪問本地資源或者訪問遠程的網(wǎng)絡資源。要更多 測試尺寸注解的指導內(nèi)容,請閱讀:Android Tools Protip.
你可以使用其他的測試注解標示你的測試方法,來控制 測試如何組織和運行。擴展閱讀: Annotation 類。
創(chuàng)建單元測試 (Creating Unit Tests)
要驗證一個Activity的狀態(tài)或者它與其他 獨立的組件(也就是說,與系統(tǒng)的其他部分斷開) 的交互,那么一個Activity的單元測試是個很好的選擇方式。一個單元測試通常要測試一個最小可能的代碼單元(可能是一個方法,類,組件等),而不依賴于系統(tǒng)或者玩過資源,比如,你可以編寫一個單元測試來檢測一個acitivity有正確的布局或者它正確的觸發(fā)了一個Intent對象 。
單元測試通常不適用于測試復雜的與系統(tǒng)的UI交互事件。要這么做,你可以使用 ActivityInstrumentationTestCase2 類,請參閱:Testing UI Components.
這節(jié)課展示了如果編寫一個單元測試區(qū)驗證“一個Intent被觸發(fā)去啟動其他的Activity”。由于測試運行在一個獨立的環(huán)境,Intent并沒有實際發(fā)送到Android胸膛呢,但是你可以檢查“Intent對象裝載的數(shù)據(jù)是否是準確的”。
要獲得完整的例子,請閱讀示例代碼中的 LaunchActivityTest.java .
注意: 相對于系統(tǒng)或者外部的依賴,你可以使用 模擬框架(mocking framework)中的 ” 模擬對象“ ,將模擬對象注入到你的單元測試中。要學習更多 Android提供的模擬框架,請閱讀:Mock Object Classes.
創(chuàng)建一個單元測試進行 Activity單元測試
ActivityUnitTestCase 類提供了單個Activity的 隔離測試。要創(chuàng)建它,你的測試類需要集成自 ActivityUnitTestCase.
一個集成自ActivityUnitTestCase的 Activity 不會自動被 Android 框架(Android Instrumentation)啟動. 要獨立的啟動 Activity , 你需要顯式的調(diào)用 startActivity() 方法,并且傳入Intent參數(shù) 來啟動你的目標Acitivity。
For example:
public class LaunchActivityTest
extends ActivityUnitTestCase<LaunchActivity> {
...
@Override
protected void setUp() throws Exception {
super.setUp();
mLaunchIntent = new Intent(getInstrumentation()
.getTargetContext(), LaunchActivity.class);
startActivity(mLaunchIntent, null, null);
final Button launchNextButton =
(Button) getActivity()
.findViewById(R.id.launch_next_activity_button);
}
}
驗證其他Acitivity的啟動
你的單元測試的目標可能包括:
- 驗證 當一個按鈕被按下后,一個Intent啟動了一個 Acitivity。
- 驗證 一個被啟動的Activity裝載了正確的數(shù)據(jù)。
要驗證一個按鈕按下后就觸發(fā)一個Intent你可以使用 getStartedActivityIntent() 方法. 通過使用斷言方法,你可以驗證返回的值不是空,并且包含了所要啟動Activity的期望的字符串。如果這兩項都為 true ,你就成功了驗證了 你的Activity正確的發(fā)送了一個Intent.
比如你可以這樣實現(xiàn)你的測試方法:
@MediumTest
public void testNextActivityWasLaunchedWithIntent() {
startActivity(mLaunchIntent, null, null);
final Button launchNextButton =
(Button) getActivity()
.findViewById(R.id.launch_next_activity_button);
launchNextButton.performClick();
final Intent launchIntent = getStartedActivityIntent();
assertNotNull("Intent was null", launchIntent);
assertTrue(isFinishCalled());
final String payload =
launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
}
因為 LaunchActivity 是獨立啟動的, 你不能使用 TouchUtils 庫 去操作UI組件。如果要點擊一個按鈕,你可以調(diào)用 performClick() 方法.
創(chuàng)建功能測試(Creating Functional Tests)
功能測試包含了,驗證個體程序組件像用戶期待的那樣工作。比如,你可以創(chuàng)建一個功能測試來驗證“當用戶操作界面時,一個Activity正確的啟動了目標Activity” .
要為你的Activity創(chuàng)建功能測試,你的測試類必須繼承自 ActivityInstrumentationTestCase2. 不同于 ActivityUnitTestCase, 在 ActivityInstrumentationTestCase2 中的測試可以和Android系統(tǒng)進行通訊,并可以發(fā)送鍵盤輸入事件和UI視圖點擊事件 .
要完整的示例,請閱讀示例程序中的 SenderActivityTest.java .
添加測試方法驗證功能行為(Add Test Method to Validate Functional Behavior)
你的功能測試的目的可能包含下面這些:
當在一個發(fā)送者Activity中按下一個UI控件時,驗證目標Activity被啟動。
驗證目標Acitivyt顯示了 基于用戶在發(fā)送者Activity中輸入的正確的數(shù)據(jù)。
你可能這么實現(xiàn)你的方法:
@MediumTest
public void testSendMessageToReceiverActivity() {
final Button sendToReceiverButton = (Button)
mSenderActivity.findViewById(R.id.send_message_button);
final EditText senderMessageEditText = (EditText)
mSenderActivity.findViewById(R.id.message_input_edit_text);
// Set up an ActivityMonitor
...
// Send string input value
...
// Validate that ReceiverActivity is started
...
// Validate that ReceiverActivity has the correct data
...
// Remove the ActivityMonitor
...
}
測試等待一個 匹配了監(jiān)視器的 Activity ,否則在 超時后返回null。如果 接收者Activity被啟動,你剛剛設置好的 Activity監(jiān)視器(ActivityMonitor )被擊中。你可以使用斷言方法去驗證 接收者Activity確實被啟動了,并且 在Activity監(jiān)視器(ActivityMonitor )中的被擊中的次數(shù)總數(shù)增到你期望的次數(shù)。 .
設置一個Activity監(jiān)視器(Set up an ActivityMonitor)
要在你的程序匯總監(jiān)視一個獨立的Activity,你可以注冊一個Activity監(jiān)視器。只要一個匹配了你的條件的Activity被啟動,該 Activity監(jiān)視器就會收到一個系統(tǒng)通知。如果匹配達成,監(jiān)視器的計數(shù)總數(shù)就會發(fā)生變化。
通常,你可以這樣使用 Activity監(jiān)視器:
通過getInstrumentation() 方法獲得一個 你的測試場景的 測試儀器( Instrumentation )的示例 .
通過Instrumentation 的一個 addMonitor()方法 添加 一個 測試監(jiān)視器(Instrumentation.ActivityMonitor )的實例。可以通過一個 Inent過濾器(IntentFilter)或者 類名字符串 指定匹配條件。
等待指定的 Activity 被啟動.
驗證 測試監(jiān)視器的擊中次數(shù)增長了。
-
移除監(jiān)視器.
For example:// Set up an ActivityMonitor ActivityMonitor receiverActivityMonitor = getInstrumentation().addMonitor(ReceiverActivity.class.getName(), null, false); // Validate that ReceiverActivity is started TouchUtils.clickView(this, sendToReceiverButton); ReceiverActivity receiverActivity = (ReceiverActivity) receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS); assertNotNull("ReceiverActivity is null", receiverActivity); assertEquals("Monitor for ReceiverActivity has not been called", 1, receiverActivityMonitor.getHits()); assertEquals("Activity is of wrong type", ReceiverActivity.class, receiverActivity.getClass()); // Remove the ActivityMonitor getInstrumentation().removeMonitor(receiverActivityMonitor);
使用測試儀器發(fā)送鍵盤錄入(Send Keyboard Input Using Instrumentation)
如果你的 Activity 擁有一個 文本輸入框( EditText)字段,你可能想測試用戶能否錄入內(nèi)容到這個文本框內(nèi)。
通常,要在 ActivityInstrumentationTestCase2中發(fā)送 字符串輸入值 到 一個文本框中,你可以:
- 使用 runOnMainSync() 方法來啟動 requestFocus()方法獲得焦點, 以 在消息循環(huán)中的同步調(diào)用方式。 這種方式下,UI現(xiàn)場被阻塞,直到 獲得焦點為止。
- 調(diào)用 waitForIdleSync() 方法等待UI主線程變成 空閑狀態(tài)。(這樣就是,沒有更多的事件需要處理).
- 通過調(diào)用 sendStringSync() 方法和傳入你的輸入字符串作為參數(shù),發(fā)送一個文本字符串到 EditText
For example:
// Send string input value
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
senderMessageEditText.requestFocus();
}
});
getInstrumentation().waitForIdleSync();
getInstrumentation().sendStringSync("Hello Android!");
getInstrumentation().waitForIdleSync();