Kotlin 來了,對APP測試意味著什麼

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)nfun(x: Int, y: Int): Int = x + ynfun(x: Int, y: Int) = x + y // 返回值也不寫了,會推導n

恩,看代碼就明白的意思我就不解釋了。

// switch他哥nwhen (x) {n in 1..10 -> print("x is in the range") // Python的影子n in validNumbers -> print("x is valid") // -> 是 lambdan !in 10..20 -> print("x is outside the range")n else -> print("none of the above") // switch 條件n}n

恩恩

data class User(val name: String, val age: Int)n

這個要解釋一下,這是一個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() }n

高階函數,map, reduce, filter, sortBy,花括弧裡面是一個單參數(it) lambda,非常省略。

好了,語言不多說,有興趣的可以去看看參考材料的一些東西,一句話總結就是Kotlin是一個集各種語言表達簡單方式於一身的Java。不愧是做IDE的,對語言優勢還有程序員的懶惰是非常了解的,最後,IDE還有一個功能 Java -> Kotlin,轉換的代碼還是可讀的,但是沒有Kotlin -> Java ...

  • 如果你懶得配環境,想玩一下,強烈推薦瀏覽器里的簡易Kotlin IDE(真是IDE公司的產品啊!): Try Kotlin

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?) {n super.onCreate(savedInstanceState)nn verticalLayout {n padding = dip(30)n editText {n hint = "Name"n textSize = 24fn }n editText {n hint = "Password"n textSize = 24fn }n button("Login") {n textSize = 26fn }n }n}n

所以以後找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客戶端說一說:nekocode/Murmur

  • 這個是原版APK: github.com/nekocode/Mur

  • 這個是插樁後的APK: dl.appetizer.io/Murmur-

  • 樣例報告,界面比較簡單,問題不是很多:

  • 崩潰監控:Kotlin會編譯成純Java代碼,所以異常也是在DalvikVM里的,可以完美抓到
  • HTTP監控:可以看到Kotlin APP還是用到了原來的HTTP庫,Murmur這個用了okhttp3,截圖中抓到一個HTTP 4xx的異常
  • 主線程卡頓:Kotlin APP依舊和以前一樣,主線程,Murmur也用了Rx管理生命周期,和原來APP一樣,主線程卡頓依舊會有,依舊會被抓到
  • 其他性能:雖然Kotlin鼓勵在代碼裡面生成控制項樹,但是在繪製控制項時還是用的標準Android API,Appetizer是通過截獲這些繪製API調用來檢測其他性能問題的,所以也沒有問題

擴展閱讀

  • 入坑前推薦Kotlin Koans: Kotlin/kotlin-koans
  • Kotlin可以用來當腳本語言:Working with the Command Line Compiler - Kotlin Programming Language
  • 我懶得配個環境玩Kotlin,來,瀏覽器里的IDE!!!: Try Kotlin
  • Kotlin的語法糖甜的發膩(你看到了C, Python, Nodejs, Scala等等):Control Flow - Kotlin Programming Language
  • Anko 輔助Android開發的,很多很有趣的東西:Kotlin/anko
  • JetBrains,良心IDE企業:JetBrains: Development Tools for Professionals and Teams

推薦閱讀:

性能測試基礎
我也終於用上Powershell了
Android獲取應用大小
Groovy 的現狀見解
Android Studio 簡單配置多渠道包案例

TAG:Android开发 | 自动化测试 | Kotlin |