可以分享下你们的实践~ 目前应该不少公司都有做覆盖率的收集,社区也有不少覆盖率收集的技术文章,但怎么应用大家其实没有很好的切入点或者应用方案,容易出现业务团队看不懂代码,所以用不上或者不会用的问题。
PS:建议把整个完整的文件,包括 import 的部分也一起粘贴上来吧。我猜 import 那部分有问题。
使用 markdown 的代码块排版,代码显示就好多了。
这个是针对 javascript 的,java 可以用 jacoco ,社区也有一些这方面的文章。
这个方案从原理上说, weex 应该也能支持的。
之前看沙龙分享,京东到家在单测和集成测试(服务端)用起来了。
我们目前用法是单测和集成都有用。其中单测结果上传 sonar 结合静态扫描结果一起用,集成是先在 andorid app 集成测试把全量覆盖率用起来,增量覆盖率最近也开发好了。接下来会把服务端接入进来,收集服务端的集成测试覆盖率。
至于效果嘛,目前可以解读覆盖率报告的同学还不是很多,而且全量分析一次确实有点累(一个项目上百个文件,一个一个看工作量不少)。目前应用场景更多是测试负责人根据覆盖率数据了解总体测试的情况和评估风险。
哇塞,原来 @vigossjjj 到支付宝啦。
@Lihuazhang rn 手工测试的覆盖率也能收集到咯。
这应该是社区第一篇写 AS 插件开发和发布的文章,开眼界了。
话说,火线现在有在计划做阈值校验功能吗?类似于设定 xx 级别的问题数量大于 xx 后,扫描命令 exit code 不为 0 。这样会更方便把火线接入持续集成或者 git commit hook ,更好地止住静态扫描发现的问题数量。
这块我后面写个帖子吧。流程本身其实比较简单。
确定贴全了吗?应该至少有 http method 之类的信息吧。
请使用 markdown 排版。。。
视野决定广度,广度决定深度。总是想用到在学,结果会发现你永远不会用到,因为你根本想不到。
看了下 CMap 的实现,我的理解是针对 TextField,Button,Checkbox 三种常用控件的常用操作都封装成 get 和 set 方法,简化掉不同控件的各种不同的调用(如 TestField 的 send_keys,Button 的 click,CheckBox 的 click ,所以用例里面只需要对控件对象进行 set 和 get 就好了。
例如 TesterHome 例子里的就是遍历这个字典,分别对 User,Pwd 和 Remember 三个控件进行:
User set 为 123(send_keys)
校验 User 当前的值是否为 123
Pwd set 为 456(send_keys)
校验 Pwd 当前的值是否为 456
Remember set 为 TRUE(click)
校验 Remember 当前的值是否为 TRUE(is_selected)
这种方式确实减少了一些学习成本,而且个人觉得大部分控件应该都能用 set 和 get 进行简化的。
至于自动回归和地图化,很感兴趣,但信息有点少,表示没看懂。希望楼主可以补充一些例子说明下~
个人觉得这个不是乱码,而是你的文字是以 unicode 编码值的形式显示出来了。乱码一般是说用了错误的解码器解码,例如用 gbk 解码 utf-8 ,一般特征是长得像火星文,各种未见过的生僻字。你可以在 http://tool.chinaz.com/tools/unicode.aspx 做一下转换,就会发现实际上显示的就是你想用的中文,只是显示形式不对。
我目前了解的会出现这种情况的场景,是用了 repr 方法解析 unicode 字符串:
unicode_str = u'中文'
# 这样就会显示 u'\u4e2d\u6587'
print repr(unicode_str)
建议可以在 if isinstance(e,str):
和 if isinstance(o,str):
加个断点,看下此时中文是否已经变成了 unicode 编码值?
除了技术,我们也要有诗和远方嘛~
时间过得好快,支持~
哈哈,能解决你们的问题就好。我们当初也在这个问题上卡了 2-3 天,尝试了很多办法才解决的。
之前也踩了这个坑,原因是我们源码打包是在 mac 上做的,但生成覆盖率报告改成了 windows ,默认编码不一样。
修改方案:在 gradlew jacocoTestReport
命令直接添加指定编码的参数,即改为 gradlew -Dfile.encoding=UTF-8 jacocoTestReport
没事,这个问题我发公众号检查的时候也没发现。后面我们都留意好这些细节吧。
特意去看了下 stf 的源码,终于大致了解了应用场景:
function install() {
log.info('Checking whether we need to install STFService')
return getPath()
.then(function(installedPath) {
log.info('Running version check')
// 此处通过 adb 的 exec app_process 命令获取到 STFService 的 version 值,进而判断是否需要继续安装 STFService
return adb.shell(options.serial, util.format(
"export CLASSPATH='%s';" +
" exec app_process /system/bin '%s' --version 2>/dev/null"
, installedPath
, resource.main
))
.timeout(10000)
.then(function(out) {
return streamutil.readAll(out)
.timeout(10000)
.then(function(buffer) {
var version = buffer.toString()
if (semver.satisfies(version, resource.requiredVersion)) {
return installedPath
}
else {
throw new Error(util.format(
'Incompatible version %s'
, version
))
}
})
})
})
.catch(function() {
log.info('Installing STFService')
// Uninstall first to make sure we don't have any certificate
// issues.
return adb.uninstall(options.serial, resource.pkg)
.timeout(15000)
.then(function() {
return promiseutil.periodicNotify(
adb.install(options.serial, resource.apk)
, 20000
)
.timeout(65000)
})
.progressed(function() {
log.warn(
'STFService installation is taking a long time; ' +
'perhaps you have to accept 3rd party app installation ' +
'on the device?'
)
})
.then(function() {
return getPath()
})
})
我理解这种方式最大的用处,是给一个相比 intent 更为隐秘的入口 (intent 毕竟比较公开) 。目前想到的应用场景,和 @heyniu 想的差不多,通过命令行设定一些内部参数,比如后端服务的 ip 地址(我们有多个环境),然后再启动 apk 。
有一些 android 系统为 app 提供了的接口 adb shell 没有现成命令使用,也可以这么用,例如 appium 里面经典的获取当前网络状态(这个系统接口貌似只有 app 才能调用,adb shell 调用不了)。
缺少接口协议文档,正确请求的抓包记录,社区的同学也帮不了你呀。。。
PS:500 错误是服务端错误,建议先找开发同学了解下到底是什么原因,不一定是你的请求有问题。
小米这个 usb 安装的开关应该是他们自己加的,确实比较隐蔽。。。不过这个开关不开,adb install 的程序应该都装不上吧,还是比较容易发现的。
发了微信公众号后,有同学反馈原文第二章有些地方 websocket 错写成了 webdocket 。我现在更正过来了,如果其它地方也有发过这个文章,也一并更正吧。
这个 pk 不够大呀。。。