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):
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 的核心逻辑:
bash
#!/bin/bash
# critic.sh OpenHarmony build script
set -e
# Installation path inside HNP public directory
export CRITIC_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/critic.sh.org/critic.sh_0.1.1
# Create install directories
mkdir -p ${CRITIC_INSTALL_HNP_PATH}/bin
mkdir -p ${CRITIC_INSTALL_HNP_PATH}/examples
mkdir -p ${CRITIC_INSTALL_HNP_PATH}/scripts
# Copy main critic.sh script
cp critic.sh ${CRITIC_INSTALL_HNP_PATH}/bin/critic.sh
chmod +x ${CRITIC_INSTALL_HNP_PATH}/bin/critic.sh
# Create wrapper to dynamically find bash
cat > ${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
WRAP
chmod +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 路径处理
脚本中的路径处理已经考虑了跨平台兼容性:
bash
# 使用相对路径和环境变量
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 的调试追踪功能来实现代码覆盖率:
bash
# 启用函数追踪
export BASH_XTRACEFD="13"
export PS4="+(\${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
bash
# 下载并解压 OpenHarmony SDK
# SDK 路径示例:/Users/lijiajun/ohos-sdk
4.2.2 执行构建
bash
# 进入构建目录
cd HarmonyOSPC/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.gz
4.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 包安装
bash
# 在鸿蒙PC上执行
tar -xzf ohos_critic.sh_0.1.1.tar.gz
cp -r critic.sh_0.1.1/* /data/service/hnp/critic.sh.org/critic.sh_0.1.1/
方式二:手动安装
bash
# 复制文件到安装目录
mkdir -p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin
mkdir -p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/examples
mkdir -p /data/service/hnp/critic.sh.org/critic.sh_0.1.1/scripts
cp bin/critic.sh /data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin/
cp bin/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/*
# 添加到 PATH
export PATH=$PATH:/data/service/hnp/critic.sh.org/critic.sh_0.1.1/bin
4.5 验证安装
安装完成后,可以验证 critic.sh 是否正常工作:
bash
# 使用 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 未来展望
- 支持更多断言函数
- 改进覆盖率报告的准确性
- 优化性能,减少追踪开销
- 提供更多示例和最佳实践