Appetizer Kotlin 来了,对测试意味着什么

AppetizerIO · May 26, 2017 · Last by AppetizerIO replied at May 08, 2018 · 3029 hits
本帖已被设为精华帖!

Kotlin 来了,Google 近日表示官方支持 Kotlin 作为 Android 的开发语言,引来了不少目光。我们在评估 Appetizer 质量监控对 Kotlin APP 的支持情况的同时,和大家交流一下 Kotlin 对现有测试体系的影响。欢迎大家一起交流,如果有已经用上 Kotlin 开发的童鞋非常欢迎来拿 Appetizer 试试。

Kotlin 历史

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 的卫道士会来喷,但是从目前看来,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 帮助完成了几个事情:

  • 每个成员的 getter setter
  • 整个 class 的 equals
  • 整个 class 的 hashCode
  • 整个 class 的 toString,输出类似:"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 IDE(真是 IDE 公司的产品啊!): https://try.kotlinlang.org/

Kotlin 语言对测试工具的影响

Kotlin 最终会被编译成 Java bytecode,然后变成 APK。如果 APP 部分或者全部使用 Kotlin 开发,是否会对现在的测试体系有影响呢?
这个是大家做测试时候关心的,我大致罗列了质量保障体系里面主要的几类工具

  • 静态代码分析工具,比如 findbugs, Android Lint, Sonar 这类,这些工具的影响是最大的,因为有些是直接和源代码打交道的,但是不用担心,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 监控 Kotlin APP

因为 Appetizer 是通过 Dalvik 插桩实现监控的,理论上是完全兼容 Kotlin APP 的,我们本着严谨的态度,找了一些开源的 Kotlin APP 编译,插桩,监控。下面这个开源 Kotlin 开发的豆瓣 FM 客户端说一说:
https://github.com/nekocode/Murmur

  • 崩溃监控:Kotlin 会编译成纯 Java 代码,所以异常也是在 DalvikVM 里的,可以完美抓到
  • HTTP 监控:可以看到 Kotlin APP 还是用到了原来的 HTTP 库,Murmur 这个用了 okhttp3,截图中抓到一个 HTTP 4xx 的异常
  • 主线程卡顿:Kotlin APP 依旧和以前一样,主线程,Murmur 也用了 Rx 管理生命周期,和原来 APP 一样,主线程卡顿依旧会有,依旧会被抓到
  • 其他性能:虽然 Kotlin 鼓励在代码里面生成控件树,但是在绘制控件时还是用的标准 Android API,Appetizer 是通过截获这些绘制 API 调用来检测其他性能问题的,所以也没有问题

扩展阅读

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞

Appetizer 好快的速度👏 ,火线也支持 kotlin 代码扫描了。😄

很喜欢 Kotlin 的代码风格,不过我还是观望中~

思寒_seveniruby 将本帖设为了精华贴 26 May 18:47

kotlin 不算是 java 的语法糖吧. kotlin 和 java 一样都是独立的语言. 只是都同时编译为 java 字节码. java 字节码属于 jvm 的范畴. 不属于 java.

我也在观望. 我入手了 scala, 但是 scala 的群体还不大. 跟 java 不是 100% 兼容. 所以没法完全流行起来.
不过目前 kotlin 的生态还没 scala 强. 等半年也许就能超越了.

simple 回复

开发框架好多,我们都一直在评估,ReactNative 之前也弄过,应该也可以

恩,我们在考虑,如果 Kotlin 复杂度降低到 python 行数,准备拿 kotlin 当脚本语言,python 2.7, 3.5 差异太恶心了。以前写过把 Java 当脚本语言的,但是 Java 写起来还是太罗嗦后来就没怎么弄。

我刚才看了 github,项目量少,而且 star 少,说明玩弄的人少,观望的也不多

感觉是 C++ 远古时代叫 cfront,compile 成 C 代码,来支持语法糖的 class。.class 文件可以比较完美地反编译成 Java 代码(学术界),除非 kotlin compiler 做了很多诡异的事情。但是因为要 bytecode 层面兼容 Java,所以必然 Kotlin 基本产生的就是标准 java 代码,一个 class 就是一个标准 class 一个 function 就是一个 function。scala 是被 spark 翻牌子翻中的。kotlin 有了所有语言的影子,那个 it 是 Groovy 的东西(又一个恶心的语言)。

你们打算用 kotlin 嘛

AppetizerIO #11 · May 26, 2017 Author

我们倒是对语言没有偏向,只是 kotlin 对我们业务带来好处不多,暂时用不上,属于围观。目前主要是评估 Appetizer 对 Kotlin app 的支持。

kotlin 有 google 支持,加上本身 kotlin 对 jvm 的支持,以及通吃前后端的特性。
kotlin 发展肯定不会很差

如果是用 kotlin 的的话,那平常用于反编译 apk 的工具以及反编译 jar 的工具还能用么。。

AppetizerIO #14 · May 08, 2018 Author
zhanglimin 回复

jadx 依旧可以,都是 java 的,只是输出的是 java 不是 kotlin,读起来稍微有点累

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up