背景
- 早期Junit 和Instrumentation能进行简单的单元测试,如果想进行复杂的UI与接口测试就难以用两者去实现了,这里介绍Robolectric快速集成测试用法。
Robolectric
- Robolectric优点:(1). 自身api支持复杂场景的使用;(2). 相对其他测试框架速度较快。
- Robolectric API文档:http://robolectric.org/javadoc/latest/
- Robolectric官网:http://robolectric.org/blog/2018/10/25/robolectric-4-0/
Robolectric接入流程
以下都是引用官网的,这里介绍只是为了方便没有梯子的同学
- 在你项目app/build.gradle下添加Roboletric依赖
android {
//下面这个必须要,要不运行起来会提示找不到资源文件的错
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
//这里的版本要以官网最新的为准,我刚开始接入的时候用旧版本就报mainfest.xml找不到的错误,然后google找了一圈解决办法都没办法解决。后面用了官网最新版本就可以了
testImplementation 'org.robolectric:robolectric:4.3'
}
- 如果你的androidstudio的版本低于3.3,请在gradle.properties文件添加下面一句话
android.enableUnitTestBinaryResources=true
Robolectric实战
模拟代码的Activity跳转
- 首先在ActivityA给一个控件绑定一个Click事件,然后就是new一个Intent。(Kotlin劝退)
override fun init() {
image = findViewById(R.id.image)
image!!.setOnClickListener {
val intent = Intent(this, TestActivity::class.java)
this.startActivity(intent)
}
}
- 回到我们的单元测试中,我们要验证ActivityA中是否正确跳转到ActivityB了,这时候肯定需要一个ActivityA的实例化对象。
@RunWith(RobolectricTestRunner::class)
@Config(
application = android.app.Application::class,
sdk = [21]
)
class ExampleUtilsTest {
@Test
fun startActivity() {
//获取实例
val activityA = Robolectric.setupActivity(MainActivity::class.java)
//找到控件,模拟点击
activityA.findViewById<ImageView>(R.id.image).performClick()
//创建理想化的intent,用来做对比
val expectIntent = Intent(activityA, ActivityB::class.java)
//封装成ShadowActivity,这样子才能拿到里面的参数
val activityAA = Shadows.shadowOf(activityA)
//获取ActivityA的跳转intent
val actualIntent = activityAA.nextStartedActivity
//比较两个intent的落地页是不是都是同个类
Assert.assertEquals(expectIntent.component, actualIntent.component)
}
}
- 如果把上面的ActivityB改成ActivityC,这段单元测试就会跑不过了。多动起手来尝试下。
后续
- 后续打算总结下,用Robolectric来模拟接口拉去数据情况。等我后续理解跟深入一定会再出一期。
网友评论