关于 ui5-best-practices-qunit
这是一项用于编写、审查和改进 UI5 QUnit 测试的技能,涵盖异步测试、模块设置与清理、Sinon 用法及代码风格规范。
主要功能
- 01新建 QUnit 测试指南
- 02测试改进与审查规则
- 03异步测试模式
- 04Sinon 沙盒与桥接用法
- 05模块设置和清理要求
- 06ESLint 与代码风格清单
适用场景
- 01创建 UI5 QUnit 测试模块
- 02在迁移到 QUnit 2 时重构测试
- 03审查异步测试行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ui5/ plugins-coding-agents --skill ui5-best-practices-qunit安装后在 Claude Code 中输入/ui5-best-practices-qunit确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/async-patterns.mdmodernizing-tests.mdwriting-new-tests.md详细介绍
UI5 的 QUnit 测试最佳实践
何时加载各项参考资料
| 触发条件 | 加载 |
|---|---|
| 从头编写新的 QUnit 测试文件或模块 | references/writing-new-tests.md |
| 改进、重构或审查现有测试代码 | references/modernizing-tests.md |
从 QUnit 1(全局函数:test、asyncTest、ok、stop、start)迁移到 QUnit 2 | references/modernizing-tests.md |
任意测试涉及 nextUIUpdate、Core.applyChanges、assert.async、模拟计时器或基于事件的异步操作 | references/async-patterns.md |
请先加载参考资料,再生成任何输出。不要凭记忆作答。
核心规则(始终适用)
| 规则 | 详情 |
|---|---|
禁止使用 var | 使用 const 或 let。每行只声明一个变量,不要用逗号串联声明。 |
禁止使用 .bind(this) | 对不需要自身 this 的回调使用箭头函数。 |
每个 async 测试都要使用 assert.expect(N) | 防止异步回调始终未触发时测试仍无声通过。同步测试不需要。 |
sinon.createSandbox() | sinon.sandbox.create() 会在 Sinon 5 及更高版本中产生运行时弃用警告,建议使用 sinon.createSandbox()。也可以使用 QUnit-sinon 桥接(this.stub()、this.spy()、this.mock();仅当 sinon.config.useFakeTimers 为真时使用 this.clock)。不要在同一模块中混用这两种方法。 |
| 测试名称应清晰明确 | 用描述行为的句子命名。切勿以“it should”开头。在每个模块中保持名称唯一。 |
每个模块都要使用 beforeEach / afterEach | 在 beforeEach 中创建所有控件,在 afterEach 中销毁它们。测试之间不得共享可变状态。 |
辅助函数创建控件时使用 try/finally | 创建控件的辅助函数必须在 finally 中销毁控件,确保即使断言抛出异常也能清理控件。 |
| 不使用非 ASCII 字符 | 注释、字符串或 JSDoc 中不得包含非 ASCII 字符。使用普通 ASCII 连字符,不要使用长破折号。必须使用 UTF-8,但注释中的非 ASCII 字符历来会导致编码问题。 |
| ESLint:0 个错误 | 现有模式引起的警告(max-nested-callbacks、no-use-before-define、valid-jsdoc)可以接受。 |
快速参考清单
编写或审查 QUnit 测试文件时使用:
- 不使用
var:使用const或let;每行只声明一个变量(不要用逗号串联声明) - 不使用
.bind(this):对不需要自身this的回调使用箭头函数 - 简单情况下不使用
assert.async():使用async function和await new Promise(...) - 每个
async测试都使用assert.expect(N) - 新代码中不使用
sinon.sandbox.create():使用sinon.createSandbox()或桥接(this.stub()、this.spy()、this.mock());仅在启用模拟计时器时使用this.clock - 测试标题不使用“it should...”:使用描述性句子
- 每个
QUnit.module都要有beforeEach/afterEach,用于创建并销毁所有控件 - 使用模拟计时器时,优先使用
await nextUIUpdate(this.clock),而不是Core.applyChanges();只有在nextUIUpdate(clock)无法处理该情况时才保留Core.applyChanges() - 创建控件的辅助函数要在
try/finally中销毁控件 - 注释或字符串中不使用非 ASCII 字符(必须使用 UTF-8,但非 ASCII 字符会导致编码问题)
评论
支持 Markdown