关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Gradle for Android 第六篇( 测试)

    Gradle for Android 第六篇( 测试)

    2016-01-07 00:00:00 出处:LeoLiang
    分享

    由于现阶段Android开发趋于敏捷开发,再加上国内大大小小的互联网公司都在做app,导致很多这会是一个系列,所以假如你看完该文,请看下列文章:

    Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )

    Gradle for Android 第二篇( Build.gradle入门 )

    Gradle for Android 第三篇( 依赖管理 )

    Gradle for Android 第四篇( 构建变体 )

    Gradle for Android 第五篇( 多模块构建 )

    开发人员对单元测试没有基本的概念,但是该文博文不会为大家讲解什么是单元测试,功能测试,而是讲解如何在Android studio上利用gradle使用现阶段流行的测试框架等。

    为了确保app或者library库的质量,有一个完整的测试非常重要。很长一段时间,Android开发工具都缺乏针对完整性测试的支持,但是最近,google为之做了大量的工作,其让开发者做测试变得更加容易了,一些旧的框架更新了版本,新的框架也被加入进来。我们现在不仅可以在Android studio中运行这些测试,甚至可以用gradle通过命令行直接执行。

    所以基于此,我们这一章,将会为大家介绍几种测试Android app的方式,我们也会深究之为何gradle可以帮助测试自动化。

    这一章节我将遵循以下内容:

    单元测试 功能测试 测试覆盖率

    单元测试

    相信大家都有了单元测试的概念,那么好的单元测试不仅仅能够确保app的质量,同时还可以让新代码开发更加容易。Android studio和gradle android插件默认支持单元测试,但是在你使用它之前,你仍需配置一下。

    JUnit

    JUnit存活了若干年,在测试界非常流行。其使得测试代码容易编写和维护,但是记住,JUnit只能测试逻辑代码,针对和Android SDK相关的代码并没什么卵用。

    在你开始编写junit测试之前,你需要为其新建一个目录。通常呢,这个会被叫做test,其会和你的main文件夹平级。

    app
    └─── src
    ├─── main
    │ ├─── java
            │    │    └─── com.example.app
            │    └───res
            └─── test
                 └─── java
                      └─── com.example.app

    你可以在test目录下创建测试类。

    我建议你使用JUnit 4,你可以将其作为依赖添加到你的依赖库。

    dependencies {
           testCompile 'junit:junit:4.12'
    }

    注意到你使用了testCompile,这意味着该jar包只会在你测试的时候导入apk。

    假如你有其他的构建版本呢,而你又只是想为特定版本添加该jar,你只需要这么做:

    dependencies {
           testPaidCompile 'junit:junit:4.12'
     }

    当所有的事情都OK了,就是时候开始写测试代码了。下面是简单的测试代码:

    import org.junit.Test;
       import static org.junit.Assert.assertEquals;
       public class LogicTest {
           @Test
           public void addingNegativeNumberShouldSubtract() {
               Logic logic = new Logic();
               assertEquals("6 + -2 must be 4", 4, logic.add(6, -2));
               assertEquals("2 + -5 must be -3", -3, logic.add(2, -5));
           }
    }

    那么如何跑起来呢,也很简单,运行gradlew test。假如你只是想再特定版本中跑呢,那就加一个呗gradlew testDebug。假如测试失败,gradle将会打印相关错误,假如所有测试成功通过,那么会显示BUILD SUCCESSFUL 。

    可能你会说,单个测试用例导致整个测试失败,这样不好,假如你想把整个测试案例都跑一遍,那也很简单啊:

    $ gradlew test --continue

    执行测试任务不仅仅是跑完所有的测试,而且其还会为你创建一份测试报告,你可以找到它app/build/reports/tests/debug/index.html。这份报告让你能够更快的发现问题,我觉得最重要的是当你将你的测试自动化后,这会非常有用,gradle会为每个构建版本都创建一份测试报告。假如你执行测试成功,你的测试报告会是这个样子:

    说了这么多原始的做法,那么看看Android studio怎么运行测试的吧。右键项目或者选择开始按钮。。这个太基础不多说了,运行成功是这个样子:

    好了,junit测试讲完了,是不是很简单。

    假如你想测试你的关联Android sdk代码怎么办,单元测试不是一个好主意,幸运的是,有多个依赖包供你选择,其中最出名的是Robolectric,其可以让你更方便的测试Android功能,并且还不用在设备或者模拟器上运行。

    Robolectric

    通过使用Robolectrie,你可以编写测试类,这些类可以使用Android SDK和资源文件,当然其还是跑在jvm上,这会让你测试app更加迅速。

    在开始使用Robolectrie之前,你需要添加依赖。注意除了Robolectric依赖,你需要添加JUnit包。

    apply plugin: 'org.robolectric'
       dependencies {
           compile fileTree(dir: 'libs', include: ['*.jar'])
           compile 'com.android.support:appcompat-v7:22.2.0'
           testCompile 'junit:junit:4.12'
           testCompile'org.robolectric:robolectric:3.0'
           testCompile'org.robolectric:shadows-support:3.0'
    }

    Robolectrie测试类也需要写在test文件夹下,举个例子:

     @RunWith(RobolectricTestRunner.class)
       @Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18)
       public class MainActivityTest {
           @Test
           public void clickingButtonShouldChangeText() {
               AppCompatActivity activity = Robolectric.buildActivity
                 (MainActivity.class).create().get();
               Button button = (Button)
                 activity.findViewById(R.id.button);
               TextView textView = (TextView)
                 activity.findViewById(R.id.label);
               button.performClick();
               assertThat(textView.getText().toString(), equalTo
                 (activity.getString(R.string.hello_robolectric)));
            } 
        }

    功能测试

    神马是功能测试,其是用来测试一个app的多个模块是否能够正常工作。举个栗子,你可以创建一个功能测试来确保你点击某一按钮后是否会有一个新的activity。依然,我们会有很多框架。但是在这里,我推荐Espresso。

    Espresso

    google创建Espresso的目的就是在于简化开发人员编写功能测试用例。这个包是由Android support repository提供,所以你可以通过SDK Manager使用它。

    在运行测试用例之前,你需要定义一个runner。google提供了AndroidJUnitRunner测试runner,这将帮助你在手机上运行Unit测试。测试runner可以帮你安装apk以及一个测试apk,执行所有测试,生成测试报告。

    假设你下载了support library包,那么你需要这么定义:

    defaultConfig {
           testInstrumentationRunner
             "android.support.test.runner.AndroidJUnitRunner"
       }

    当然你需要添加一些依赖包:

     dependencies {
           compile fileTree(dir: 'libs', include: ['*.jar'])
           compile 'com.android.support:appcompat-v7:22.2.0'
           androidTestCompile 'com.android.support.test:runner:0.3'
           androidTestCompile 'com.android.support.test:rules:0.3'
           androidTestCompile
             'com.android.support.test.espresso:espresso-core:2.2'
           androidTestCompile
             'com.android.support.test.espresso:espresso-contrib:2.2'
       }

    注意到这些依赖包使用了androidTestCompile,其不同于testCompile。当你直接运行时,会报错:

    Error: duplicate files during packaging of APK app-androidTest.apk
         Path in archive: LICENSE.txt
         Origin 1: .../hamcrest-library-1.1.jar
         Origin 2: .../junit-dep-4.10.jar

    其意思也很清楚,因为多个文件导致,你可以简单处理下:

     android {
         packagingOptions {
         exclude 'LICENSE.txt'
      }
    }

    注意:功能测试需要放在AndroidTest目录下,下面是测试用例:

    @RunWith(AndroidJUnit4.class)
       @SmallTest
       public class TestingEspressoMainActivityTest {
           @Rule
           public ActivityTestRule<MainActivity> mActivityRule = new
             ActivityTestRule<>(MainActivity.class);
           @Test
           public void testHelloWorldIsShown() {
               onView(withText("Hello world!")).check
                 (matches(isDisplayed()));
            } 
        }

    功能测试也有测试报告,当正确执行后,应该是这样的:

    最后可能有朋友问,在Android studio中执行测试,那就附图吧:

    测试覆盖率

    一旦你在你的项目中使用到了测试,那么你肯定想知道你的测试覆盖量。很真实,依然有很多测试覆盖率工具,我推荐的是Jacoco。

    Jacoco

    有一份覆盖率报告,很简单。你只需要配置一下:

    buildTypes {
         debug {
           testCoverageEnabled = true
         }
    }

    当你执行完构建,你可以在app/build/ outputs/reports/coverage/debug/index.html中找到,每个版本都会有一个报告。测试覆盖率会是这样的:

    你甚至可以通过点击查看更多信息,可以看到哪一行代码被测试。

    总结

    在这一章,我们学习了如何测试,我们学习了简单的单元测试,以及Robolectric测试。我们学习了功能测试,以及学习了如何使用Espresso。最好,我们学会了如何查看测试覆盖率报告。

    在下一章,我将会带来最重要的一章,即自定义化构建过程,创建自定义tasks和插件。当然了我们会首先介绍Groovy语法,理解其语法让你能够更轻松的理解gradle是如何工作的。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。