critic.sh是一个简单易用的 Bash 测试框架,支持代码覆盖率报告。本文档深入解析 critic.sh 在开源鸿蒙PC平台的适配技术细节,从架构分析到实现落地,全面展示纯脚本项目的跨平台移植方法论,为 Bash 测试工具在鸿蒙生态的应用提供最佳实践。
📋 目录
- 一、项目概述
- 二、适配设计
- 三、实现细节
- 四、构建与部署
- 五、技术亮点
- 六、总结
一、项目概述
1.1 项目简介
critic.sh是一个简单易用的 Bash 测试框架,由 Srinath Sankar 开发并维护。它提供了简洁的 API 和代码覆盖率报告功能,使得编写和运行 Bash 脚本测试变得简单高效。
核心特性:
- 简洁的 API:提供
_describe、_test、_assert等高级函数,API 设计与其他测试框架一致 - 代码覆盖率:支持生成 LCOV 格式的覆盖率报告,追踪行覆盖和函数覆盖
- 灵活的断言:支持自定义断言表达式,不局限于内置断言函数
- 丰富的断言函数:提供
_return_true、_output_equals、_output_contains等常用断言 - 易于集成:可以单独运行测试脚本,也可以批量运行多个测试文件
1.2 项目信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | critic.sh |
| 版本 | 0.1.1(适配版本)<br>0.1.0(原始版本) |
| 许可证 | MIT License |
| 源码仓库 | https://github.com/Checksum/critic.sh |
| 适配平台 | 开源鸿蒙PC (aarch64-linux-ohos) |
| 项目类型 | 纯 Bash 脚本(无需编译) |
| 依赖 | Bash 4.1+(必需) |
1.3 为什么需要 critic.sh?
在日常 Bash 脚本开发中,我们经常需要:
- ✅验证脚本功能:确保脚本按预期工作
- ✅回归测试:修改后快速验证功能未破坏
- ✅代码覆盖率:了解测试覆盖情况,发现未测试的代码
- ✅文档化行为:测试即文档,清晰说明脚本功能
- ✅CI/CD 集成:自动化测试流程
critic.sh提供了简洁的 API 和代码覆盖率报告功能,让 Bash 脚本测试变得简单高效。
二、适配设计
2.1 适配目标
🎯核心目标:将critic.sh测试框架适配到开源鸿蒙PC平台,使其能够在鸿蒙PC终端环境中正常运行,为鸿蒙生态的 Bash 脚本测试提供支持。
适配价值:
- ✅ 为鸿蒙PC提供专业的 Bash 脚本测试工具
- ✅ 提升 Bash 脚本开发的测试效率和质量
- ✅ 展示纯脚本项目的鸿蒙化适配方法
- ✅ 支持代码覆盖率分析,提升代码质量
2.2 技术方案
2.2.1 架构分析
critic.sh是一个纯 Bash 脚本项目,不依赖任何编译型语言或外部库,但需要 Bash 4.1+ 支持:
critic.sh 项目结构: ├── critic.sh # 主测试框架脚本 ├── entrypoint.sh # Docker 入口脚本 ├── examples/ # 示例测试脚本 │ ├── lib.sh # 示例库文件 │ └── test.sh # 示例测试文件 ├── scripts/ # 测试脚本 │ ├── fixtures/ # 测试固件 │ └── test.sh # 测试脚本 ├── hnp.json # HNP 包配置文件 ├── build_ohos.sh # 鸿蒙构建脚本 └── README.md # 项目说明文档2.2.2 适配策略
由于critic.sh是纯 Bash 脚本,但需要 Bash 4.1+ 支持,适配工作主要包括:
- Bash 依赖处理:创建包装脚本,自动查找系统中的 Bash
- 脚本兼容性检查:确保脚本在鸿蒙PC的 Bash 环境中运行
- 路径适配:确保脚本中的路径处理符合鸿蒙PC的文件系统规范
- 打包配置:创建 HNP(HarmonyOS Native Package)包配置文件
- 构建脚本:编写自动化构建脚本,支持交叉编译环境
2.3 构建系统设计
2.3.1 构建流程
构建流程: 1. 环境准备 ├── 设置交叉编译工具链(clang/llvm) ├── 配置目标平台(aarch64-linux-ohos) └── 设置安装路径 2. 文件复制 ├── 复制 critic.sh 到目标目录 ├── 创建 critic 包装脚本(自动查找 Bash) ├── 复制 examples 和 scripts 目录 ├── 复制 LICENSE 和 README.md └── 复制 hnp.json 配置文件 3. 权限设置 └── 设置可执行权限 4. 打包 ├── 生成 HNP 包(.hnp) └── 生成 tar.gz 压缩包2.3.2 关键配置
HNP 包配置(hnp.json):
{"type":"hnp-config","name":"critic.sh","version":"0.1.1","install":{"links":[{"source":"bin/critic","target":"critic"}]}}三、实现细节
💡提示:
critic.sh是纯 Bash 脚本项目,无需编译,适配工作主要是文件复制、包装脚本创建和权限设置。
3.1 构建脚本实现
构建脚本build_ohos.sh的核心逻辑:
#!/bin/bash# critic.sh OpenHarmony build scriptset-e# Installation path inside HNP public directoryexportCRITIC_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/critic.sh.org/critic.sh_0.1.1# Create install directoriesmkdir-p${CRITIC_INSTALL_HNP_PATH}/binmkdir-p${CRITIC_INSTALL_HNP_PATH}/examplesmkdir-p${CRITIC_INSTALL_HNP_PATH}/scripts# Copy main critic.sh scriptcpcritic.sh${CRITIC_INSTALL_HNP_PATH}/bin/critic.shchmod+x${CRITIC_INSTALL_HNP_PATH}/bin/critic.sh# Create wrapper to dynamically find bashcat>${CRITIC_INSTALL_HNP_PATH}/bin/critic<<'WRAP' #!/bin/sh # critic.sh wrapper for OpenHarmony PC find_bash() { if command -v bash >/dev/null 2>&1; then echo "bash"; return 0; fi for p in /system/bin/bash /usr/bin/bash /bin/bash /usr/local/bin/bash; do if [ -x "$p" ]; then echo "$p"; return 0; fi done return 1 } BASH_CMD=$(find_bash) SCRIPT_DIR=$(dirname "$0") CRITIC_REAL="${SCRIPT_DIR}/critic.sh" if [ -z "$BASH_CMD" ]; then echo "Error: bash is required to run critic.sh. Please install bash 4.1 or later." >&2 exit 1 else exec "$BASH_CMD" "$CRITIC_REAL" "$@" fi WRAPchmod+x${CRITIC_INSTALL_HNP_PATH}/bin/critic# Copy examples, scripts, LICENSE, README.md# ...# Package HNP and tar.gz${HNP_TOOL}pack -i${CRITIC_INSTALL_HNP_PATH}-o${ARCHIVE_PATH}/tar-zvcf${ARCHIVE_PATH}/ohos_critic.sh_0.1.1.tar.gz critic.sh_0.1.1/3.2 Bash 依赖处理
3.2.1 包装脚本设计
由于critic.sh需要 Bash 4.1+,我们创建了一个包装脚本critic,它会:
- 自动查找系统中的 Bash 可执行文件
- 如果找不到 Bash,给出明确的错误提示
- 使用找到的 Bash 执行
critic.sh
包装脚本的关键特性:
- 支持多个常见的 Bash 安装路径
- 提供清晰的错误提示
- 保持命令行参数传递
3.2.2 路径处理
脚本中的路径处理已经考虑了跨平台兼容性:
# 使用相对路径和环境变量SCRIPT_DIR=$(dirname"$0")CRITIC_REAL="${SCRIPT_DIR}/critic.sh"3.3 兼容性处理
3.3.1 Bash 版本要求
critic.sh需要 Bash 4.1+,主要使用了以下 Bash 特性:
- 关联数组(
declare -A) BASH_XTRACEFD和函数追踪extdebug选项- Bash 特定的参数扩展
3.3.2 覆盖率追踪机制
critic.sh使用 Bash 的调试追踪功能来实现代码覆盖率:
# 启用函数追踪exportBASH_XTRACEFD="13"exportPS4="+(\${BASH_SOURCE}:\${LINENO}):|:\${FUNCNAME[0]:+\${FUNCNAME[0]}():|:}"set-xo functrace这些特性在 Bash 4.1+ 中可用,但在 POSIX sh 中不可用。
四、构建与部署
4.1 构建环境要求
- OpenHarmony SDK:6.0.0.46-Beta1 或更高版本
- 开发环境:macOS 或 Linux
- 构建工具:bash、tar、hnpcli
4.2 构建步骤
4.2.1 准备 SDK
# 下载并解压 OpenHarmony SDK# SDK 路径示例:/Users/lijiajun/ohos-sdk4.2.2 执行构建
# 进入构建目录cdHarmonyOSPC/build# 执行构建脚本SPECIFIC_DIR=critic.sh ./build.sh --sdk /Users/lijiajun/ohos-sdk构建输出:
Build in: <Darwin ...> by cross tool chains. Building critic.sh testing framework for OpenHarmony PC (aarch64-linux-ohos)... Copying examples... Copying scripts... critic.sh installed successfully Packing HNP package... Build completed successfully! Output files: - /path/to/output/critic.sh.hnp - /path/to/output/ohos_critic.sh_0.1.1.tar.gz4.3 构建产物
构建完成后,在output/目录下会生成:
- critic.sh.hnp:HNP 包文件,可直接通过 hnp 工具安装
- ohos_critic.sh_0.1.1.tar.gz:tar.gz 压缩包,包含完整的安装文件
安装目录结构:
/data/service/hnp/critic.sh.org/critic.sh_0.1.1/ ├── bin/ │ ├── critic.sh # 主测试框架脚本 │ └── critic # 包装脚本(自动查找 Bash) ├── examples/ # 示例测试脚本 │ ├── lib.sh │ └── test.sh ├── scripts/ # 测试脚本 │ ├── fixtures/ │ └── test.sh ├── LICENSE # 许可证文件 ├── README.md # 项目说明文档 └── hnp.json # HNP 配置文件4.4 安装部署
方式一:使用 tar.gz 包安装
# 在鸿蒙PC上执行tar-xzf ohos_critic.sh_0.1.1.tar.gzcp-r critic.sh_0.1.1/* /data/service/hnp/critic.sh.org/critic.sh_0.1.1/方式二:手动安装
# 复制文件到安装目录mkdir-p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/binmkdir-p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/examplesmkdir-p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/scriptscpbin/critic.sh /data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin/cpbin/critic /data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin/chmod+x /data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin/*# 添加到 PATHexportPATH=$PATH:/data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin4.5 验证安装
安装完成后,可以验证 critic.sh 是否正常工作:
# 使用 critic 命令查看帮助critic --help# 或直接使用 bash 执行bash/data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin/critic.sh --help五、技术亮点
5.1 零编译适配
critic.sh作为纯 Bash 脚本项目,适配到鸿蒙PC平台无需任何编译步骤,只需要:
- 文件复制
- 包装脚本创建(处理 Bash 依赖)
- 权限设置
- 打包分发
这使得适配过程非常简洁高效。
5.2 代码覆盖率支持
critic.sh提供了代码覆盖率报告功能,这在 Bash 测试框架中比较少见:
- 行覆盖率:追踪哪些代码行被执行
- 函数覆盖率:追踪哪些函数被调用
- LCOV 格式:支持标准的 LCOV 格式,可与 CI/CD 工具集成
- HTML 报告:可选生成 HTML 格式的覆盖率报告
5.3 灵活的 API 设计
- 自定义表达式:支持传递任何 Bash 表达式作为测试或断言
- 一致的 API:API 设计与其他测试框架(如 RSpec、Jest)一致
- 丰富的断言:提供多种内置断言函数,也支持自定义断言
5.4 包装脚本设计
为了解决 Bash 依赖问题,我们设计了智能的包装脚本:
- 自动查找 Bash:在多个常见路径中查找 Bash
- 清晰的错误提示:如果找不到 Bash,给出明确的错误信息
- 参数传递:完整保留命令行参数
六、总结
6.1 适配成果
成功将critic.sh测试框架适配到开源鸿蒙PC平台:
- ✅ 完成构建脚本编写
- ✅ 创建 Bash 包装脚本,处理依赖问题
- ✅ 生成 HNP 包和 tar.gz 压缩包
- ✅ 验证脚本在目标平台的兼容性
- ✅ 提供完整的使用文档和示例
6.2 技术价值
- 生态完善:为鸿蒙PC提供了专业的 Bash 脚本测试工具
- 开发效率:提升 Bash 脚本开发的测试效率和质量
- 代码质量:通过覆盖率报告,发现未测试的代码
- 最佳实践:展示了纯脚本项目的鸿蒙化适配方法
6.3 注意事项
- Bash 依赖:
critic.sh需要 Bash 4.1+,确保目标系统已安装 Bash - 覆盖率追踪:覆盖率功能依赖 Bash 的调试追踪功能,需要 Bash 4.1+
- 路径处理:在编写测试时,注意使用相对路径或环境变量
6.4 未来展望
- 支持更多断言函数
- 改进覆盖率报告的准确性
- 优化性能,减少追踪开销
- 提供更多示例和最佳实践