51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3907|回复: 3
打印 上一主题 下一主题

[转贴] iOS 手工测试代码覆盖率获取

[复制链接]

该用户从未签到

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

背景事情源于iOS (Object-C) 非单元测试状态下代码覆盖率获取尝鲜,让我恍然大悟,覆盖率可以基于手工测试统计。
很感激这篇文章的详细介绍,依据这篇文章,我手工走通了一遍,然后就开始调研怎么落地在我们项目。
难点手工走通这篇文章之后,落实在自动化上,有两个难点:
  • 客户端的*.gcda文件如何生成,并传递出来?
  • 自己写的基于Flask的服务端接收并存储.gcda之后,怎么同步打包过程中的.gcno文件?
  • 由于XcodeCoverage其实是不支持在linux上执行,怎么把服务部署在linux上,并保证可以执行?
  • 如何妥善处理客户端发送*.gcda文件的并发问题,并且,合并生成的测试覆盖率?
解决方案我在我们项目中已经通过自动化的方式,实现了XcodeCoverage手工覆盖率监测,并开始这个项目的内测。对于接触这篇文章前,最好先通过手工方式走通一遍iOS (Object-C) 非单元测试状态下代码覆盖率获取尝鲜。
我的解决方案分三步:
  • 第一步:解决linux不能执行XcodeCoverage命令问题
  • 第二步:基于Flask搭建了一个服务,用于接收.gcda文件,并请求iOS客户端同学实现了,集成XcodeCoverage进Pods包,然后将.gcda文件发到我写的服务上;
  • 第三步:优化Flask服务,并且将XcodeCoverage等命令实现,通过schedulers后台运行,并优化了执行逻辑。
下面我一一进行简单阐述。第一步:在linux上运行部署在linux上调用XcodeCoverage命令,会报错:
Out of memory!Reading tracefile Coverage.infolcov: ERROR: no valid records found in tracefile Coverage.infoReading tracefile Coverage.infolcov: ERROR: no valid records found in tracefile Coverage.infocat: /.xcodecoverageignore: No such file or directoryReading tracefile Coverage.infolcov: ERROR: no valid records found in tracefile Coverage.infoReading data file Coverage.infogenhtml: ERROR: no valid records found in tracefile Coverage.info直接给出解决方案:
# 修改/envcov.sh为 LCOV() {     "${LCOV_PATH}/lcov" "$@" }# 修改/getcov为"${LCOV_PATH}/genhtml" --ignore-errors source --output-directory . "${LCOV_INFO}"简单解释就是执行lcov生成测试覆盖率.info文件的时候稍微有点改变,我还是很佩服XcodeCoverage这个项目的作者,只是改了一点点就支持linux执行。
第二步:接收并处理*.gcda文件其实这里更多的是依赖客户端同学的配合,他帮我实现了,从手机端生成*.gcda文件以后,并打了个以当时时间戳为名的zip包,然后直接post到我写的服务接口上。
客户端在传递*.zip包同时,在header里面增加了关于这个包的版本号,构件号,userid,和固件号等信息,我在后台解析以后统一存入一个表。
第三步:执行XcodeCoverage等一系列命令其实接收了*.gcda文件只是万里长征第一步,还需要将在mac slave上打包过程中的临时性文件,*.gcno文件转存到linux上,并且需要修改*.gcno的文件中的路径。这样才能执行XcodeCoverage命令。
在这个过程中,我踩过的坑有:
  • 复制*.gcno文件
我通过scp的方式,先实现linux可以免密登录打包的mac slave,由于我们执行打覆盖率的包是指定slave的,然后只需要将linxu和slave互相信任免密登录,然后再执行完打包之后,通过如下命令:
#!/bin/bashpath="=Pods/XcodeCoverage/env.sh"while read linedoname=`echo $line|awk -F '=' '{print $1}'`value=`echo $line|awk -F '=' '{print $2}'`case ${name} in"export OBJECT_FILE_DIR_normal") path1=${value} ;;"export CURRENT_ARCH") path2=$value;;"export SRCROOT") path3=$value;;*);;esacdone < ${path}git_message=$(git log -1 --pretty=format:"%an:%s")git_commit_id=$(git rev-parse --short HEAD)git_repo="xxxx"appversion="xxx"buildversion="xxxx"url="http://x.x.x.x:5000/api/cov/repo"curl -H "Content-Type: application/json" \-d "{\"commit_id\":\"${git_commit_id}\", \"repo\":\"${git_repo}\",  \"message\":\"${git_message}\",\"appversion\":\"${appversion}\",  \"buildversion\":\"${buildversion}\",\"object_file_dir_normal_path\"{path1},  \"current_arch_path\"{path2}, \"gcno_path\"{path3}}" ${url}服务端接收到打包的版本号和构建号以后,同时还存入commid以及commit message等,执行scp命令就很简单了。对了,还需要强调一下,这里打的iOS包必须为Debug包
  • 更改*.gcno文件内容的路径
需要保证*.gcno文件内的内容路径字符数,和替换后的完全相等,并不需要在linux上建立和slave同样的路径。这里的路径可以从集成到iOS项目工程中Pods/XcodeCoverage/env.sh里面取SRCROOT,意思是如果${SRCROOT}有四位为/opt/,则在linux上执行的时候,需要字符相等的进行替换,替换为linux上存在的路径,为/ttt/。
  • 覆盖率结果的合并
其实XcodeCoverage已经考虑到了覆盖率结果的合并,只需要在执行XcodeCoverage之前,指定XcodeCoverage/env.sh中OBJECT_FILE_DIR_normal和CURRENT_ARCH的值为高一级的目录,比如我想合并时间戳为11.gcda和22.gcda的覆盖率结果,那么我只需要在文件夹33内分别建立两个文件夹11和22,然后将11.gcda放入11中,22.gcda放入22中,然后将*.gcno分别拷入11和22。执行XcodeCoverage命令之前,将XcodeCoverage/env.sh中OBJECT_FILE_DIR_normal替换为33,CURRENT_ARCH替换为/,即可。
最后还有一些细节,比如什么时候执行scp命令,什么时候执行替换*.gcno内的路径,什么时候执行XcodeCoverage/getcov 命令等。
当然,覆盖率报告并不能衡量app的质量,它只是一个定量化的报告展示。
最后放一张我简单写的展示报告。
我想等我再整理整理,在github上放出我写的很low的代码。


ToDo
  • git diff和覆盖率结合
  • 将结果不放在自己写的服务中,放入之前搭建的Sonar中
  • Android覆盖率报告集成到这个服务
  • 继续优化当前的服务

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

使用道具 举报

该用户从未签到

2#
发表于 2017-5-27 10:53:53 | 只看该作者


好赞呀~尤其是平台的界面效果。相比之下感觉我们自己的平台界面 low 爆了。。。

从项目的实践情况来看,到了这个程度基本可以找个项目试点了。我们现在在试点中,发现了以下几个主要问题:

    实际迭代过程中,由于不断的 bug fix ,会出现一天一个版本的情况,导致单个版本覆盖率看起来都不高。这个技术上支持的难度比较高,还是得在流程上增加一个封版期,此期间不更改任何代码或不使用更改后的代码进行测试。
    分析覆盖率报告并给出建议是个体力活,需要比较长的时间去熟悉源码并整理出报告。目前在尝试和开发合作,通过添加注释的方式增加报告本身的可读性,再看是否可以通过工具自动生成一些覆盖率建议。

回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2017-5-27 10:58:53 | 只看该作者
看到有做iOS覆盖率研究的真开心,我也使用sonar-objective-c插件自己加规则打包集成到sonarqube,但是没有展示出覆盖率结果,sonarqube的版本是5.3,你在集成覆盖率版本除了在插件添加规则之外还有做其他什么修改吗?需要修改sonarqube中的其他配置吗?
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2017-5-27 11:03:19 | 只看该作者
jacoco 配套做得很好,而且网上实践文章也多,坑比 iOS 少很多
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-25 18:51 , Processed in 0.059538 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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