• 在AndroidStudio中使用单元测试*


    1. 前言

        在Android开发中,如果对一个简单的功能,每次修改代码都重新运行到设备中进行测试,会浪费大量时间,降低开发工作效率。如果使用单元测试,编写单元测试类,执行测试单元测试类就可以对某些功能进行测试,大大提升了开发工作效率。

    2. 添加单元测试支持

        在AndroidStudio项目中,如果是新版本的AndroidStudio中新建的,会自动添加了单元测试的支持,如果旧项目,没有添加单元测试支持,需要手动进行配置。

    2.1 添加单元测试依赖包

        在程序模块下面的build.gradle中需要引入的依赖包:
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    • testImplementation-引入的依赖是java unit单元测试,是运行在当前电脑的jvm上的单元测试;
    • androidTestImplementation-引入的依赖是Android单元测试,是运行在Android环境的单元测试。

    2.2 添加测试代码目录

        如果AndroidStudio当前项目视图为Android,需要切换为Project视图,在程序模块下面的src目录下添加androidTest/java(Android单元测试,运行在Android环境的单元测试)和test/java(JUnit单元测试,运行在当前电脑的jvm上的单元测试),然后在里面添加包名和测试类。
    • androidTest/java(Android单元测试,运行在当前电脑的jvm上的单元测试,执行测试的时候需要Android连接设备,速度比较慢,适合需要调用Android api的单元测试)
    • test/java(JUnit单元测试,用来放不需要Android依赖的单元测试类,运行在当前电脑的jvm上的单元测试,速度快,适合只是对java代码功能进行单元测试)

    2 添加单元测试类

    2.1 手动编写单元测试类

    2.1.1 androidTest测试类

        androidTest测试类适用于需要依赖Android api的单元测试,需要连接Android设备才能进行测试。新建的androidTest java类需要添加@RunWith(AndroidJUnit4.class)注解,类的方法如果是测试入口方法需要添加@Test注解。
    示例代码:
    package com.xiaoying.untitestdemo;
     
    import android.content.Context;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.support.test.InstrumentationRegistry;
     
    import org.junit.Before;
    import org.junit.Test;
     
    import static org.junit.Assert.assertEquals;
     
    /**
     * Created by yinglovezhuzhu@gmail.com on 2018/5/13.
     */
    public class MainActivityTest {
     
        private Context mTargetContext;
     
        @Before
        public void setUp() throws Exception {
            mTargetContext = InstrumentationRegistry.getTargetContext();
        }
     
        @Test
        public void onCreate() {
            try {
                ApplicationInfo applicationInfo = mTargetContext.getPackageManager().getApplicationInfo(mTargetContext.getPackageName(), PackageManager.GET_META_DATA);
                Bundle metaData = applicationInfo.metaData;
                String data = metaData.getString("com.xiaoying.TEST");
     
                assertEquals("1234567890", data);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    2.1.2 test测试类

        test测试类适用于纯java的单元测试,运行于当前设备的jvm环境中,无需Android设备即可测试。新建test java类,类的方法如果是测试入口方法需要添加@Test注解。
    package com.xiaoying.untitestdemo;
     
    import org.junit.Before;
    import org.junit.Test;
     
    import static org.junit.Assert.*;
     
    /**
     * Created by yinglovezhuzhu@gmail.com on 2018/5/13.
     */
    public class UtilsTest {
     
        @Before
        public void setUp() throws Exception {
     
        }
     
        @Test
        public void isEmpty() {
     
            assertEquals(true, Utils.isEmpty(""));
        }
    }
    2.1.3 测试类中的setUp方法
        在测试类中的setUp方法,可以在启动测试前进行一些初始化,比如测试类中的变量等初始化,这个方法需要添加@Before注解。
    说明:
    1. 上面的示例代码中可以直接使用assertEquals,是因为使用了静态import方法引入了相应的包(import static org.junit.Assert.*;)
    2. 根据测试的功能合理使用androidTest和test,提高单元测试效率。

    2.2 自动生成测试类和测试方法

            上面介绍的是手动添加测试类和测试方法,以下介绍自动生成测试类和方法。在项目源码中选中需要添加单元测试的类并打开,在内容显示区域“右键”->“Go To”,在弹出窗口中选择“Test”,在弹出窗口中选择“Create New Test ......”

        在接下来弹出的对话框中,勾选需要添加单元测试的方法,在这里有个“Generate”通用方法生成,可以选择setUp/@Before(启动前调用,可用于初始化)和tearDown/@After(结束后调用)

    3. 运行单元测试

    3.1 运行单个测试方法

        在测试方法题内部,“右键”,在弹出菜单中选择“Run 方法名”即可(单元测试也可以使用断点调试和性能调试)。

    3.2 批量运行测试方法(有些情况下可能会无法实现)

        在终端使用gradle运行test任务,可以执行所有的单元测试方法(在AndroidStudio的Terminal运行gradlew test,在系统终端中运行gradle -p 项目路径 test,gradle没有配置环境变量,需要绝对路径),运行完成后,就会运行所有的单元测试方法,并且会显示结果,如下图:
  • 相关阅读:
    浏览器渲染引擎工作原理
    js运行原理与机制
    新式网络浏览器幕后揭秘
    网站身份信息验证规则Cookie、Session、Token、JWT说明
    http简介
    react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
    雅虎前端优化的35条军规
    服务端渲染与客户端渲染
    DataURL与File,Blob,canvas对象之间的互相转换的Javascript
    docker安装samba
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9657130.html
Copyright © 2020-2023  润新知