单测集成最佳实践
1. 前言
本文介绍了使用阿里云云效-专有云版本的单测集成产品,对软件产品的代码扫描、单测集成等功能进行详细的介绍。本文以一个应用场景为例,提供代码扫描、单元测试编写规则等方面的参考示例,可为研发人员与测试人员使用。
2. 最佳实践概述
软件单测集成是 DevOps 的重要环节之一,是衡量代码质量的重要指标之一。同时,该环节本身也是一个较为复杂的流程,包括了代码扫描、单测用例的编写等。
【适用场景】
- 代码仓库管理的开发模式
【方案架构】
【方案优势】
- 提升代码质量、提升研发质量意识。
3. 前置条件
在执行本文操作前,请完成以下准备工作:
- 所在公司已购买并开通云效单测集成产品模块。
- 已注册云效账号并完成认证,可以登录云效平台。
- 完成云效产品培训并通过相关考试。
- 加入云效的钉钉答疑群(联系本公司云效接口负责人入群)。
- 产品需求相关方(业务方、PD、UED、PM、技术架构、开发、测试、验收等)已经通过钉钉或企业微信建立实时通信群。
4. 工具准备
- 本方案使用 Chrome 浏览器,需提前准备。
- 安装钉钉或企业微信。
5. 使用流程
5.1 单元测试代码编写规范
云效平台的单测集成支持 Java、NodeJs、C++ 等主流语言,本文档以 Java 语言为例描述单元测试的编写规范,详细内容参考附录《单元测试规范》。
5.2 单测集成配置
【说明】:在运行代码扫描与单测集成前,需要检查集成配置,配置内容包含 JDK 版本、maven 版本、pom 文件路径等属性项。针对 Java 语言使用 maven 的构建方式,一般采取默认配置即可。如果默认配置不符合要求,则需要更改,更改的操作步骤如下。
【操作步骤】:
- 在云效左侧导航栏持续交付中选择单测集成 > 变更集 > 变更集列表,进入项目集成列表页面。
- 点击需要配置的项目。
- 进入项目详情页面后,点击运行 > 集成配置。
- 进入集成配置编辑页面,根据实际情况更改相应属性项。
5.3 编写代码与单元测试(线下)
研发人员在本机编写功能代码与单元测试,单元测试编码规则参考附录《单元测试规范》,编写完成后将代码提交至代码仓库。
5.4 执行代码扫描与单元测试
【说明】:研发人员在本机编写代码完成后,将代码上传至代码仓库,云效监听代码仓库的变化,自动触发代码扫描并执行单元测试,在云效中可查看执行状态。
【操作步骤】:点击单测集成 > 变更集列表进入选择变更集列表页面,点击项目左侧 “+” 查看执行状态。
【执行状态说明】:
编号 | 状态 | 说明 |
---|---|---|
1 | 未创建 | 该应用信息在 Amon 中已存在,但是集成任务还未创建 |
2 | 未运行 | 该应用信息在 Amon 中已创建集成任务,但是集成任务还没有运行 |
3 | 排队中 | 该应用在 Amon 运行集成任务,在排队等待中 |
4 | 运行中 | 该应用在 Amon 中集成任务正在运行状态 |
5 | 编译超时 | 该应用在 Amon 中运行集成任务时,编译时间超过上限,任务中断 |
6 | 任务中断 | 该应用在 Amon 运行集成任务,运行时间超过上限,系统中断任务 |
7 | 构建失败 | 该应用在 Amon 运行集成任务,构建失败 |
8 | 测试类编译失败 | 该应用在 Amon 运行集成任务,测试类构建失败 |
9 | 主类编译失败 | 该应用在 Amon 运行集成任务,主类构建失败 |
10 | 编译失败 | 该应用在 Amon 运行集成任务,编译失败 |
11 | 没有权限 | 该应用在 Amon 运行集成任务,没有权限拉取代码 |
12 | 用例失败 | 该应用在 Amon 运行集成任务,单元测试用例部分执行失败 |
13 | 全部通过 | 该应用在 Amon 运行集成任务,单元测试用例全部执行通过 |
14 | 已删除 | 该应用在 Amon 的集成任务删除,无需在运行 |
5.5 查看扫描结果
【说明】:当执行完成后,可查看扫描出的问题数量,点击问题数查看问题详细描述,根据描述中的建议进行修复。
【操作步骤】:
- 在变更集集成列表页中,点击变更集 > 变更集列表 > 选择变更集 > 静态扫描 > 数字,系统跳转至扫描详情列表页。
- 进入扫描详情页面,点击 “+” 查看错误详细信息。
- 如果问题不严重,则可以暂时忽略,后期再修复,具体页面如下。
- 在弹出的窗口中输入忽略原因。
- 如果需要忽略的记录比较多,也可以批量忽略。
5.6 修复扫描出的问题(线下)
研发人员根据扫描出的问题提示在本机进行修复,修复完毕后重新提交至代码仓库,云效会自动触发代码扫描并执行单元测试。
5.7 查看代码模块统计报表
【说明】:云效中可以查看某个项目或者所有项目的代码质量趋势。
【操作步骤】:点击单测集成 > 报表 > 代码模块统计,进入代码模块统计页面。
6. 单测集成中的常见问题 & 解决
6.1 单测集成 “没有权限”
【问题描述】:点击变更集 > 申请变更 > 拉取分支,编译打包成功,但在单测集成中构建状态显示 “没有权限”。
【问题定位步骤】:
- 点击更多按钮,同步配置(同步 Aton 配置到 Amon)后重试。
- 点击 “没有权限” 链接,查看日志详情。 —— 代码拉取失败,确定没有权限。
- 查看 Jenkins 任务列表,查看任务详情。 —— 任务中有构建任务,Jenkins 同步正常,最终确认,Codeup 白名单权限问题,Amon 构建机不在白名单。
6.2 构建失败(sonar)
【问题描述】:执行单测构建时,状态显示“构建失败”。
【问题定位步骤】:
- 查看日志,代码拉取、静态检查成功,sonar 部分报错。
- 复制sonar地址到浏览器,检查 sonar 是否可正常访问。 —— 本次问题原因 sonar host 映射未配置,不能正常访问(增加 hosts 映射后“构建成功”)。
- 检查 sonar 其他配置信息。
6.3 单元测试用例执行数为 “0”
【问题描述】:单测集成模块中,单元测试执行总数为 0,查看日志,单元测试模块未找到可执行的单测用例。
【问题定位步骤】:
本地环境maven执行单元测试,检查是否成功。 —— 本地执行命令 “mvn test”,依然无法找到用例,查看资料发现,使用 Junit5 版本需要增加相关插件(详见以下 xml 内容)。
<plugins xmlns="http://maven.apache.org/POM/4.0.0"> <!-- Junit5 执行依赖插件配置 --> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <includes> <include>**/Test*.java</include> <include>**/*Test.java</include> <include>**/*Tests.java</include> <include>**/*TestCase.java</include> </includes> <properties> <excludeTags>slow</excludeTags> </properties> <testFailureIgnore>true</testFailureIgnore> </configuration> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <version>4.12.0</version> </dependency> </dependencies> </plugin> </plugins>
修改完本地 pom.xml 后提交,运行构建任务,单测执行任为 0。
—— 进入单测集成 > 变更集列表 > 详情 > 集成配置,找到 “maven 插件配置” 属性,将上一步的插件内容拷贝到 “maven插件配置” 项中,点击保存。重新运行集成构建,单测执行正常。
6.4 单测覆盖率统计为空
【问题描述】:单测执行通过率 100%,覆盖率中数据为空。 【问题定位步骤】:
本地执行 “mvn test”,检查覆盖率统计报告是否成功,报告文件 “jacoco.csv”,正常。
检查覆盖统计插件配置,正常。
检查覆盖率收集的配置。 系统中缺少该项配置,与开发同学确认,数据库表 “amon_template_config” 中缺少一条数据(jcoco 插件配置)。重新初始化数据后,配置项可见,重新执行任务,覆盖率统计正确。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论