这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
起步
本文来自于我开发中的一个尝试,尝试用一种我没用过的开发方式「测试驱动开发」(Test-Driven Development,TDD)来开发。
测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。——百度百科
Room是Jetpack提供的一个SQLite抽象层,有着Jetpack方方面面的支持,开发体验很不错。Room是一个方便开发的库,很多东西都是sqlite那一套,简单看一下文档就大体知道是个什么东西了,不过该熟悉的api还是得熟悉,语法方面得实践了才能有把握。另一方面,我们的APP对于数据库依赖较高的情况下,开发数据库模块也是个比较烦心的过程。我在开发过程中发现通过TDD来边测试边开发客户端数据库模块能省不少编译时间,对于帮助学习Jetpack Room也能加快进度,所以希望我这个系列的文章对你也能有些帮助吧。
测试环境
在Android Studio中,有俩个开箱即用的测试环境:src文件夹下的 test 和 androidTest 。它们的区别是 androidTest 是需要用到虚拟机或者真机的,比 test 多了一个 android 环境。本文中将只在 androidTest 环境中执行。
你可以在一个新建的项目中什么都不做,然后在 build.gradle(app) 中按照下面添加依赖:
dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
testImplementation "androidx.room:room-testing:$roomVersion"
}
上面部分是测试的库,下面部分是room的库。
那么请打开 androidTest 文件夹,新建一个Test.kt文件:
class Test {
@Test
fun test(){
val res = 1+1
assertEquals(2, res)
}
}
点击Test旁边的小图标,run一下就能看到结果了。
这里主要靠 assertEquals 函数,前面的值是测试案例的期望值,后面的值是测试案例的结果。这俩值一致,那结果里面就是舒心的绿色,不一致就报红了。
整个逻辑很简单,然而思路却跟传统开发很不一样。**TDD中,你要做的是在写函数之前想好你的测试案例。例如你需要一个查询某条数据的函数,你想想好需要什么参数,输出什么类型,再想着应该有什么结果。**例如,下面这样:
@Test
fun test1(){
val record = ...
Assert.assertEquals(record, findRecord(id = 1))
}
@Test
fun test2(){
val record = ...
Assert.assertEquals(record, findRecord(id = 2))
}
@Test
fun test3(){
val record = ...
Assert.assertEquals(record, findRecord(id = 3))
}
@Test
fun test4(){
val record = ...
Assert.assertEquals(record, findRecord(id = 4))
}
不管你有多少条测试案例,只要轻轻一点 「run」,测试结果稍等片刻就出现了。
记住别删了你的测试案例,当需求迭代的时候你可以用这些现成的案例很快地写出新的测试案例,继续写出高质量的代码。