关于 oh-ut-generator
oh-ut-generator 是为 OpenHarmony 代码生成 C++ 单元测试的 skill,遵循 HWTEST_F 约定。它面向需要覆盖函数、依赖和构建配置的开发者,也处理 NDK/NAPI 与 CJSON 测试场景。
主要功能
- 01生成正常、异常和边界测试
- 02创建 mock 并设置 EXPECT_CALL/ON_CALL
- 03匹配 BUILD.gn 依赖与配置
- 04处理 NDK、NAPI 和 CJSON 测试模式
- 05使测试符合现有项目风格
适用场景
- 01为源文件中的所有函数生成测试
- 02为指定函数生成测试
- 03向现有测试文件追加用例
- 04为源代码依赖创建 mock
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ openharmonyinsight/ openharmony-skills --skill oh-ut-generator安装后在 Claude Code 中输入/oh-ut-generator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples/basic-test-example.cppmock-test-example.cppndk-test-example.cppreferences/assertion-standards.mdbuild-gn-rules.mdcjson-testing.mdcode-style-consistency.mdcoverage-requirements.mdframework-specs.mdmock-strategies.mdndk-napi-testing.mdsecurity-coding.mdsmart-pointer-usage.md详细介绍
OpenHarmony 单元测试生成器
概述
按照 HWTEST_F 框架约定,为 OpenHarmony 代码生成全面的 C++ 单元测试。
主要功能
- 自动生成测试:为正常、异常和边界场景创建测试用例
- Mock 对象支持:创建 Mock 类并设置 EXPECT_CALL/ON_CALL
- BUILD.gn 配置:自动匹配源文件的依赖项
- 覆盖率优化:最低覆盖率为 75%,目标为 85% 以上
- 代码风格一致性:与现有测试模式保持一致(阈值 >=70%)
- NDK/NAPI 支持:特殊处理 NDK 接口(7088+ OH_xxx)和 NAPI 函数(302+ napi_xxx)
- CJSON 测试:全面支持 CJSON 库测试模式
用法
需要为 OpenHarmony C++ 源文件生成单元测试时,调用此技能。
支持的场景
- 单文件测试:为源文件中的所有函数生成测试
- 指定函数测试:仅为指定函数生成测试
- 扩展测试文件:向现有测试文件追加新的测试用例
- 生成 Mock:自动为依赖项创建 Mock 类
关键要求
测试实现完整性
- 仅接受完整实现:每个测试用例都必须有完整实现
- 禁止仅含注释的测试:禁止生成仅包含注释或空函数体的测试
- 使用 Mock:如果创建了 Mock 对象,就必须通过 EXPECT_CALL/ON_CALL 使用它们
- 分支与断言对应:分支断言必须与分支逻辑完全一致
覆盖率要求
- 最低要求:分支和行覆盖率均为 75%(强制要求)
- 目标:分支和行覆盖率均为 85%(目标)
- 范围:边界条件、异常路径、正常路径和所有条件分支
代码风格一致性
存在现有测试文件时:
- 智能指针类型:必须与现有代码一致(sptr/wptr 或 std::shared_ptr)
- Mock 用法:必须与现有 Mock 模式一致
- 断言风格:必须与现有断言偏好一致(EXPECT_ 或 ASSERT_)
- 测试结构:必须与现有测试夹具和命名模式一致
一致性阈值:重要场景需达到 >=70%
安全编码
- 内存管理:与原函数的智能指针用法模式一致
- 变量初始化:所有变量都必须初始化
- 边界检查:访问数组/容器前必须进行检查
- 空指针检查:解引用指针前必须进行检查
- 返回值检查:必须检查关键函数的返回值
框架规范
HWTEST_F 框架
// Test fixture structure
class YourServiceTest : public testing::Test {
public:
static void SetUpTestCase(void);
static void TearDownTestCase(void);
void SetUp();
void TearDown();
std::shared_ptr<YourService> instance_;
};
// Test case format
HWTEST_F(TestClassName, TestCaseName_001, TestSize.Level1)
测试用例命名
_001:正常场景_002:异常场景_003:边界场景_004+:其他特殊场景
对象管理
// Standard smart pointers
SetUp(): instance_ = std::make_shared<YourService>();
TearDown(): instance_ = nullptr;
// OpenHarmony sptr/wptr
SetUp(): instance_ = MakeSptr<YourService>(); // or instance_ = new YourService();
TearDown(): instance_ = nullptr;
Mock 用法
auto mock = std::make_shared<MockClass>();
EXPECT_CALL(*mock, Method()).WillOnce(Return(value));
断言
ASSERT_NE(instance_, nullptr); // Must check
EXPECT_EQ(result, expected);
EXPECT_TRUE(condition);
NDK 接口测试
对于 NDK 接口(OH_xxx),请遵循以下要求:
- 资源生命周期:必须配对调用 Create/Destroy
- 测试结构:正常路径(001)、异常路径(002)、边界场景(003)
- 返回值验证:测试所有错误码
- 参数验证:测试空指针、无效值和边界值
CJSON 测试
对于 CJSON 库操作:
- 解析测试:正常、空指针、无效 JSON
- 获取项测试:正常获取、不存在的项、类型检查
- 创建测试:创建对象、数组和值
- 内存管理:必须删除所有 cJSON 对象
BUILD.gn 要求
ohos_unittest 目标
ohos_unittest("{CamelCase}Test") {
module_out_path = "subsystem/module"
branch_protector_ret = "pac_ret"
sanitize = {
integer_overflow = true
cfi = true
cfi_cross_dso = true
debug = false
}
sources = ["test_file.cpp"] # Alphabetically sorted
include_dirs = ["//include/path"]
deps = [":source_target"]
external_deps = [
"hilog:libhilog",
"c_utils:utils",
"googletest:gtest_main"
]
defines = ["private=public"]
}
配置匹配
系统会自动提取源文件的 BUILD.gn 配置:
- deps:必须包含源目标的所有依赖项
- external_deps:必须包含所有外部依赖项
- include_dirs:必须包含所有包含目录
- defines:必须与源文件定义一致(必要时添加 private=public)
参考文件
详细规范请参阅 references/ 目录:
- framework-specs.md:HWTEST_F 框架约定和测试模式
- mock-strategies.md:Mock 对象的创建和使用策略
- coverage-requirements.md:覆盖率指标和优化策略
- build-gn-rules.md:BUILD.gn 配置和依赖匹配
- assertion-standards.md:断言方法和分支对应关系
- code-style-consistency.md:与现有测试保持一致的要求
- smart-pointer-usage.md:sptr/wptr 与标准智能指针的用法
- ndk-napi-testing.md:NDK/NAPI 接口测试规范
- cjson-testing.md:CJSON 库测试模式
- security-coding.md:内存管理和安全编码要求
示例
请参阅 examples/ 目录,了解以下内容:
- basic-test-example.cpp:基本测试结构和模式
- mock-test-example.cpp:Mock 对象的用法示例
- ndk-test-example.cpp:NDK 接口测试示例
评论
支持 Markdown