精华内容
下载资源
问答
  • Android 测试

    千次阅读 2017-08-04 10:45:33
    Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试
    Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试Android 测试
    
    展开全文
  • Android测试总结

    千次阅读 2016-07-25 21:17:29
    Android测试总结Android测试总结 简介 代码测试 Junit Mockito Mockwebserver Android自动化测试 Android monkey Android monkeyrunner Android UIAutomator Android Espresso 自动化测试示例 Monkey Monkey Runner ...

    Android测试总结


    简介

    最近整理了Android测试方便的只是,主要涉及代码测试和自动化测试。

    代码测试

    Junit

    JUnit浅谈

    Mockito

    Mockito浅谈

    Mockwebserver

    MockWebServer

    Android自动化测试

    Android monkey

    Android Monkey整理

    Android monkeyrunner

    Android monkeyrunner整理

    Android UIAutomator

    Android UIAutomator浅谈

    Android Espresso

    Android Espresso浅谈

    自动化测试示例

    下面示例一个Android项目,就是一个简单的登录页面,依次使用上面介绍的自动化测试方案测试界面。

    首先是界面布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:id="@+id/activity_main"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="20dp"
        tools:context="cn.mycommons.testcase.MainActivity">
    
        <EditText
            android:id="@+id/edtUserName"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:hint="Input user name" />
    
        <EditText
            android:id="@+id/edtPasswd"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:hint="Input password"
            android:contentDescription="Input password"
            android:inputType="textPassword" />
    
        <Button
            android:id="@+id/btnLogin"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="Login" />
    </LinearLayout>

    其次是页面代码:

    package cn.mycommons.testcase;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        EditText edtUserName;
        EditText edtPasswd;
        Button btnLogin;
    
        String userName;
        String passwd;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            edtUserName = (EditText) findViewById(R.id.edtUserName);
            edtPasswd = (EditText) findViewById(R.id.edtPasswd);
            btnLogin = (Button) findViewById(R.id.btnLogin);
    
            btnLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    userName = edtUserName.getText().toString();
                    passwd = edtPasswd.getText().toString();
                    if (check(userName, passwd)) {
                        doLogin(userName, passwd);
                    }
                }
            });
        }
    
        boolean check(String userName, String passwd) {
            do {
                if (userName.length() < 5) {
                    showToast("User name invalidate");
                    break;
                }
                if (passwd.length() < 5) {
                    showToast("Password invalidate");
                    break;
                }
                return true;
            } while (false);
            return false;
        }
    
        void doLogin(String userName, String passwd) {
            if ("admin".equals(userName) && "admin".equals(passwd)) {
                showToast("Login success");
                startActivity(new Intent(this, SuccessActivity.class));
            } else {
                showToast("Login fail");
            }
        }
    
        void showToast(String msg) {
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }

    Monkey

    Monkey只是检查使用下shell命令即可。

    adb shell monkey -p cn.mycommons.testcase -v 50000

    Monkey Runner

    Monkey Runner提供的是一个python文件,然后调用monkeyrunner命令即可。

    $ monkeyrunner test_case.py
    # Imports the monkeyrunner modules used by this program
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
    
    # Connects to the current device, returning a MonkeyDevice object
    print 'wait for device connection.'
    device = MonkeyRunner.waitForConnection()
    print 'connect device success.'
    
    # Takes a screenshot
    result = device.takeSnapshot()
    print 'takeSnapshot success.'
    # Writes the screenshot to a file
    result.writeToFile('./test_case1.png','png')
    print 'save image to file success.'
    
    # input user name
    device.touch(200,380,'DOWN_AND_UP')
    print 'touch user name'
    for x in xrange(1,100):
        device.press("KEYCODE_DEL",'DOWN_AND_UP')
    print 'delete user name'
    device.type("admin")
    print 'input admin to user name'
    
    # input passwd 
    device.touch(200,500,'DOWN_AND_UP')
    print 'touch password'
    for x in xrange(1,100):
        device.press("KEYCODE_DEL",'DOWN_AND_UP')
    print 'delete password'
    device.type("admin")
    print 'input admin to password'
    
    # press login button
    device.touch(200,680,'DOWN_AND_UP')
    print 'press login button'
    
    MonkeyRunner.sleep(2)
    
    # Takes a screenshot
    result = device.takeSnapshot()
    print 'takeSnapshot success.'
    # Writes the screenshot to a file
    result.writeToFile('./test_case2.png','png')
    print 'save image to file success.'

    UiAutomator

    package cn.mycommons.testcase;
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.Build;
    import android.support.test.InstrumentationRegistry;
    import android.support.test.filters.SdkSuppress;
    import android.support.test.runner.AndroidJUnit4;
    import android.support.test.uiautomator.By;
    import android.support.test.uiautomator.UiDevice;
    import android.support.test.uiautomator.UiObject;
    import android.support.test.uiautomator.UiObjectNotFoundException;
    import android.support.test.uiautomator.UiSelector;
    import android.support.test.uiautomator.Until;
    import org.hamcrest.Matchers;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import static org.junit.Assert.assertThat;
    
    @RunWith(AndroidJUnit4.class)
    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN_MR2)
    public class MainActivityTest {
    
        private static final String BASIC_SAMPLE_PACKAGE = "cn.mycommons.testcase";
        private static final int LAUNCH_TIMEOUT = 5000;
        private static final String STRING_TO_BE_TYPED = "UiAutomator";
    
        private UiDevice mDevice;
    
        @Before
        public void before() {
            mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
            mDevice.pressHome();
    
            // Wait for launcher
            final String launcherPackage = mDevice.getLauncherPackageName();
            assertThat(launcherPackage, Matchers.notNullValue());
            mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT);
    
            Context context = InstrumentationRegistry.getContext();
            final Intent intent = context.getPackageManager().getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            context.startActivity(intent);
    
            // Wait for the app to appear
            mDevice.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT);
        }
    
        @Test
        public void testLogin1() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
    
            edtUserName.setText("admin");
            edtPasswd.setText("admin");
            login.click();
    
            mDevice.waitForWindowUpdate(BuildConfig.FLAVOR, 3000);
        }
    
        @Test
        public void testLogin2() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("");
            edtPasswd.setText("");
    
            login.click();
        }
    
        @Test
        public void testLogin3() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("abc");
            edtPasswd.setText("");
    
            login.click();
        }
    
        @Test
        public void testLogin4() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("");
            edtPasswd.setText("abc");
    
            login.click();
        }
    
        @Test
        public void testLogin5() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("abc");
            edtPasswd.setText("abc");
    
            login.click();
        }
    
        @Test
        public void testLogin6() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("abcedf");
            edtPasswd.setText("abc");
    
            login.click();
        }
    
        @Test
        public void testLogin7() throws UiObjectNotFoundException {
            UiObject login = mDevice.findObject(new UiSelector().text("Login"));
            UiObject edtUserName = mDevice.findObject(new UiSelector().text("Input user name"));
            UiObject edtPasswd = mDevice.findObject(new UiSelector().descriptionContains("Input password"));
    
    
            edtUserName.clearTextField();
            edtPasswd.clearTextField();
            edtUserName.setText("abcedf");
            edtPasswd.setText("abcedf");
    
            login.click();
        }
    }

    Espressor

    package cn.mycommons.testcase;
    
    import android.support.test.espresso.Espresso;
    import android.support.test.espresso.action.ViewActions;
    import android.support.test.espresso.matcher.ViewMatchers;
    import android.support.test.rule.ActivityTestRule;
    import android.support.test.runner.AndroidJUnit4;
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    @RunWith(AndroidJUnit4.class)
    public class MainActivityEspressoTest {
    
        @Rule
        public ActivityTestRule<MainActivity> testRule = new ActivityTestRule<>(MainActivity.class);
    
        @Test
        public void testLogin() {
            Espresso.onView(ViewMatchers.withContentDescription(R.id.edtUserName)).perform(ViewActions.typeText("admin"));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText("admin"));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    
        @Test
        public void testLogin1() {
            Espresso.onView(ViewMatchers.withId(R.id.edtUserName)).perform(ViewActions.typeText(""));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText(""));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    
        @Test
        public void testLogin2() {
            Espresso.onView(ViewMatchers.withId(R.id.edtUserName)).perform(ViewActions.typeText("abc"));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText(""));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    
        @Test
        public void testLogin3() {
            Espresso.onView(ViewMatchers.withId(R.id.edtUserName)).perform(ViewActions.typeText(""));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText("abc"));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    
        @Test
        public void testLogin4() {
            Espresso.onView(ViewMatchers.withId(R.id.edtUserName)).perform(ViewActions.typeText("abc"));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText("abc"));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    
        @Test
        public void testLogin5() {
            Espresso.onView(ViewMatchers.withId(R.id.edtUserName)).perform(ViewActions.typeText("abcdef"));
            Espresso.onView(ViewMatchers.withId(R.id.edtPasswd)).perform(ViewActions.typeText("abcdef"));
            Espresso.onView(ViewMatchers.withId(R.id.btnLogin)).perform(ViewActions.click());
        }
    }

    自动化测试总结

    • Monkey
      准确来说,这不算是自动化测试,因为其只能产生随机的事件,无法按照既定的步骤操作;

    • Monkeyrunner
      优点:操作最为简单,可以录制测试脚本,可视化操作;
      缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限,上面代码中已经显示出来,完全使用的数字坐标,移植到另外一个设备,则不能运行。

    • UiAutomator
      优点:可以对所有操作进行自动化,操作简单;
      缺点:Android版本需要高于4.3,无法根据控件ID操作,相对来说功能较为局限,但也够用了;

    • Espresso
      优点:主要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,功能强大;
      缺点:针对APK操作,因此操作相对复杂;

    总结:由上面介绍可以有这样的结论:测试某个APK,可以选择Espresso;测试过程可能涉及多个APK,选择UiAutomator;一些简单的测试,选择Monkeyrunner;

    展开全文
  • Android测试详解,主要介绍如何进行单元测试,Android测试的步骤,流程,了解Android测试中的相关知识点; 同时介绍当前使用广泛的云测试,包括有Testin和百度云测等。

           写博客辛苦了,转载的朋友请注明出处哦,finddreams:(http://blog.csdn.net/finddreams/article/details/41120607

           一个APP软件开发的一般流程:需求分析——设计文档——建立模型——功能实现——测试修改——发布。 

           记得有一篇文章说过,做一个APP的开发周期最好是控制在三个月内,花3个月的时间开发,先打入市场,收集回馈再加以改善。其中时间安排是开发为一个月,而测试和调整则需要两个月。

           测试是软件开发中非常重要的一环,对于我们的APP开发也同样如此。但对于初学者,我们不是很清楚测试该如何做,下面就给大家介绍一下Android开发的测试:

           一.单元测试

           任何程序的开发都离不开单元测试来保证其健壮和稳定。Android程序自然也不例外。从Android SDK 0.9开始,就有了比较成熟的测试框架,但是直到目前最新的1.1版本,也没有详细的文档介绍这个内容。所以今天我就给大家总结一下:


           1.JUnit     

            做过Java开发的人都知道JUnit是用来做单元测试的,JUnit是指从Apache基金会下载的junit.jar里提供的一系列单元测试功能。Android是基于Java的,所以测试框架的特性也是基于JUnit。使用JUnit测试框架,是正规Android开发的必用技术,在JUnit中可以得到组件,可以模拟发送事件和检测程序处理的正确性。单元测试是嵌入到项目中,也可以作为一个单独的项目针对某个具体项目进行测试。


           2.单独的测试项目

           在Eclipse中新建一个单元测试项目,点击下一步,填写工程名。

                                               

           

          然后在下一步的时候需要你选择一个测试的目标工程,可以选择另外一个项目,也可以只在本项目中测试。他们的区别是选择另外一个项目可以测试其他项目中的数据。

                                             

     

           完成后,如果选择测试其他项目我们可以在AndroidManifest.xml文件中可以看到如下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.finddreams.blacknum.test"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk android:minSdkVersion="8" />
        
        <instrumentation
            android:name="android.test.InstrumentationTestRunner"
            android:targetPackage="com.finddreams.blacknum" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <uses-library android:name="android.test.runner" />
        </application>
    
    </manifest>

           如果是选择自身做完测试项目,就会看到

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.finddreams.test"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk android:minSdkVersion="10" />
    
        <instrumentation
            android:name="android.test.InstrumentationTestRunner"
            android:targetPackage="com.finddreams.test" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <uses-library android:name="android.test.runner" />
        </application>
    
    </manifest>

           为了测试我们先创建一个简单点类,主要功能是打印出测试通过log:

    package com.finddreams.test;
    
    import android.util.Log;
    
    public class AppDemo {
    
    	public void testMethod(){
    		Log.i("Tag", "测试通过");
    	}
    }
    

     

           接下来是创建测试类,测试的类要继承android.test.AndroidTestCase  代码如下:

    package com.finddreams.test;
    
    import android.test.AndroidTestCase;
    
    public class AppTest extends AndroidTestCase{
    
    	public void test(){
    		AppDemo demo =new AppDemo();
    		demo.testMethod();
    	}
    
    }
    


          然后点击右键Run As 选择Android JUnit Test 运行,就可以在右侧看到结果了:

                                               

              绿色条表示成功,如果出现了红色条,表示出血了,程序有错误,需要及时改正过来。

     

           3.嵌入式的测试

           把测试框架嵌入到自己项目中去,其实也很简单,只需要在AndroidManifest.xml中加入如下代码就可以了:

    1.  <instrumentation  
    2.         android:name="android.test.InstrumentationTestRunner"  
    3.         android:targetPackage="com.finddreams.blacknum" />  
    1.  <application  
    2.         android:icon="@drawable/ic_launcher"  
    3.         android:label="@string/app_name" >  
    4.         <uses-library android:name="android.test.runner" />  
    5.     </application>  

          如果你不记得怎么写的话,可以先按照第一步来建一个独立的测试项目,就能够在AndroidManifest.xml中找到如上代码,复制粘贴到自己的工程中去。注意:android:targetPackage    必须换成你所要测试项目的包名。


          测试中的几个知识点:

           TestCase     基类:

           TestCase  这个类用于在Android担当所有独特的TestCase的基类的作用,它是一个Abstract Class。

           包含访问系统对象(如Context)的方法。使用Context,你可以浏览资源,文件,数据库等等;

            ——ApplicationTestCase

                    测试整个应用程序的类。它允许你注入一个模拟的Context到应用程序中,在应用程序启动之前初始化测试参数,并在应用程序结束之后销毁之前检查应用程序;

           ——ProviderTestCase2

                   测试单个ContentProvider的类。因为它要求使用MockContentResolver,并注入一个IsolatedContext,因此Provider的测试是与OS孤立的;

           —— ServiceTestCase

                   测试单个Service的类。你可以注入一个模拟的Context或模拟的Application(或者两者),或者让Android为你提供Context和MockApplication;

           ——ActivityTestCase

                  Activity测试类的基类。我们测试activity时就是继承了这个类来编写一个自己的测试类进行测试,也是项目当中最长用到的。


           二、云测试

           目前对移动App的测试主要指的是下面几部分:

           1.功能测试。遍历应用的每一个角落,查看应用的功能、逻辑是否正常。
           2.性能测试。应用的性能怎样,如启动时间、反应时间等。
           3.兼容性测试。对不同目标终端设备、操作系统版本的兼容性测试。

           第一个功能测试,是属于测试人员查看功能模块,来发现功能缺陷。但对于第二、三点有时候我们仅凭测试人员有限的时间和精力是难以测试出来的。随着移动设备、操作系统版本的碎片化,不同的Android系统版本,不同的屏幕尺寸,分辨率,给测试带来了极大的不便。
           云测试因此孕育而生,所谓云测试是指开发者将App上传之后,在服务器端的自动化测试环境中部署和测试,相比开发者自己测试来说有很多优点,比如不用购买真机,无需部署运维等。比较普遍的使用的有Testin云测和百度云众测等等。

            Testin


           Testin云测试是首家面向全球提供免费App真机自动化云测试服务平台,基于云端部署超过300款、3000部主流智能移动设备,可实现自定义终端进行批量自动化兼容适配测试以及功能、性能、稳定性测试。已累计帮助移动开发者测试App应用700多万次。极大的减少大量重复、枯燥的人力测试工作;节省测试终端的租用、购买成本。

          Testin特性
           真机测试:终端云 节省测试设备购买租赁成本
           Testin云测试基于云端部署超过300款3000多部主流的Pad、Phone、Touch、Smart TV等智能移动设备,实时上架最新终端,免去测试终端的购买、租赁等诸多烦恼。
           自动化测试:高效率 节省测试人员成本及时间
           彻底告别原始的人工测试,5分钟内自动完成安装/卸载、启动/运行、UI适配等枯燥手工测试,保障App应用高质量快速迭代,按期发布最新版本。
         
           测试类型
    1)兼容测试
    ①安装卸载测试:测试App在指定终端上是否可正常安装、正常卸载,准确定位错误原因。
    ②遍历测试:自动识别App可执行的功能,在一定时间内遍历App的不同功能界面,通过截图记录操作路径 并输出日志、定位异常现象。
    ③运行稳定性测试:类似Monkey的随机性压力测试,测试App运行期的稳定性。
    ④UI适配测试:测试App的UI与目标终端的屏幕是否适配,记录是否存在渲染失败、错位、黑边框、黑白屏等现象。
     
     2)性能测试
    ①启动时间检测:检测App在终端上首次启动时间。
    ②内存、CPU耗用检测:检测App在终端上运行时不同时段占用内存、CPU情况。
    ③流量耗用检测:检测App在终端上运行时的网络流量消耗情况。
    ④电池温度检测:检测App在终端上运行时,对终端的电池温度等性能指标的影响情况。

      3)功能测试
    ①自定义脚本测试:上传自定义脚本,脚本中给出准确的测试方法,能自动定位错误及反馈出错原因,能在结果报告中呈现测试过程出现的bug并提供重现步骤。利用JUnit快速定位代码错误,帮助您正确改善产品质量。
    ②执行结果判定:比对每个用例的测试结果,未通过用例给出准确的日志分析。
    ③支持Robotium、淘宝Athrun框架:支持Robotium、淘宝Athrun框架编写的自动化测试脚本。
           
           
            云测试还有百度云,易测云都是蛮不错的,既可以为应用测试,同时也能为手游进行测试,并能够为手游录像等等。
          我想说的是现在对开发者来说是个很好的时机,我们APP中需要的功能很多已经有人做好了,比如推送啊,一键分享啊,地图导航啊,以及即时通讯啊,甚至于服务器端的功能人家也都做好了,把我们从服务端中解放出来(具体可以看我的另一篇文章《 

    BaaS让你快速开发APP,和服务端说再见

    》)。程序员中说的最多的一句话就是“不要重复造轮子”,前辈们已经做得很完善的事情,我们只需拿来就用,这给我们开发提供了极大的便利。

           今天就先和大家聊到这里,以后我会给大家介绍一下关于如何使用第三方平台的现有功能集成到自己的项目当中,请关注我后期的更新,谢谢!
    展开全文
  • Android 测试支持库提供了大量用于测试 Android 应用的框架。此库提供了一组 API,让您可以为应用快速构建何运行测试代码,包括 JUnit 4 和功能性用户界面 (UI) 测试。您可以从 Android Studio IDE 或命令行运行使用...

    前文

    上篇介绍了Android Studio中的单元测试和自动化测试的基础,这篇我们来看看如何部署和运用测试实例。
    --------------------------------------------------------------------------------------------------------------------
    Android测试,Android Studio中的单元测试、UI测试和自动化测试使用说明第一篇
    --------------------------------------------------------------------------------------------------------------------

    5、运行你的测试实例

    现在是时候运行你的测试实例了! 右键单击CalculatorTest类并选择Run> CalculatorTest。 您还可以通过在项目目录中发出以下命令来从命令行运行测试:
    ./gradlew test
    不管您如何运行测试,都应该看到输出,告诉您4个测试中有4个失败。 这是预期的结果,因为我们尚未执行算术运算。


    让我们修改Calculator类中的sum(double a,double b)方法,返回正确的结果并重新运行测试。 你应该看到只有3个测试失败了。
    Calculator.java
    public double sum(double a, double b){
        return a + b;
    }
    作为一个Demo练习,你可以编写计算方法实现其余的方法来通过测试。

    您可能已经注意到,Android Studio从未要求您连接设备或启动模拟器来运行测试。 这是因为驻留在src / tests文件夹中的测试是在您的计算机上的Java VM上运行的本地单元测试。 这样可以在编写测试的时候实现一个非常快速的迭代流程,然后实现通过这些测试的功能,然后添加更多的测试...这就是所谓的测试驱动开发。
    在本地运行测试时需要注意的一件事就是Gradle为包含Android框架类的类路径提供了一个android.jar,但是它们不是完全可用的(所以你不应该仅仅调用Activity的方法,并期望它们正常运行)。 你应该使用像Mockito这样的模拟框架来模拟任何你需要使用的Android方法调用。 对于在设备上运行并使用完整Android框架的测试,请继续阅读此代码实验的下一部分。


    6、配置您的项目进行仪器测试

    虽然支持在Android框架中运行检测测试,但目前的开发工作主要围绕作为Android测试支持库的一部分发布的新的AndroidJUnitRunner。 该库还包含一个运行功能性UI测试的框架Espresso。 我们通过编辑模块的build.gradle文件中的相关部分来添加到我们的项目中:
    build.gradle
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    
        defaultConfig {
            applicationId "com.example.testing.testingexample"
            minSdkVersion 15
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
    
            //ADD THIS LINE:
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
        //ADD THESE LINES:
        packagingOptions {
            exclude 'LICENSE.txt'
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:22.0.0' //← MAKE SURE IT’S 22.0.0
        testCompile 'junit:junit:4.12'
    
        //ADD THESE LINES:
        androidTestCompile 'com.android.support.test:runner:0.2'
        androidTestCompile 'com.android.support.test:rules:0.2'
        androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
    }

    重要提示:由于某些依赖版本冲突,您可能需要确保正在使用com.android.support:appcompat-v7库的版本22.0.0,如上面的代码片段所示。
    此外,Android Studio可能会通知您未安装Build Tools 22.0.1。 您应该接受建议的修补程序,Studio将为您安装相应的构建工具,或者将此行更改为build.gradle以指向您已安装在您计算机上的版本。

    剩下的就是在Build Variants窗格中切换到Android Instrumentation测试。 你的项目应该在这一点上自动同步。 如果不是,请按Gradle的“同步”按钮。


    7、添加一个简单的交互



    在我们开始使用Espresso测试来测试UI之前,让我们在应用程序中添加一些Views和一个简单的行为。 我们将使用一个EditText,用户可以输入他的名字,一个Button使用TextView来输出。 打开res / layout / activity_main.xml并粘贴下面的代码:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:text="@string/hello_world" android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <EditText
            android:hint="Enter your name here"
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Say hello!"
            android:layout_below="@+id/editText"
            android:onClick="sayHello"/>
    </RelativeLayout>

    您还需要在MainActivity.java中添加onClick处理程序:
    MainActivity.java
    public void sayHello(View v){
        TextView textView = (TextView) findViewById(R.id.textView);
        EditText editText = (EditText) findViewById(R.id.editText);
        textView.setText("Hello, " + editText.getText().toString() + "!");
    }
    您现在可以运行应用程序来查看它的行动,并确保一切正常。 在按下运行按钮之前,请确保您的运行配置未设置为运行上一部分的测试类。 使用下拉菜单并选择app,点击运行。 

    8、创建并运行Espresso测试


    在项目总览中,找到以(androidTest)后缀结尾的包名,并在那里创建一个新的Java类。 您可以将其命名为MainActivityInstrumentationTest。 粘贴以下代码作为其内容:
    MainActivityInstrumentationTest.java
    package com.example.testing.testingexample;
    
    import android.support.test.InstrumentationRegistry;
    import android.support.test.espresso.action.ViewActions;
    import android.support.test.rule.ActivityTestRule;
    import android.support.test.runner.AndroidJUnit4;
    import android.test.ActivityInstrumentationTestCase2;
    import android.test.suitebuilder.annotation.LargeTest;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    import static android.support.test.espresso.Espresso.onView;
    import static android.support.test.espresso.action.ViewActions.click;
    import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
    import static android.support.test.espresso.action.ViewActions.typeText;
    import static android.support.test.espresso.assertion.ViewAssertions.matches;
    import static android.support.test.espresso.matcher.ViewMatchers.withId;
    import static android.support.test.espresso.matcher.ViewMatchers.withText;
    
    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class MainActivityInstrumentationTest {
    
        private static final String STRING_TO_BE_TYPED = "Peter";
    
        @Rule
        public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
                MainActivity.class);
    
        @Test
        public void sayHello(){
            onView(withId(R.id.editText)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); //line 1
    
            onView(withText("Say hello!")).perform(click()); //line 2
    
            String expectedText = "Hello, " + STRING_TO_BE_TYPED + "!";
            onView(withId(R.id.textView)).check(matches(withText(expectedText))); //line 3
        }
    
    }
    该类将由AndroidJUnitRunner运行并执行在sayHello()方法中实现的测试。 以下是测试的内容:
    1、首先,它使用ID editText查找视图,并输入字符串“Peter”,然后关闭屏幕上的键盘。
    2、接下来,查找文本“Say hello!”的视图并进行了click事件。 这是我们的Button,为此我们没有在布局XML中设置一个id,因此我们通过搜索它的文本来引用它。
    3、最后,将TextView的文本内容与预期结果进行比较,如果匹配,测试通过。
    您可以通过右键单击该 类 并选择Run> MainActivityInstrume ...(第二个包含Android图标)来运行测试。

    这将在模拟器或连接的设备上运行测试,如果您观看屏幕,则可以看到Runner正在执行的操作(如在EditText输入文本,并点击Button执行操作代码)。 查看Android Studio中的输出以获取有关通过和失败测试的报告。

    恭喜,Android Studio中的单元测试、UI测试和自动化测试基础你已经基本入门了!

    声明

    欢迎转载,但请保留文章原始出处
    作者:Jaiky_杰哥 
    出处:http://blog.csdn.net/jaikydota163/article/details/78549345

    展开全文
  • Android 测试机选购指南

    千次阅读 2020-03-23 16:38:37
    这几天一直在选购公司的测试机,如何选择也是很令人头疼,记录下自己选择Android测试机的心得。 首先,如果当前公司还没有测试机,要选购几台,那么友盟榜单是一个很好的参考。 从榜单可知,国内2020年2月, ...
  • Android 测试支持库提供了大量用于测试 Android 应用的框架。此库提供了一组 API,让您可以为应用快速构建何运行测试代码,包括 JUnit 4 和功能性用户界面 (UI) 测试。您可以从 Android Studio IDE 或命令行运行使用...
  • android 测试简介

    千次阅读 2012-02-14 11:26:24
    每种android测试工具都继承自JUnit3 TestCase。     ApplicationTestCase用来测试android.app.Application;   ServiceTestCase用来测试android.app.Service;   ProviderTestCase2用来测试android....
  • android 测试开发概述

    千次阅读 2016-04-12 12:33:37
    android测试主要有两种 1.本地测试(local test) 只在计算机中运行,这些测试运行在本地JVM中以减少执行时间。这种测试适合不需要android framework或者可以用模拟出的依赖来代替的测试。 2.设备测试...
  • 推荐android测试相关:http://www.jianshu.com/collection/b26df74781cb单元测试的流程使用AndroidStudio进行单元测试时,与当前网上众多资料进行比较。在较新版本下(当前我使用的是2.0)的studio中不需要自己进行...
  • Android 测试技能树

    千次阅读 2015-05-01 16:07:46
    Android 测试技能树Android 基础知识 Android 的体系结构 apk 的组成结构 adb 命令的使用 Android 的四大组件 Activity 的生命周期 … 测试/开发环境的准备 JDK 安装 SDK 安装 IDE 的使用(Eclipse/Android Studio) ...
  • android 测试研究方向

    千次阅读 2012-02-23 12:03:14
    给自己定个方向,今后android测试的研究方向: Android应用系统测试的设计 Android自动化测试 Monkey工具环境搭建 Monkey命令的使用 ADB常用命令详解 Robotium测试环境搭建 Robotium工具的应用 Android单元...
  • Android 测试是在 JUnit的基础上进行,你可以选择在JVM虚拟机上进行一个本地单元测试,也可以选择在Android设备上进行一个 仪器测试。本章节将讲述Android 测试相关的一些概念和工具。 测试类型 当使用Android ...
  • 之前的三篇文章《android基础知识12:android自动化测试03—基于junit的android测试框架01、02、03》对基于junit的android测试框架进行了一个简单介绍,并给出了应用例子。本文将对其中涉及到的其他类和内容做一个...
  • Android测试教程(2):测试基础

    万次阅读 2012-05-11 08:11:10
    Android测试框架(Android Testing Framework)为Android开发环境的一个组成部分,可以用来测试Android的各个方面,从单元测试到框架测试到UI测试等。 其主要功能有: Android测试框架基于JUnit,因此可以直接使用...
  • Android测试教程(4):测试相关API

    千次阅读 2012-05-13 08:49:37
    android.test 用于编写Android测试用例android.test.mock 定义了方便测试用的测试“桩”类android.test.suitebuilder 运行测试用例的Test Runner类 Android 测试API 是基于JUnit 扩展而来,并添加了与Android平台...
  • 使用Espresso Test Recorder编写Android测试

    千次阅读 2016-06-14 12:05:35
    Android测试工具在近两年有了显著的提升。Instrumentation和单元测试是当前流行的Android测试包中比较简单的。对于在自己的app中如何整合和使用这些工具,如何编写自己的测试,google上都有大量的源码和例子
  • Android测试原理(二)

    千次阅读 热门讨论 2014-02-25 12:53:28
    Android的测试API是基于JUnitAPI和扩展的instrumentation 框架以及特定的Android测试类。    2.3.1. Junit 你可以使用TestCase类来做单元测试而不调用 Android的API。TestCase 是 AndroidTestCase类的父类,...
  • Android测试教程(7):测试Content Provider

    千次阅读 2012-05-16 08:17:26
    Content Provider 为不同的应用访问数据提供了统一的接口,本篇介绍Android测试包中用于测试Content Provider 的相关知识。 Android 测试包中用于测试Content Provider的基本类为ProviderTestCase2, 允许你在一个...
  • Android测试教程(8):测试Service

    千次阅读 2012-05-17 08:58:13
    Android 测试框架也提供对Service测试的支持,基本类为ServiceTestCase,因为Service类通常假定和它是和Client是分开使用的,因此你可以无需使用Instrumentation 来测试Service。 当你设计一个Service时,你应该考虑...
  • Android测试驱动开发实践1

    千次阅读 2013-10-08 14:10:54
    在正式进行Android测试驱动开发之前,不得不先提一下Android应用架构问题。在传统软件开发中,MVC架构得到了广泛的应用,然而在Android开发中,很少见应用采用了MVC架构(不要说Android及Widget全部采用的是MVC架构...
  • Android测试教程(1):概述

    万次阅读 多人点赞 2012-05-10 08:10:12
    测试也是开发过程中一个重要组成部分,Android开发环境集成一个测试框架可以...Android测试的基础知识Activity Testing 侧重于Activity的测试,介绍了如果使用Instrumentation 在正常Activity生命周期之外来控制Activit
  • Android测试中能用到的一些脚本

    千次阅读 2015-01-28 09:58:24
    Android测试,有些事情需要经常地去做,比如截屏、录制视频(Android4.4新增功能)、批量安装应用(sdk中的adb无法安装以中文命名的apk)、批量卸载应用、获取应用对应的apk、包信息(包名、Activity,这里很多...
  • 前面介绍了Android测试的一些理论知识,从本篇开始的几篇将结合ApiDemoTest示例来介绍Android测试的实例。在此之前可以参照Android测试教程(3):测试项目 创建ApiDemos->tests 测试项目,本项目测试用来测试ApiDemos...
  • Android测试之Robotium自动化测试框架

    万次阅读 2017-06-14 00:17:07
    Robotium是一款国外的自动化测试框架,是一款免费的Android UI测试工具,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行...
  • Junit - Android测试之旅(一)

    千次阅读 2016-06-17 09:19:08
    引言 随着移动互联网的发展,越来越多的开发者投入到了Android的开发怀抱中。日益增多的app晃得我们眼花缭乱。...最近公司让我研究Android测试相关方面的内容,之前待过的一些公司基本都是快速开
  • android测试用例编写

    千次阅读 2014-11-24 23:28:11
    android中写测试用例也是用junit,测试用例代码风格是junit3的风格。java中测试用例中使用junit3需要继承TestCase(junit4则不需要,直接用annotation即可);android测试用例需要继承AndroidTestCase。连重新的...
  • Android测试用例执行线程和UI线程

    千次阅读 2013-04-11 11:05:53
    在做Android的AsyncTask测试的时候,发现测试用例在执行的时候是在一个名为“Instr: android.test.InstrumentationTestRunner”的线程中执行的,而...在Android测试工程的AndroidManifest.xml文件中,instrumentation标
  • 在eclipse中使用UIAutomator时步骤较为繁琐,而在Studio环境下只需要添加引用,编写测试类,运行测试类就可以实现。步骤较简单。1.配置环境在包依赖中添加对UIAutomator的引用,这里需要注意,引用包版本不能高于...
  • Appium Android测试中sendkeys 输入速度慢的替代方法 (Workround to improve Appium sendkeys method for Android testing)  相信大家在Appium Android应用的自动化测试中都遇到 sendkeys输入文本非常慢这个问题,...
  • Android测试方法总结汇总

    千次阅读 2016-02-23 15:31:57
    由于工作的需要,最近要对Android客户端软件进行测试,便学习了一下Android客户端测试的方法,现在与大家分享一下。 1.在Android客户端测试方面可以分为如下几个大的类别: 1、安卓黑盒测试工具 1)包括本身...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,267
精华内容 23,706
关键字:

android测试