命令行critic.sh在开源鸿蒙PC平台的实现解析

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 脚本开发中,我们经常需要:

  1. 验证脚本功能:确保脚本按预期工作
  2. 回归测试:修改后快速验证功能未破坏
  3. 代码覆盖率:了解测试覆盖情况,发现未测试的代码
  4. 文档化行为:测试即文档,清晰说明脚本功能
  5. 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+ 支持,适配工作主要包括:

  1. Bash 依赖处理:创建包装脚本,自动查找系统中的 Bash
  2. 脚本兼容性检查:确保脚本在鸿蒙PC的 Bash 环境中运行
  3. 路径适配:确保脚本中的路径处理符合鸿蒙PC的文件系统规范
  4. 打包配置:创建 HNP(HarmonyOS Native Package)包配置文件
  5. 构建脚本:编写自动化构建脚本,支持交叉编译环境

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,它会:

  1. 自动查找系统中的 Bash 可执行文件
  2. 如果找不到 Bash,给出明确的错误提示
  3. 使用找到的 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平台无需任何编译步骤,只需要:

  1. 文件复制
  2. 包装脚本创建(处理 Bash 依赖)
  3. 权限设置
  4. 打包分发

这使得适配过程非常简洁高效。

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 技术价值

  1. 生态完善:为鸿蒙PC提供了专业的 Bash 脚本测试工具
  2. 开发效率:提升 Bash 脚本开发的测试效率和质量
  3. 代码质量:通过覆盖率报告,发现未测试的代码
  4. 最佳实践:展示了纯脚本项目的鸿蒙化适配方法

6.3 注意事项

  1. Bash 依赖critic.sh 需要 Bash 4.1+,确保目标系统已安装 Bash
  2. 覆盖率追踪:覆盖率功能依赖 Bash 的调试追踪功能,需要 Bash 4.1+
  3. 路径处理:在编写测试时,注意使用相对路径或环境变量

6.4 未来展望

  • 支持更多断言函数
  • 改进覆盖率报告的准确性
  • 优化性能,减少追踪开销
  • 提供更多示例和最佳实践
相关推荐
kirk_wang3 小时前
Flutter `flutter_statusbarcolor_ns` 在 OpenHarmony 平台的状态栏颜色适配实践
flutter·移动开发·跨平台·arkts·鸿蒙
kirk_wang4 小时前
Flutter 三方库在 OHOS 平台的适配实践:以 flutter_test_lib 为例
flutter·移动开发·跨平台·arkts·鸿蒙
特立独行的猫a4 小时前
cpp-linenoise介绍——让命令行拥有猫一般的敏捷
c++·ui·命令行·cpp-linenoise
kirk_wang4 小时前
Flutter 三方库在 OHOS 平台的适配实践
flutter·移动开发·跨平台·arkts·鸿蒙
m0_637146934 小时前
鸿蒙技术实测:ArkTS 语言深度解读
鸿蒙·鸿蒙系统
大土豆的bug记录3 天前
鸿蒙实现自定义类似活体检测功能
数码相机·华为·harmonyos·鸿蒙
hahjee3 天前
命令行参数解析利器:gnuflag在OpenHarmony PC上的完整适配实战
开源·鸿蒙
kirk_wang3 天前
Flutter 三方库 `flutter_phone_direct_caller` 在 OpenHarmony 平台的适配实战
flutter·移动开发·跨平台·arkts·鸿蒙
hahjee3 天前
Go编写的ANSI终端颜色和样式控制库在OpenHarmony PC上的完整适配实战
开发语言·后端·鸿蒙