已开启
add: mugen-case-genarator skill #145
xu_yishen创建于 7月2日
add: mugen-case-genarator skill #145
已开启
xu_yishen创建于 7月2日
xu_yishen
7月2日

当前PR是否有AI参与:

[x] 否

[ ] 是
__1. AI Agent 平台:
__2. AI 模型:
__3. Prompt上下文 :

参考:openEuler社区《生成式AI工具使用与开源贡献政策》

PR功能描述 / 为什么需要这个合入**:

新增skills文件夹以及mugen-case-genenrator skill

该PR关联的issue

(格式为fixes #<issue号>, 或者resolves #<issue号>): fixes #

希望检视人员了解:

likedislike
合并受阻
Xxu_yishen
7月2日 创建了 pull request,commit cdec4a06
openeuler-ci-botopeneuler-ci-bot成员
7月2日 将Rigorous,saarloos,wu_fengguang,linqian0322,zjl_long,Charlie_li1,hfutsdd,lutianxiong,wangpeng_uniontech,SupMario,lemon-higgins,walkingwalk设为审查人
openeuler-ci-botopeneuler-ci-bot成员
7月2日 添加了label:sig/sig-QA
openeuler-ci-bot
openeuler-ci-bot成员
7月2日 评论:

Welcome To openEuler Community

Hey @xu_yishen , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: sig-QA ,
and any of the maintainers: @Charlie_li1, @Rigorous, @SupMario, @hfutsdd, @lemon-higgins, @linqian0322, @lutianxiong, @saarloos, @walkingwalk, @wangpeng_uniontech, @wu_fengguang, @zjl_long ,

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月2日 添加了label:openeuler-cla/yes
openeuler-ci-bot
openeuler-ci-bot成员
7月2日 评论:

CLA Signature Pass

xu_yishen, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
atomgit-bot
atomgit-bot
7月2日 评论:

变更摘要

该PR新增了 skills/mugen-case-generator 技能目录,为 mugen 测试框架提供了一套用例生成与校验工具链。主要包括一个 bash 脚本校验器 verify_case.sh 和三个模板文件(用例骨架、套件公共库、套件映射配置),帮助开发者按规范快速创建合规的测试用例。

主要改动

  • 新增 verify_case.sh 校验脚本: 提供12项自动化检查(bash语法、ShellCheck lint、source行数/格式、LOG_INFO条数、pre_test/post_test中禁止CHECK_RESULT、禁用shellcheck disable指令、英文注释、裸sleep检查、头部元数据完整性、main入口等),确保生成的用例符合 mugen 规范。
  • 新增 case_template.sh 用例模板: 提供标准的 mugen 测试用例骨架,包含 pre_test/run_test/post_test 三阶段结构、版权头、source "${OET_PATH}" 引用、CHECK_RESULT 断言及 main "$@" 入口,开发者只需替换占位符即可。
  • 新增 suite_common_lib_template.sh 公共库模板: 提供套件级公共函数库骨架,包含配置备份/恢复、服务启停、日志窗口断言等辅助函数,并区分了 pre_test/post_test 辅助函数(返回0/1)与 run_test 校验函数(内部调用 CHECK_RESULT)的使用规范。
  • 新增 suite2cases_template.json 套件映射模板: 定义套件路径与用例列表的 JSON 映射结构,用于将多个测试用例组织到同一测试套件下。
likedislike
atomgit-bot
atomgit-bot
7月2日 评论:

代码审查

审查结论

逐文件审查结果:

文件 审查结论
skills/mugen-case-generator/REFERENCE.md 无问题
skills/mugen-case-generator/SKILL.md 无问题
skills/mugen-case-generator/scripts/verify_case.sh 无问题
skills/mugen-case-generator/templates/case_template.sh P3 ×1(年份硬编码)
skills/mugen-case-generator/templates/suite2cases_template.json 无问题
skills/mugen-case-generator/templates/suite_common_lib_template.sh P3 ×1(年份硬编码)

发现汇总:

  • P0:0
  • P1:0
  • P2:0
  • P3:2(两个模板中版权年份硬编码为 2026 而非 <YYYY> 占位符,与同模板其他占位符风格不一致)

整体风险评估:低风险。 本次变更新增了一个 mugen 用例生成器 skill,包含参考文档、校验脚本和三个模板文件。代码逻辑正确,校验脚本设计合理,模板遵循规范要求。仅两个模板存在占位符风格不一致的轻微问题(硬编码年份而非占位符),不影响功能正确性,可在后续按需统一。

类型 数量
🔴 阻塞 0
🟡 建议 3

💬 仅评论

likedislike
atomgit-bot
atomgit-bot7月2日进行代码检视1
skills/mugen-case-generator/SKILL.md
@@ -0,0 +36,4 @@
36+- **CHECK_RESULT** `<实际> <期望> <模式> "<消息>"`(4 个参数),跟在 `run_test` 里每个测试点后面。**pre/post 里绝对不能有**(§2.4)。
37+- **SLEEP_WAIT**,不要裸 `sleep`。
38+- **ShellCheck**:只允许 `info`(SC1090/SC1091,来自 source 行)。warning/style/error 全部为 0。用代码修,**绝不加 `# shellcheck disable`**
39+- **风格**:4 空格缩进;`grep xxx file`;`test -f file`;不留死代码/未用变量;临时文件放 `/tmp` 并在 post_test 清理;`cp -f`/`mv -rf`/`userdel -rf`;用 `DNF_INSTALL`/`DNF_REMOVE`/`NODE1_*`。
atomgit-bot
atomgit-bot7月2日评论:

🟡 Medium Priority

变更行:SKILL.md 第 39 行,核心规则精简版中列出了 cp -f/mv -rf/userdel -rf

与 REFERENCE.md 第 178 行相同的问题:mv 命令(GNU coreutils / POSIX)不支持 -r 标志。执行 mv -rf src dst 会报 mv: invalid option -- 'r' 并失败。SKILL.md 作为快速上手指南,用户很可能直接复制此处的命令模式到用例中,导致运行时失败。

应改为 mv -f

建议:将 mv -rf 改为 mv -f

改动建议
39
- - **风格**:4 空格缩进;`grep xxx file`;`test -f file`;不留死代码/未用变量;临时文件放 `/tmp` 并在 post_test 清理;`cp -f`/`mv -rf`/`userdel -rf`;用 `DNF_INSTALL`/`DNF_REMOVE`/`NODE1_*`。
39
+ - **风格**:4 空格缩进;`grep xxx file`;`test -f file`;不留死代码/未用变量;临时文件放 `/tmp` 并在 post_test 清理;`cp -f`/`mv -f`/`userdel -rf`;用 `DNF_INSTALL`/`DNF_REMOVE`/`NODE1_*`。
应用建议
likedislike
atomgit-bot
atomgit-bot7月2日进行代码检视1
skills/mugen-case-generator/templates/suite_common_lib_template.sh
@@ -0,0 +81,4 @@
81+}
82+ 
83+x_assert_not_log_contains() {
84+ local pattern=$1 msg=${2:-"unexpected log found: $1"}
atomgit-bot
atomgit-bot7月2日评论:

🟡 Medium Priority

变更行:suite_common_lib_template.sh 第 84 行。

函数 x_assert_not_log_contains 的语义是"断言日志中不包含指定模式"。当模式被匹配到时(grep 成功,退出 0),进入 if 分支执行 CHECK_RESULT 1 0 0 "$msg",即断言失败——此时应报告"意外发现了不应存在的日志"。

但第 84 行的默认消息是 "expected log not found: $1"("期望的日志未找到"),这是 x_assert_log_contains(正向断言)的语义,与本函数的逆向断言语义完全相反。用户使用此模板且不传自定义消息时,一旦断言触发失败,看到的错误消息会指向相反的方向,严重误导排错。

建议:将默认消息改为 "unexpected log found: $1""log should not contain: $1",与函数名 _assert_not_log_contains 的语义一致。同时检查 REFERENCE.md 第 137 行对应的 em_assert_log_contains 示例中是否存在同样问题(当前示例只展示了正向断言 em_assert_log_contains,未涉及逆向断言,不受影响)。

likedislike
atomgit-bot
atomgit-bot7月2日进行代码检视1
skills/mugen-case-generator/REFERENCE.md
@@ -0,0 +175,4 @@
175+- 临时文件放 `/tmp`(或在当前路径建临时目录),post_test 里清理。
176+- 每个用例独立(互不依赖、互不影响)。
177+- `DNF_INSTALL "p1 p2"`(多包);`DNF_REMOVE`(不带参,与 DNF_INSTALL 配合)。
178+- `cp -f``mv -rf``userdel -rf`
atomgit-bot
atomgit-bot7月2日评论:

🟡 Medium Priority

变更行:REFERENCE.md 第 178 行,cp -fmv -rfuserdel -rf

mv 命令(GNU coreutils / POSIX)不支持 -r / --recursive 标志——mv 对目录操作本身已经是递归的,无需且不接受 -r。在 GNU/Linux 环境执行 mv -rf src dst 会报错 mv: invalid option -- 'r' 并退出非零。

如果用户按此文档编写 post_test 清理逻辑,实际执行到该行时会导致用例失败。userdel -rfcp -f 都是合法标志组合,唯独 mv -rf 是错误用法。应改为 mv -f

建议:将 mv -rf 改为 mv -f。同时检查 doc/测试用例检视规范.md 原文是否存在同样问题——若原文也有此错误,应一并修正。

改动建议
178
- - `cp -f`、`mv -rf`、`userdel -rf`。
178
+ - `cp -f`、`mv -f`、`userdel -rf`。
应用建议
likedislike
linqian0322成员7月2日进行代码检视1
skills/mugen-case-generator/SKILL.md
@@ -0,0 +1,0 @@
1+---
linqian03227月2日评论:

缺失顶层README和openai.yaml

likedislike
linqian0322成员7月2日进行代码检视1
skills/mugen-case-generator/scripts/verify_case.sh
@@ -0,0 +2,4 @@
2+# 校验 mugen 测试用例是否符合规范 + CI ShellCheck 门禁。
3+# 用法:verify_case.sh <用例.sh> (可设 OET_PATH 指向 mugen 仓库以提供上下文)
4+# 任一检查不过则非 0 退出。
5+ 
linqian03227月2日评论:

建议加上用例名称的检查
oe_test_[_].sh 模式

likedislike
linqian0322成员7月2日进行代码检视1
skills/mugen-case-generator/REFERENCE.md
@@ -0,0 +144,4 @@
144+## 8. 便携负载生成器(stress-ng 不可用时)
145+ 
146+openEuler 仓库常缺 `stress-ng`。用便携替代:
147+- **CPU 负载**:`numactl --cpunodebind=0 --membind=0 bash -c '(( end = SECONDS + TMOUT )); while (( SECONDS < end )); do :; done' &`
linqian03227月2日评论:

numactl非内置 需要提前检查是否安装

likedislike
linqian0322成员7月2日进行代码检视1
skills/mugen-case-generator/SKILL.md
@@ -0,0 +1,2 @@
1+---
2+name: mugen-case-generator
3+description: >
linqian03227月2日评论:

description过长 可以考虑拆分成结构块 并突出关键词

likedislike
SPYFAMILY成员7月5日进行代码检视1
skills/mugen-case-generator/REFERENCE.md
@@ -0,0 +13,4 @@
13+```
14+#!/usr/bin/bash
15+ 
16+# Copyright (c) <年份>. Huawei Technologies Co.,Ltd.ALL rights reserved.
SPYFAMILY7月5日评论:

社区文档建议以社区来署名
# Copyright (c) <年份> openEuler Community. All rights reserved.

likedislike
SPYFAMILY成员7月5日进行代码检视1
skills/mugen-case-generator/templates/case_template.sh
@@ -0,0 +4,4 @@
4+# oe_test_<pkg>[_<num>|_<cmd>].sh, and replace every <PLACEHOLDER> / `true` marker.
5+# After editing, run: scripts/verify_case.sh <your_file>
6+ 
7+# Copyright (c) 2026. Huawei Technologies Co.,Ltd.ALL rights reserved.
SPYFAMILY7月5日评论:

社区文档建议以社区来署名
# Copyright (c) <年份> openEuler Community. All rights reserved.

likedislike
SPYFAMILY成员7月5日进行代码检视1
skills/mugen-case-generator/templates/suite_common_lib_template.sh
@@ -0,0 +11,4 @@
11+# - verification helpers (assert / start-service / write-config) call CHECK_RESULT internally.
12+# - helpers called from pre_test/post_test (backup/stop/restore/require-pkg) return 0/1, NEVER CHECK_RESULT.
13+ 
14+# Copyright (c) 2026. Huawei Technologies Co.,Ltd.ALL rights reserved.
SPYFAMILY7月5日评论:

社区文档建议以社区来署名
# Copyright (c) <年份> openEuler Community. All rights reserved.

likedislike