Android移動(dòng)應(yīng)用開發(fā)-Android性能分析與測(cè)試_第1頁
Android移動(dòng)應(yīng)用開發(fā)-Android性能分析與測(cè)試_第2頁
Android移動(dòng)應(yīng)用開發(fā)-Android性能分析與測(cè)試_第3頁
Android移動(dòng)應(yīng)用開發(fā)-Android性能分析與測(cè)試_第4頁
Android移動(dòng)應(yīng)用開發(fā)-Android性能分析與測(cè)試_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android移動(dòng)應(yīng)用開發(fā)

010302040706認(rèn)識(shí)Android列表與適配器菜單與對(duì)話框設(shè)計(jì)UI控件設(shè)計(jì)設(shè)計(jì)用戶界面創(chuàng)建Android項(xiàng)目Android本地存儲(chǔ)書目錄140911BroadcastReceiver與廣播通信Service與后臺(tái)服務(wù)設(shè)計(jì)ContentProvider與應(yīng)用間數(shù)據(jù)共享網(wǎng)絡(luò)連接與管理05Activity與Fragment08131210線程間的通信與異步機(jī)制Android性能分析與測(cè)試Android性能分析與測(cè)試14.1應(yīng)用性能分析14.2測(cè)試應(yīng)用章目錄14.1.1啟動(dòng)AndroidProfiler在AndroidStudio中,單擊“View”>“ToolWindows”>“Profiler”,打開圖所示的“Profiler”窗口。14.1.2檢查CPU活動(dòng)CPUProfiler用于與應(yīng)用交互時(shí)實(shí)時(shí)檢查應(yīng)用的CPU使用率和線程活動(dòng),也可以檢查記錄的方法跟蹤數(shù)據(jù)、函數(shù)跟蹤數(shù)據(jù)和系統(tǒng)跟蹤數(shù)據(jù)的詳細(xì)信息。單擊“Profiler”窗口的CPU時(shí)間軸上的任意位置可以打開“CPU”窗口,如圖所示。14.1.2檢查CPU活動(dòng)CPUProfiler還會(huì)報(bào)告AndroidStudio和Android添加到應(yīng)用進(jìn)程的線程的CPU使用率,這些線程包括JDWP、ProfileSaver、Studio:VMStats、Studio:Perfa和Studio:Heartbeat等(它們?cè)诰€程活動(dòng)時(shí)間軸上顯示的確切名稱可能有所不同)。在CPUProfiler頂部的下拉菜單中選擇記錄配置,然后單擊“Record”按鈕將開始記錄跟蹤數(shù)據(jù),“Record”按鈕變?yōu)椤皊top”按鈕,在完成時(shí)再次單擊。分析器將自動(dòng)選擇記錄的時(shí)間范圍,并在跟蹤數(shù)據(jù)窗格中顯示其跟蹤信息,如圖所示。14.1.3查看堆和內(nèi)存分配MemoryProfiler是AndroidProfiler中的一個(gè)組件,可幫助識(shí)別可能會(huì)導(dǎo)致應(yīng)用卡頓、凍結(jié)甚至崩潰的內(nèi)存泄漏和內(nèi)存抖動(dòng),它顯示一個(gè)應(yīng)用內(nèi)存使用量的實(shí)時(shí)圖表,可以捕獲堆轉(zhuǎn)儲(chǔ)、強(qiáng)制執(zhí)行垃圾回收以及記錄內(nèi)存分配。單擊MEMORY時(shí)間軸上的任意位置以打開“Memory”分析器,如圖所示。14.1.3查看堆和內(nèi)存分配要檢查分配記錄,請(qǐng)按以下步驟操作。瀏覽列表以查找堆計(jì)數(shù)異常大且可能存在泄漏的對(duì)象。為幫助查找已知類,首先單擊“ClassName”列標(biāo)題以按字母順序排序。然后單擊一個(gè)類名稱,此時(shí)右側(cè)將出現(xiàn)“InstanceView”窗格,顯示該類的每個(gè)實(shí)例,如圖所示。在“InstanceView”窗格中單擊一個(gè)實(shí)例,此時(shí)下方將出現(xiàn)“CallStack”標(biāo)簽,顯示該實(shí)例被分配到何處及哪個(gè)線程中。在“CallStack”標(biāo)簽中,右擊任意行并在彈出的菜單中選擇“JumptoSource”選項(xiàng),以在編輯器中打開該代碼。14.1.4檢查網(wǎng)絡(luò)流量“Network”分析器ConnectionView:列出了在時(shí)間軸上選定時(shí)段內(nèi)從應(yīng)用的所有CPU線程發(fā)送或接收的文件。對(duì)于每個(gè)請(qǐng)求,可以檢查大小、類型、狀態(tài)和傳輸時(shí)長(zhǎng)。14.1.4檢查網(wǎng)絡(luò)流量“Network”分析器ThreadView:顯示應(yīng)用的每個(gè)CPU線程的網(wǎng)絡(luò)活動(dòng)。14.1.4檢查網(wǎng)絡(luò)流量原始文本(左側(cè))和格式化文本(右側(cè))之間切換在“Response”標(biāo)簽和“Request”標(biāo)簽中,單擊“ViewSource”鏈接可顯示原始文本,單擊“ViewParsed”鏈接可顯示格式化文本,如圖所示。目前,NetworkProfiler僅支持HttpURLConnection和OkHttp網(wǎng)絡(luò)連接庫。如果應(yīng)用使用的是其他網(wǎng)絡(luò)連接庫,可能無法在NetworkProfiler中查看網(wǎng)絡(luò)活動(dòng)。14.1應(yīng)用性能分析14.2測(cè)試應(yīng)用章目錄14.2.1測(cè)試概述使用AndroidStudio創(chuàng)建的項(xiàng)目會(huì)自動(dòng)生成androidTest和test兩個(gè)測(cè)試文件夾,如圖所示。項(xiàng)目中的測(cè)試文件夾14.2.1測(cè)試概述這兩個(gè)測(cè)試文件夾的特點(diǎn)如表所示。test和androidTest測(cè)試文件夾的特點(diǎn)測(cè)試文件夾功能特點(diǎn)test本地測(cè)試文件夾在本地計(jì)算機(jī)上運(yùn)行的測(cè)試,如單元測(cè)試測(cè)試基于JUnit4(默認(rèn)的)test本地測(cè)試文件夾測(cè)試不必繼承junit.framework.TestCase類不用在測(cè)試方法的前面加上test關(guān)鍵字不用任何junit.framework或junit.extensions包里的類測(cè)試方法必須以@Test注解開頭androidTestInstrumentation測(cè)試文件夾在真實(shí)或虛擬設(shè)備上運(yùn)行的測(cè)試。此類測(cè)試包括集成測(cè)試、端到端測(cè)試,以及僅靠JVM無法完成應(yīng)用功能驗(yàn)證的其他測(cè)試Instrumented單元測(cè)試類應(yīng)該被寫為一個(gè)JUnit4測(cè)試類在開始定義測(cè)試類前添加注解@RunWith(AndroidJUnit4.class)需要具體聲明AndroidTestingSupportLibrary提供的AndroidJUnitRunner類作為默認(rèn)測(cè)試運(yùn)行器14.2.1測(cè)試概述在測(cè)試時(shí)一般要?jiǎng)?chuàng)建測(cè)試金字塔模型的3類測(cè)試,如圖所示。

單元測(cè)試是應(yīng)用測(cè)試策略中的基本測(cè)試。通過針對(duì)代碼創(chuàng)建和運(yùn)行單元測(cè)試,可以驗(yàn)證各個(gè)單元的邏輯是否正確。在每次編譯后運(yùn)行單元測(cè)試可快速捕捉和修復(fù)由應(yīng)用的代碼更改導(dǎo)致的軟件回歸。單元測(cè)試通常以可重復(fù)的方式運(yùn)用盡可能小的代碼單元(可能是方法、類或組件)的功能。14.2.2單元測(cè)試本地單元測(cè)試當(dāng)需要更快地運(yùn)行測(cè)試而不需要與在真實(shí)設(shè)備上運(yùn)行測(cè)試關(guān)聯(lián)的保真度和置信度時(shí),可以使用本地單元測(cè)試來評(píng)估應(yīng)用的邏輯。在進(jìn)行本地單元測(cè)試前,需要為JUnit4或Robolectric(如果測(cè)試對(duì)Android框架有依賴)添加如下依賴。dependencies{//必選--JUnit4框架testImplementation'junit:junit:4.12'//可選–Robolectric環(huán)境testImplementation'androidx.test:core:1.0.0'//可選–Mockito框架testImplementation'org.mockito:mockito-core:1.10.19'}14.2.2單元測(cè)試本地單元測(cè)試直接使用JUnit4來測(cè)試一些與Android不相關(guān)的類。測(cè)試方法以@Test注解開頭,并且包含用于運(yùn)用和驗(yàn)證要測(cè)試的組件中的單項(xiàng)功能的代碼(代碼存放在test/java/中)。以下示例展示了如何實(shí)現(xiàn)本地單元測(cè)試類。importmon.truth.Truth.assertThat;importorg.junit.Test;publicclassEmailValidatorTest{@TestpublicvoidemailValidator_CorrectEmailSimple_ReturnsTrue(){assertThat(EmailValidator.isValidEmail("name@")).isTrue();}}14.2.2單元測(cè)試下面的示例展示了使用Robolectric庫進(jìn)行單元測(cè)試的方法。首先添加如下依賴。android{//…testOptions{unitTests.includeAndroidResources=true}}測(cè)試示例如下。publicclassUnitTestSampleJava{privatestaticfinalStringFAKE_STRING="HELLO_WORLD";privateContextcontext=ApplicationProvider.getApplicationContext();@TestpublicvoidreadStringFromContext_LocalizedString(){//給定從Robolectric檢索到的Context對(duì)象ClassUnderTestmyObjectUnderTest=newClassUnderTest(context);//…當(dāng)字符串從被測(cè)試對(duì)象返回時(shí)…Stringresult=myObjectUnderTest.getHelloWorldString();//…那么結(jié)果應(yīng)該是預(yù)期的assertThat(result).isEqualTo(FAKE_STRING);}}14.2.2單元測(cè)試插樁單元測(cè)試插樁單元測(cè)試是在物理設(shè)備和模擬器上運(yùn)行的測(cè)試,此類測(cè)試可以利用Android框架API和輔助性API。插樁單元測(cè)試提供的保真度比本地單元測(cè)試的要高,但運(yùn)行速度要慢得多。在進(jìn)行插樁單元測(cè)試前,需要在app/build.gradle中添加如下依賴。dependencies{androidTestImplementation'androidx.test:runner:1.1.0'androidTestImplementation'androidx.test:rules:1.1.0'//可選–Hamcrest庫androidTestImplementation'org.hamcrest:hamcrest-library:1.3'//可選–使用Espresso測(cè)試UIandroidTestImplementation'androidx.test.espresso:espresso-core:3.1.0'//可選–使用UIAutomator測(cè)試UIandroidTestImplementation'androidx.test.uiautomator:uiautomator:2.2.0'}14.2.2單元測(cè)試插樁單元測(cè)試并在頂層build.gradle中將AndroidJUnitRunner指定為默認(rèn)插樁單元測(cè)試運(yùn)行程序,方法如下。android{defaultConfig{testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"}}下面的示例展示了如何編寫插樁單元測(cè)試來驗(yàn)證是否為L(zhǎng)ogHistory類正確實(shí)現(xiàn)了Parcelable接口(代碼存放在androidTest/java/中)。@RunWith(AndroidJUnit4.class)@SmallTestpublicclassLogHistoryAndroidUnitTest{publicstaticfinalStringTEST_STRING="Thisisastring";publicstaticfinallongTEST_LONG=12345678L;privateLogHistorymLogHistory;14.2.2單元測(cè)試@BeforepublicvoidcreateLogHistory(){mLogHistory=newLogHistory();}@TestpublicvoidlogHistory_ParcelableWriteRead(){//設(shè)置要發(fā)送和接收的Parcelable對(duì)象mLogHistory.addEntry(TEST_STRING,TEST_LONG);//數(shù)據(jù)寫入Parcelparcel=Parcel.obtain();mLogHistory.writeToParcel(parcel,mLogHistory.describeContents());//需要重設(shè)Parcel以便閱讀parcel.setDataPosition(0);//讀取數(shù)據(jù)LogHistorycreatedFromParcel=LogHistory.CREATOR.createFromParcel(parcel);List<Pair<String,Long>>createdFromParcelData=createdFromParcel.getData();//驗(yàn)證接收到的數(shù)據(jù)是否正確assertThat(createdFromParcelData.size()).isEqualTo(1);assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING);assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG);}}14.2.2單元測(cè)試運(yùn)行單元測(cè)試運(yùn)行單元測(cè)試的步驟如下。單擊工具欄中的“SyncProjectwithGradeFiles”按鈕,確保項(xiàng)目與Gradle同步。通過以下方式來運(yùn)行單元測(cè)試。要運(yùn)行單個(gè)測(cè)試,在“Project”窗口,右擊一個(gè)測(cè)試,然后在彈出的菜單中選擇“Run”選項(xiàng)。要測(cè)試一個(gè)類中的所有方法,右擊測(cè)試文件中的一個(gè)類或方法,然后在彈出的菜單中選擇“Run”選項(xiàng)。要運(yùn)行一個(gè)目錄中的所有測(cè)試,右擊該目錄,然后在彈出的菜單中選擇“Runtests”選項(xiàng)。14.2.3界面測(cè)試-÷×+Espresso會(huì)檢測(cè)主線程何時(shí)處于空閑狀態(tài),以便在適當(dāng)?shù)臅r(shí)間運(yùn)行測(cè)試命令,從而提高測(cè)試的可靠性。使用Espresso需要添加如下依賴。單個(gè)界面測(cè)試androidTestImplementation'androidx.test.espresso:espresso-core:3.1.0'通過調(diào)用onView()方法或AdapterView控件的onData()方法,在Activity中查找要測(cè)試的界面組件,如登錄按鈕。通過調(diào)用ViewInteraction.perform()方法或DataInteraction.perform()方法并傳入用戶操作,模擬要在該界面組件上執(zhí)行的特定用戶交互。根據(jù)需要重復(fù)上述步驟,以模擬目標(biāo)應(yīng)用中跨多個(gè)Activity的用戶流。執(zhí)行這些用戶交互后,使用ViewAssertions()方法檢查界面是否反映了預(yù)期的狀態(tài)或行為。測(cè)試的基本步驟如下。14.2.3界面測(cè)試Espresso支持使用Hamcrest匹配器來指定應(yīng)用中的視圖和適配器。以下代碼展示了如何結(jié)合使用onData()方法和Hamcrest匹配器來搜索列表中包含給定字符串的特定行。publicvoidtestChangeText_sameActivity(){//鍵入文本并單擊按鈕onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED),closeSoftKeyboard());onView(withId(R.id.changeTextButton)).perform(click());//檢查文本是否已更改…}onView()方法通過訪問目標(biāo)界面中的一個(gè)UI組件與它交互。以下代碼展示了如何編寫一個(gè)先訪問EditText字段,再輸入文本字符串,接著關(guān)閉虛擬鍵盤,最后執(zhí)行按鈕單擊操作的測(cè)試。onData(allOf(is(instanceOf(Map.class)),hasEntry(equalTo(LongListActivity.ROW_TEXT),is("testinput"))));14.2.3界面測(cè)試-÷×+AndroidXTest提供的UIAutomator測(cè)試框架用來編寫多個(gè)界面交互的測(cè)試。UIAutomator測(cè)試框架非常適合用來編寫黑盒測(cè)試,其中測(cè)試代碼的編寫不需要依賴目標(biāo)應(yīng)用的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。使用UIAutomator需要添加如下依賴。多個(gè)界面測(cè)試androidTestImplementation'androidx.test.uiautomator:uiautomator:2.2.0'14.2.3界面測(cè)試采用UIAutomator的過程如下。獲取一個(gè)UiDevice對(duì)象,代表正在執(zhí)行測(cè)試的設(shè)備。通過findObject()方法獲取一個(gè)UiObject對(duì)象,代表需要執(zhí)行測(cè)試的UI組件。對(duì)該UI組件執(zhí)行一系列操作,包括以下幾個(gè)操作方法。檢查操作的結(jié)果是否符合預(yù)期。下面的代碼展示了編寫一個(gè)測(cè)試腳本來獲取默認(rèn)的AppLauncher的示例。14.2.3界面測(cè)試采用UIAutomator的過程如下。獲取一個(gè)UiDevice對(duì)象,代表正在執(zhí)行測(cè)試的設(shè)備。通過findObject()方法獲取一個(gè)UiObject對(duì)象,代表需要執(zhí)行測(cè)試的UI組件。對(duì)該UI組件執(zhí)行一系列操作,包括以下幾個(gè)操作方法。檢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論