前言
其实,为什么要写一篇文章来专门讲解一下Glide的单元测试呢,主要还是我看了下Glide版本的变迁,发现他做了很多单元测试。这也提醒了我,如果要编写一个性能好的框架,单元测试绝对是必不可少的,所以我想以这边文章来做一些单元测试方面的扫盲和Glide主要做的一些单元测试的类讲解。
本章目标
- 单元测试知识点扫盲
- Glide的单元测试讲解
单元测试知识点扫盲
在我们进行单元测试用例之前,首先我们应该通过下面几个方便了解下,在项目中所用到的单元测试,但是由于是几年前过时的单元测试了,我找资料也没有针对性的查找,下面的只是我在找资料过程中,所遇见的好的文章,记录下来以便于以后学习使用。大家如果对单元测试有了解了,也可以跳过这个准备工作,直接到下面开始章节去查看。
1.什么是Android的单元测试?
我们在看到Glide源码目录的时候,都会在Library包中查看到有一个test文件夹,这里放了大量的单元测试用例。很多奇怪的陌生的类,在这里我们可以看下弘洋的文章必知必会 | Android 测试相关的方方面面都在这儿文章介绍很全面。
2.Robolectric
在Glide-2.0.0
版本中,单元测试还是使用的过时的ActivityTestCase
来进行单元测试,由于我在测试过程中出现了一些bug,所以我在它原有的单元测试上更换了新的测试框架Robolectric,让我们不依靠android的设备环境,可以在jvm中去运行进行单元测试,这套框架也是以后Glide
版本使用的单元测试框架之一,非常好用的安卓测试框架,大家可以看上面推荐的文章进行系统学习。
2.1 配置Gradle
- AndroidStudio的环境
- libray Module
build.gradle
level file
dependencies {
...
//junit
testImplementation 'junit:junit:4.12'
//robolectric
testImplementation "org.robolectric:robolectric:3.8"
testImplementation 'org.robolectric:shadows-support-v4:3.4-rc2'
testImplementation "com.android.support.test:monitor:1.0.2"
}
2.2 编写测试用例
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest=Config.NONE)
public class GlideTest
{
@Test
public void testGlide()
{
System.out.println("Hello Glide Tdd");
}
}
3.Robolectric配置环境中踩过的坑
3.1 无法找到RobolectricTestRunner类问题
刚开始配置的时候,我在@RunWith(RobolectricTestRunner.class)的时候,无法找到
RobolectricTestRunner.class
文件,但是我在搜索的时候,在当前项目下是能搜索到,于是我就强行导包,并且运行成功了。估计是IDE出错了,第二天打开IDE以后就能找到了。
3.2 后台任务一直挂起的问题
这里测试环境就配置成功了,这里提示一下,因为我也是第一次配置这个测试环境,踩坑过程中,感觉主要还是需要科学上网,不然一些jar包很难下载下来,速度也很慢。另外需要注意的是在配置过程中针对不同的compileSdkVersion
的版本会下载对应的jar包,所以你会看见后台任务总是挂起的,这个时候你不要急于去关闭程序,我们可以根据console
打印的日志,打开路径~/.m2/repository/org/robolectric/android-all
(也就是本地maven缓存地址)去查看下载情况。如果是创建了文件夹,代表正在下载请耐心的等待,这里需要根据网络情况而定,在github的issue中也有人等了2个小时还没下载下来的。
3.3 资源无法找到异常
有时候,我们查找资源的时候会报错android.content.res.Resources$NotFoundException: Resource ID #0x7f090054
,比如在build.gradle
文件里面配置。
android {
...
testOptions { // <-- You need this
unitTests {
includeAndroidResources = true
}
}
...
}
Glide的单元测试讲解
当我们做好所有的准备工作以后,看下它的单元测试代码,以便于我们对Glide
的源码编写过程进行一些深入的了解,在这里我抽取一些部分的代码来进行重点讲解。
GlideTest的单元测试
1.正确创建ModelLoader的类型
单元测试
@RunWith(RobolectricTestRunner.class)
@Config(manifest=Config.NONE)
public class GlideTest
{
@Override
protected void setUp() throws Exception {
super.setUp()