Android移动应用开发-Android性能分析与测试_第1页
Android移动应用开发-Android性能分析与测试_第2页
Android移动应用开发-Android性能分析与测试_第3页
Android移动应用开发-Android性能分析与测试_第4页
Android移动应用开发-Android性能分析与测试_第5页
已阅读5页,还剩28页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android移动应用开发

010302040706认识Android列表与适配器菜单与对话框设计UI控件设计设计用户界面创建Android项目Android本地存储书目录140911BroadcastReceiver与广播通信Service与后台服务设计ContentProvider与应用间数据共享网络连接与管理05Activity与Fragment08131210线程间的通信与异步机制Android性能分析与测试Android性能分析与测试14.1应用性能分析14.2测试应用章目录14.1.1启动AndroidProfiler在AndroidStudio中,单击“View”>“ToolWindows”>“Profiler”,打开图所示的“Profiler”窗口。14.1.2检查CPU活动CPUProfiler用于与应用交互时实时检查应用的CPU使用率和线程活动,也可以检查记录的方法跟踪数据、函数跟踪数据和系统跟踪数据的详细信息。单击“Profiler”窗口的CPU时间轴上的任意位置可以打开“CPU”窗口,如图所示。14.1.2检查CPU活动CPUProfiler还会报告AndroidStudio和Android添加到应用进程的线程的CPU使用率,这些线程包括JDWP、ProfileSaver、Studio:VMStats、Studio:Perfa和Studio:Heartbeat等(它们在线程活动时间轴上显示的确切名称可能有所不同)。在CPUProfiler顶部的下拉菜单中选择记录配置,然后单击“Record”按钮将开始记录跟踪数据,“Record”按钮变为“stop”按钮,在完成时再次单击。分析器将自动选择记录的时间范围,并在跟踪数据窗格中显示其跟踪信息,如图所示。14.1.3查看堆和内存分配MemoryProfiler是AndroidProfiler中的一个组件,可帮助识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动,它显示一个应用内存使用量的实时图表,可以捕获堆转储、强制执行垃圾回收以及记录内存分配。单击MEMORY时间轴上的任意位置以打开“Memory”分析器,如图所示。14.1.3查看堆和内存分配要检查分配记录,请按以下步骤操作。浏览列表以查找堆计数异常大且可能存在泄漏的对象。为帮助查找已知类,首先单击“ClassName”列标题以按字母顺序排序。然后单击一个类名称,此时右侧将出现“InstanceView”窗格,显示该类的每个实例,如图所示。在“InstanceView”窗格中单击一个实例,此时下方将出现“CallStack”标签,显示该实例被分配到何处及哪个线程中。在“CallStack”标签中,右击任意行并在弹出的菜单中选择“JumptoSource”选项,以在编辑器中打开该代码。14.1.4检查网络流量“Network”分析器ConnectionView:列出了在时间轴上选定时段内从应用的所有CPU线程发送或接收的文件。对于每个请求,可以检查大小、类型、状态和传输时长。14.1.4检查网络流量“Network”分析器ThreadView:显示应用的每个CPU线程的网络活动。14.1.4检查网络流量原始文本(左侧)和格式化文本(右侧)之间切换在“Response”标签和“Request”标签中,单击“ViewSource”链接可显示原始文本,单击“ViewParsed”链接可显示格式化文本,如图所示。目前,NetworkProfiler仅支持HttpURLConnection和OkHttp网络连接库。如果应用使用的是其他网络连接库,可能无法在NetworkProfiler中查看网络活动。14.1应用性能分析14.2测试应用章目录14.2.1测试概述使用AndroidStudio创建的项目会自动生成androidTest和test两个测试文件夹,如图所示。项目中的测试文件夹14.2.1测试概述这两个测试文件夹的特点如表所示。test和androidTest测试文件夹的特点测试文件夹功能特点test本地测试文件夹在本地计算机上运行的测试,如单元测试测试基于JUnit4(默认的)test本地测试文件夹测试不必继承junit.framework.TestCase类不用在测试方法的前面加上test关键字不用任何junit.framework或junit.extensions包里的类测试方法必须以@Test注解开头androidTestInstrumentation测试文件夹在真实或虚拟设备上运行的测试。此类测试包括集成测试、端到端测试,以及仅靠JVM无法完成应用功能验证的其他测试Instrumented单元测试类应该被写为一个JUnit4测试类在开始定义测试类前添加注解@RunWith(AndroidJUnit4.class)需要具体声明AndroidTestingSupportLibrary提供的AndroidJUnitRunner类作为默认测试运行器14.2.1测试概述在测试时一般要创建测试金字塔模型的3类测试,如图所示。

单元测试是应用测试策略中的基本测试。通过针对代码创建和运行单元测试,可以验证各个单元的逻辑是否正确。在每次编译后运行单元测试可快速捕捉和修复由应用的代码更改导致的软件回归。单元测试通常以可重复的方式运用尽可能小的代码单元(可能是方法、类或组件)的功能。14.2.2单元测试本地单元测试当需要更快地运行测试而不需要与在真实设备上运行测试关联的保真度和置信度时,可以使用本地单元测试来评估应用的逻辑。在进行本地单元测试前,需要为JUnit4或Robolectric(如果测试对Android框架有依赖)添加如下依赖。dependencies{//必选--JUnit4框架testImplementation'junit:junit:4.12'//可选–Robolectric环境testImplementation'androidx.test:core:1.0.0'//可选–Mockito框架testImplementation'org.mockito:mockito-core:1.10.19'}14.2.2单元测试本地单元测试直接使用JUnit4来测试一些与Android不相关的类。测试方法以@Test注解开头,并且包含用于运用和验证要测试的组件中的单项功能的代码(代码存放在test/java/中)。以下示例展示了如何实现本地单元测试类。importmon.truth.Truth.assertThat;importorg.junit.Test;publicclassEmailValidatorTest{@TestpublicvoidemailValidator_CorrectEmailSimple_ReturnsTrue(){assertThat(EmailValidator.isValidEmail("name@")).isTrue();}}14.2.2单元测试下面的示例展示了使用Robolectric库进行单元测试的方法。首先添加如下依赖。android{//…testOptions{unitTests.includeAndroidResources=true}}测试示例如下。publicclassUnitTestSampleJava{privatestaticfinalStringFAKE_STRING="HELLO_WORLD";privateContextcontext=ApplicationProvider.getApplicationContext();@TestpublicvoidreadStringFromContext_LocalizedString(){//给定从Robolectric检索到的Context对象ClassUnderTestmyObjectUnderTest=newClassUnderTest(context);//…当字符串从被测试对象返回时…Stringresult=myObjectUnderTest.getHelloWorldString();//…那么结果应该是预期的assertThat(result).isEqualTo(FAKE_STRING);}}14.2.2单元测试插桩单元测试插桩单元测试是在物理设备和模拟器上运行的测试,此类测试可以利用Android框架API和辅助性API。插桩单元测试提供的保真度比本地单元测试的要高,但运行速度要慢得多。在进行插桩单元测试前,需要在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测试UIandroidTestImplementation'androidx.test.espresso:espresso-core:3.1.0'//可选–使用UIAutomator测试UIandroidTestImplementation'androidx.test.uiautomator:uiautomator:2.2.0'}14.2.2单元测试插桩单元测试并在顶层build.gradle中将AndroidJUnitRunner指定为默认插桩单元测试运行程序,方法如下。android{defaultConfig{testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"}}下面的示例展示了如何编写插桩单元测试来验证是否为LogHistory类正确实现了Parcelable接口(代码存放在androidTest/java/中)。@RunWith(AndroidJUnit4.class)@SmallTestpublicclassLogHistoryAndroidUnitTest{publicstaticfinalStringTEST_STRING="Thisisastring";publicstaticfinallongTEST_LONG=12345678L;privateLogHistorymLogHistory;14.2.2单元测试@BeforepublicvoidcreateLogHistory(){mLogHistory=newLogHistory();}@TestpublicvoidlogHistory_ParcelableWriteRead(){//设置要发送和接收的Parcelable对象mLogHistory.addEntry(TEST_STRING,TEST_LONG);//数据写入Parcelparcel=Parcel.obtain();mLogHistory.writeToParcel(parcel,mLogHistory.describeContents());//需要重设Parcel以便阅读parcel.setDataPosition(0);//读取数据LogHistorycreatedFromParcel=LogHistory.CREATOR.createFromParcel(parcel);List<Pair<String,Long>>createdFromParcelData=createdFromParcel.getData();//验证接收到的数据是否正确assertThat(createdFromParcelData.size()).isEqualTo(1);assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING);assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG);}}14.2.2单元测试运行单元测试运行单元测试的步骤如下。单击工具栏中的“SyncProjectwithGradeFiles”按钮,确保项目与Gradle同步。通过以下方式来运行单元测试。要运行单个测试,在“Project”窗口,右击一个测试,然后在弹出的菜单中选择“Run”选项。要测试一个类中的所有方法,右击测试文件中的一个类或方法,然后在弹出的菜单中选择“Run”选项。要运行一个目录中的所有测试,右击该目录,然后在弹出的菜单中选择“Runtests”选项。14.2.3界面测试-÷×+Espresso会检测主线程何时处于空闲状态,以便在适当的时间运行测试命令,从而提高测试的可靠性。使用Espresso需要添加如下依赖。单个界面测试androidTestImplementation'androidx.test.espresso:espresso-core:3.1.0'通过调用onView()方法或AdapterView控件的onData()方法,在Activity中查找要测试的界面组件,如登录按钮。通过调用ViewInteraction.perform()方法或DataInteraction.perform()方法并传入用户操作,模拟要在该界面组件上执行的特定用户交互。根据需要重复上述步骤,以模拟目标应用中跨多个Activity的用户流。执行这些用户交互后,使用ViewAssertions()方法检查界面是否反映了预期的状态或行为。测试的基本步骤如下。14.2.3界面测试Espresso支持使用Hamcrest匹配器来指定应用中的视图和适配器。以下代码展示了如何结合使用onData()方法和Hamcrest匹配器来搜索列表中包含给定字符串的特定行。publicvoidtestChangeText_sameActivity(){//键入文本并单击按钮onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED),closeSoftKeyboard());onView(withId(R.id.changeTextButton)).perform(click());//检查文本是否已更改…}onView()方法通过访问目标界面中的一个UI组件与它交互。以下代码展示了如何编写一个先访问EditText字段,再输入文本字符串,接着关闭虚拟键盘,最后执行按钮单击操作的测试。onData(allOf(is(instanceOf(Map.class)),hasEntry(equalTo(LongListActivity.ROW_TEXT),is("testinput"))));14.2.3界面测试-÷×+AndroidXTest提供的UIAutomator测试框架用来编写多个界面交互的测试。UIAutomator测试框架非常适合用来编写黑盒测试,其中测试代码的编写不需要依赖目标应用的内部实现细节。使用UIAutomator需要添加如下依赖。多个界面测试androidTestImplementation'androidx.test.uiautomator:uiautomator:2.2.0'14.2.3界面测试采用UIAutomator的过程如下。获取一个UiDevice对象,代表正在执行测试的设备。通过findObject()方法获取一个UiObject对象,代表需要执行测试的UI组件。对该UI组件执行一系列操作,包括以下几个操作方法。检查操作的结果是否符合预期。下面的代码展示了编写一个测试脚本来获取默认的AppLauncher的示例。14.2.3界面测试采用UIAutomator的过程如下。获取一个UiDevice对象,代表正在执行测试的设备。通过findObject()方法获取一个UiObject对象,代表需要执行测试的UI组件。对该UI组件执行一系列操作,包括以下几个操作方法。检

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论