Kotlin 来了,Google 近日表示官方支持 Kotlin 作为 Android 的开发语言,引来了不少目光。我们在评估 Appetizer 质量监控对 Kotlin APP 的支持情况的同时,和大家交流一下 Kotlin 对现有测试体系的影响。欢迎大家一起交流,如果有已经用上 Kotlin 开发的童鞋非常欢迎来拿 Appetizer 试试。
Kotlin 并不年轻,JetBrains 公司早在 2011 年七月就宣布了 Kotlin 项目。JetBtrains是捷克一家出产 IDE 的公司,比较著名的产品有 IntelliJ, WebStorm, PyCharm, CLion 等,Google 在抛弃了 Eclipse 搞出的 Android Studio,就是基于 IntelliJ 开发的。JetBrains 的产品基本涵盖了市面上主要的编程语言,一般是免费版和收费增强版,对高校学生也是非常好的。有兴趣的可以去看一下他们的产品,Appetizer 团队还是很喜欢他们的 IDE 的。
2012 年 2 月,Kotlin 开源。知道 2016 年 2 月,Kotlin 第一个稳定版本 1.0 发布。
当然 2017 年 Google IO 上宣布 Kotlin 作为 Android 的一级开发语言
值得注意的还有,2013 年的 Google IO 宣布了 Android Studio,也就是说 Google 和 JetBrains 有一定年头了。但是 Kotlin 还是比较年轻,下面是 Github 上用 Kotlin 写的项目的数量,和右边其他主流语言比比还是有非常漫长的路要走。
虽然官方有很多蓝图,虽然 Kotlin 的卫道士会来喷,但是从目前看来,Kotlin 是 Java(javascript)的一个语法糖,我们就不说 Javascript 混乱的 es2015, es6, es7, jsx, es8 了。何为 Java 语法糖?就是给一些繁琐的 Java 代码用种方式简化,废话不多说,举几个例子:
// 我是注释:这是一个匿名函数的定义(lambda)
fun(x: Int, y: Int): Int = x + y
fun(x: Int, y: Int) = x + y // 返回值也不写了,会推导
恩,看代码就明白的意思我就不解释了。
// switch他哥
when (x) {
in 1..10 -> print("x is in the range") // Python的影子
in validNumbers -> print("x is valid") // -> 是 lambda
!in 10..20 -> print("x is outside the range")
else -> print("none of the above") // switch 条件
}
恩恩
data class User(val name: String, val age: Int)
这个要解释一下,这是一个 class 定义,两个成员 name, age,data class 等于编程中超级常用的 model class(数据库/Json),这么一句定义,Kotlin 帮助完成了几个事情:
"User(name = "Jack", age = 1)"
strings.filter { it.length == 5 }.sortBy { it }.map { it.toUpperCase() }
高阶函数,map, reduce, filter, sortBy,花括号里面是一个单参数(it) lambda,非常省略。
好了,语言不多说,有兴趣的可以去看看参考材料的一些东西,一句话总结就是 Kotlin 是一个集各种语言表达简单方式于一身的 Java。不愧是做 IDE 的,对语言优势还有程序员的懒惰是非常了解的,最后,IDE 还有一个功能 Java -> Kotlin,转换的代码还是可读的,但是没有 Kotlin -> Java ...
Kotlin 最终会被编译成 Java bytecode,然后变成 APK。如果 APP 部分或者全部使用 Kotlin 开发,是否会对现在的测试体系有影响呢?
这个是大家做测试时候关心的,我大致罗列了质量保障体系里面主要的几类工具
UI 自动化工具,例如 Appium, Calabash, Robotium:只要 Java 一天不死,这些工具总是能用,无论 Kotlin 怎样,最终还是可以直接和原生 Java 代码衔接的,以前的 Robotium Java 用例照样能跑,Appium 之类的直接从 Uiautomator 这种点击 View 的,更是没有关系。这里要说到一个有趣的东西 Anko,是专门用来辅助 Android Kotlin 开发的,里面有一个 Anko Layout,直接在代码里面用 Kotlin 定义 layout,抛弃 XML:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
editText {
hint = "Password"
textSize = 24f
}
button("Login") {
textSize = 26f
}
}
}
所以以后找 id 什么的事情,可能会有变化,这也取决于开发团队使用 Kotlin 的程度。
SDK 工具:bugly, LeakCanary 等:完全不受到影响,只要是 Java 的库 Kotlin 可以无缝连接,这点要表扬下 Kotlin 的兼容性。
插桩工具:Appetizer, JaCoCo, Emma,插桩工具向 APP 中添加测量代码来完成任务,JaCoCo/Emma 的代码覆盖率和 Appetizer 的崩溃、性能、Http、卡顿监控等都是这样。Appetizer 是直接在 Dalvik 代码上插桩的,所以和源代码是用什么语言开发的没有关系;JaCoCo 是在 Gradle 中间,对 Javac 产生的 bytecode 插桩,也是一样,和源代码没关系,所以继续能用。
APK 启动后的工具,包括 Proxy 工具,Mock 工具,弱网模拟:都没事
因为 Appetizer 是通过 Dalvik 插桩实现监控的,理论上是完全兼容 Kotlin APP 的,我们本着严谨的态度,找了一些开源的 Kotlin APP 编译,插桩,监控。下面这个开源 Kotlin 开发的豆瓣 FM 客户端说一说:
https://github.com/nekocode/Murmur
这个是插桩后的 APK: http://dl.appetizer.io/Murmur-appetizer.apk
样例报告,界面比较简单,问题不是很多: