<只看这个就够了。。。>Android自动化测试及性能优化

Android自动化测试及性能优化

分类: Android Java Tools2012-12-09 23:31 4300人阅读 评论(0) 收藏 举报

软件自动化测试对于程序员来说能够确保软件开发的质量和效率。在Android编程中,Android集成了Junit单元测试框架,因此我们可以通过Junit来进行单元测试以及自动化测试。

1、引入Junit测试框架

在Manifest.xml配置文件中,我们需要引入Junit测试框架,因此需要在配置文件中添加如下代码:

在<application>标签中添加Junit测试库:

[html] view plaincopy

  1. <uses-library android:name="android.test.runner" />

在<manifest>标签中添加以下代码:

[html] view plaincopy

  1. <instrumentation
  2. android:name="android.test.InstrumentationTestRunner"
  3. android:label="Tests for My App"
  4. android:targetPackage="com.jony.androidtestdemo" />

其中android:name="android.test.InstrumentationTestRunner"表示引入Android测试类

android:label="Tests for My App"该属性的具体内容根据实际情况自行定义

android:targetPackage="com.jony.androidtestdemo"该属性定义了需要测试的包名

至此,进行单元测试需要配置的工作就全部完成了。接下来简单写几个测试用的Activity——模拟实现用户登录过程

2、业务代码编写

MainActivity.java主要作用是实现Activity界面的跳转,通过点击界面上的Button按钮,跳转到用户登录界面;

LoginActivity.java主要作用是接收用户输入的用户名和密码;

HomeActivity.java用户登录成功界面。

以上三个界面的逻辑非常简单,本文重点在于讲解Android自动化测试以及性能优化,因此复杂的业务逻辑在此就不做过多介绍。

3、单元测试

在进行单元测试前,大家可能最关注的是:怎样获得Activity的实例?

的确,这个问题是我们必须要关心的。既然我们能想到的问题,想必Android的大牛们已经给我们提供了怎么获得Activity实例的方法了。
在Android单元测试中,我们只要继承ActivityInstrumentationTestCase2 类,在其构造函数中传入需要测试的Activity,就能通过getActivity()方法获得我们需要测试的Activity的实例,具体代码如下所示:

MainActivity.java的测试代码如下所示:

[java] view plaincopy

  1. package com.jony.androidtestdemo.test;
  2. import android.app.Instrumentation;
  3. import android.test.ActivityInstrumentationTestCase2;
  4. import android.test.UiThreadTest;
  5. import android.test.suitebuilder.annotation.Suppress;
  6. import android.util.Log;
  7. import android.view.View;
  8. import com.jony.androidtestdemo.MainActivity;
  9. import com.jony.androidtestdemo.R;
  10. public class MainActivityTest extends
  11. ActivityInstrumentationTestCase2<MainActivity> {
  12. private static final String TAG = "MainActivityTest";
  13. private Instrumentation mInstrument;
  14. private MainActivity mActivity;
  15. private View mToLoginView;
  16. public MainActivityTest() {
  17. super(MainActivity.class);
  18. }
  19. @Override
  20. public void setUp() throws Exception {
  21. super.setUp();
  22. mInstrument = getInstrumentation();
  23. // 启动被测试的Activity
  24. mActivity = getActivity();
  25. mToLoginView = mActivity.findViewById(R.id.to_login);
  26. }
  27. public void testPreConditions() {
  28. // 在执行测试之前,确保程序的重要对象已被初始化
  29. assertTrue(mToLoginView != null);
  30. }
  31. // mInstrument.runOnMainSync(new Runnable() {
  32. // public void run() {
  33. // mToLoginView.requestFocus();
  34. // mToLoginView.performClick();
  35. // }
  36. // });
  37. @UiThreadTest
  38. public void testToLogin() {
  39. // @UiThreadTest注解使整个方法在UI线程上执行,等同于上面注解掉的代码
  40. mToLoginView.requestFocus();
  41. mToLoginView.performClick();
  42. }
  43. @Suppress
  44. public void testNotCalled() {
  45. // 使用了@Suppress注解的方法不会被测试
  46. Log.i(TAG, "method ‘testNotCalled‘ is called");
  47. }
  48. @Override
  49. public void tearDown() throws Exception {
  50. super.tearDown();
  51. }
  52. }

LoginActivity.java测试代码如下所示:

[java] view plaincopy

  1. package com.jony.androidtestdemo.test;
  2. import android.app.Instrumentation;
  3. import android.test.ActivityInstrumentationTestCase2;
  4. import android.util.Log;
  5. import android.view.KeyEvent;
  6. import android.view.View;
  7. import android.widget.EditText;
  8. import com.jony.androidtestdemo.LoginActivity;
  9. import com.jony.androidtestdemo.R;
  10. public class LoginActivityTest extends
  11. ActivityInstrumentationTestCase2<LoginActivity> {
  12. private static final String TAG = "LoginActivityTest";
  13. private Instrumentation mInstrument;
  14. private LoginActivity mActivity;
  15. private EditText mUsernameView;
  16. private EditText mPasswordView;
  17. private View mSubmitView;
  18. private View mResetView;
  19. public LoginActivityTest() {
  20. super(LoginActivity.class);
  21. }
  22. @Override
  23. public void setUp() throws Exception {
  24. super.setUp();
  25. /*
  26. * 要向程序发送key事件的话,必须在getActivity之前调用该方法来关闭touch模式
  27. * 否则key事件会被忽略
  28. */
  29. setActivityInitialTouchMode(false);
  30. mInstrument = getInstrumentation();
  31. mActivity = getActivity();
  32. Log.i(TAG, "current activity: " + mActivity.getClass().getName());
  33. mUsernameView = (EditText) mActivity.findViewById(R.id.username);
  34. mPasswordView = (EditText) mActivity.findViewById(R.id.password);
  35. mSubmitView = mActivity.findViewById(R.id.submit);
  36. mResetView = mActivity.findViewById(R.id.reset);
  37. }
  38. public void testPreConditions() {
  39. assertTrue(mUsernameView != null);
  40. assertTrue(mPasswordView != null);
  41. assertTrue(mSubmitView != null);
  42. assertTrue(mResetView != null);
  43. }
  44. public void testInput() {
  45. input();
  46. assertEquals("1231", mUsernameView.getText().toString());
  47. assertEquals("11", mPasswordView.getText().toString());
  48. }
  49. public void testSubmit() {
  50. input();
  51. mInstrument.runOnMainSync(new Runnable() {
  52. public void run() {
  53. mSubmitView.requestFocus();
  54. mSubmitView.performClick();
  55. }
  56. });
  57. }
  58. public void testReset() {
  59. input();
  60. mInstrument.runOnMainSync(new Runnable() {
  61. public void run() {
  62. mResetView.requestFocus();
  63. mResetView.performClick();
  64. }
  65. });
  66. assertEquals("", mUsernameView.getText().toString());
  67. assertEquals("", mPasswordView.getText().toString());
  68. }
  69. @Override
  70. public void tearDown() throws Exception {
  71. super.tearDown();
  72. }
  73. private void input() {
  74. mActivity.runOnUiThread(new Runnable() {
  75. public void run() {
  76. mUsernameView.requestFocus();
  77. }
  78. });
  79. // 因为测试用例运行在单独的线程上,这里最好要
  80. // 同步application,等待其执行完后再运行
  81. mInstrument.waitForIdleSync();
  82. sendKeys(KeyEvent.KEYCODE_1, KeyEvent.KEYCODE_2,
  83. KeyEvent.KEYCODE_3);
  84. // 效果同上面sendKeys之前的代码
  85. mInstrument.runOnMainSync(new Runnable() {
  86. public void run() {
  87. mPasswordView.requestFocus();
  88. }
  89. });
  90. sendKeys(KeyEvent.KEYCODE_1);
  91. }
  92. }

HomeActivity.java测试代码如下所示:

[java] view plaincopy

  1. package com.jony.androidtestdemo.test;
  2. import android.content.Intent;
  3. import android.test.ActivityUnitTestCase;
  4. import android.widget.TextView;
  5. import com.jony.androidtestdemo.HomeActivity;
  6. import com.jony.androidtestdemo.R;
  7. public class HomeActivityTest extends ActivityUnitTestCase<HomeActivity> {
  8. private static final String TAG = "HomeActivityTest";
  9. private static final String LOGIN_CONTENT = "username:1231\npassword:11";
  10. private HomeActivity mHomeActivity;
  11. private TextView mLoginContentView;
  12. public HomeActivityTest() {
  13. super(HomeActivity.class);
  14. }
  15. @Override
  16. public void setUp() throws Exception {
  17. super.setUp();
  18. Intent intent = new Intent();
  19. intent.putExtra(HomeActivity.EXTRA_USERNAME, "1231");
  20. intent.putExtra(HomeActivity.EXTRA_PASSWORD, "11");
  21. // HomeActivity有extra参数,所以我们需要以intent来启动它
  22. mHomeActivity = launchActivityWithIntent("com.jony.androidtestdemo",
  23. HomeActivity.class, intent);
  24. mLoginContentView = (TextView) mHomeActivity
  25. .findViewById(R.id.login_content);
  26. }
  27. public void testLoginContent() {
  28. assertEquals(LOGIN_CONTENT, mLoginContentView.getText().toString());
  29. }
  30. @Override
  31. public void tearDown() throws Exception {
  32. super.tearDown();
  33. }
  34. }

到此,简单的测试代码就完成了,接下来就是验证代码能否正常运行。

首先,需要将Android应用程序安装到手机或者模拟器上面才能运行测试代码,打开Eclipse的Outline窗口,选中需要测试的方法,单击右键选择Run As-->Android Junit Test

如果出现下图的绿色状态栏则说明运行成功。

Android性能测试

在Android的SDK的tools 目录中,Android为我们提供了一个性能测试工具traceview,通过traceview功能我们能够确切了解每个方法执行的时间,调用次数以及递归调用测试等信息。通过分析各方法的调用时间可以了解系统的瓶颈,提升系统性能。

使用方法:

在需要进行性能分析的Activity中加入以下代码(一般在Activity的onCreate()方法中添加):

[java] view plaincopy

  1. Debug.startMethodTracing("jonytest");//jonytest.trace

在onDestroy()方法中添加:

[java] view plaincopy

  1. Debug.stopMethodTracing();// 停止数据采集

运行程序,当程序运行到该Activity是,系统会自动记录该Activity的所调用的所有方法的信息,并生成jonytest.trace文件保存在SDcard中。将该文件导出到电脑C盘,运行以下命令:traceview jonytest.trace 系统将会弹出如图所示窗口(可以在Find窗口查找具体方法(目前只支持小写)):

至此,Android单元测试和系统优化已经给大家介绍完了,知识融会贯通,希望对大家有所帮助。

时间: 2024-08-12 05:30:16

<只看这个就够了。。。>Android自动化测试及性能优化的相关文章

Android应用开发性能优化完全分析

 应用UI性能问题分析 UI可谓是一个应用的脸,所以每一款应用在开发阶段我们的交互.视觉.动画工程师都拼命的想让它变得自然大方美丽,可是现实总是不尽人意,动画和交互总会觉得开发做出来的应用用上去感觉不自然,没有达到他们心目中的自然流畅细节:这种情况之下就更别提发布给终端用户使用了,用户要是能够感觉出来,少则影响心情,多则卸载应用:所以一个应用的UI显示性能问题就不得不被开发人员重视. 2-1 应用UI卡顿原理 人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然

Android 应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,譬如Google官方都已经推出了优化专题,我这里只是总结下自的感悟而已,若有得罪欢迎拍砖,我

【转】Android应用开发性能优化完全分析

http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网

转——Android应用开发性能优化完全分析

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,

转:Android应用开发性能优化完全分析

转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质

android 内存和性能优化汇总

1.即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术.即时编译前期的两个运行时理论是字节码编译和动态编译.Android原来Dalvik虚拟机是作为一种解释器实现,新版(Android2.2+)将换成JIT编译器实现.性能测试显示,在多项测试中新版本比旧版本提升了大约6倍. 2. 就像世界上没有免费的午餐,世界上也没有免费的对象.虽然gc为每个线程

ym——Android之ListView性能优化

Android之ListView性能优化 如果有看过我写过的15k面试题的朋友们一定知道,ListView的优化方式有以下几种: 重用了convertView ViewHolder static class ViewHolder 在列表里面有图片的情况下,监听滑动不加载图片 以上是大致的说了以下,应付面试已经足够了,如果要使用到项目中,可能有些初学者就迷茫了.接下来我详细的说一下,这个是如何优化的. 重用了convertView getView这个方法会调用的次数是你们的数据条目数*2,重用了c

那些Android中的性能优化

性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起. 首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没反应,取关卸载算了. 这跟什么有关,我们先苍白的反驳下,尼玛用户设备老旧网又烂,关我屁事,根本不用优化.可是,老板拍板了,施压给CTO,然后CTO又来找你:Y的今天必须给我想办法优化了,不然不准回家. 好吧,为什么从UI的表象上看,App又卡又慢而且还错乱.我们试着来剖析下吧. 题外话:把minSDK改

Android应用程序性能优化Tips

主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的.通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中不会涉及这方面的知识点.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个原则: 不要做冗余的工作 尽量避免执行过多的内存分配操作 To ensure your app performs well across