51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1677|回复: 9
打印 上一主题 下一主题

[求助] Appetizer Kotlin 来了,对测试意味着什么

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-5-27 09:56:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小爸爸 于 2017-5-27 11:33 编辑

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 + yfun(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调用来检测其他性能问题的,所以也没有问题

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2017-5-27 10:13:14 | 只看该作者
kotlin不算是java的语法糖吧. kotlin和java一样都是独立的语言. 只是都同时编译为java字节码. java字节码属于jvm的范畴. 不属于java.
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2017-5-27 10:15:51 | 只看该作者
我也在观望. 我入手了scala, 但是scala的群体还不大. 跟java不是100%兼容. 所以没法完全流行起来.
不过目前kotlin的生态还没scala强. 等半年也许就能超越了.
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2017-5-27 10:17:24 | 只看该作者
你们打算用kotlin嘛
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2017-5-27 10:19:24 | 只看该作者
开发框架好多,我们都一直在评估,ReactNative之前也弄过,应该也可以
回复 支持 反对

使用道具 举报

该用户从未签到

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

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2017-5-27 10:26:14 | 只看该作者
我们倒是对语言没有偏向,只是kotlin对我们业务带来好处不多,暂时用不上,属于围观。目前主要是评估Appetizer对Kotlin app的支持。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2017-5-27 10:31:13 | 只看该作者
很喜欢Kotlin的代码风格,不过我还是观望中~
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2017-5-27 10:38:04 | 只看该作者
Appetizer好快的速度👏 ,火线也支持kotlin代码扫描了。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-11 08:00 , Processed in 0.074078 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表