测试写作
- 作者仓库星标 0
- 作者更新于 实时读取
- 作者仓库 skills-registry
- 领域
- 工程开发
- 兼容 Agent
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- 信任分
- 88 / 100 · 社区维护
- 作者 / 版本 / 许可
- @tomevault-io · 未声明 license
- Token 消耗评级
- 低消耗
- 接入复杂程度
- 需简单配置
- 是否需要外部 API Key
- 不需要
- 兼容的系统
- macOS · Linux · Windows
- 底层运行要求
- Python
- 文件与系统权限
-
- 只读
- 允许写入 / 修改
- Shell 执行
- 网络行为
- 仅限本地
- 安装命令数
- 26 条
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: openlore-write-tests
description: Write real tests for a function or spec scenario — language-agnostic (TypeScript, Python, C++…).…
category: 工程开发
runtime: Python
---
# openlore-write-tests 输出预览
## PART A: 任务判断
- 适用问题:代码实现、重构、调试或代码审查。
- 输入要求:目标材料、限制条件、期望输出和验收方式。
- 证据边界:围绕“When to use this skill / Step 1 — Identify target + detect framework / Step 2 — Orient”读取原文规则,不把推断写成作者承诺。
## PART B: 执行结果
- **01** 任务判断:确认你的需求是否属于代码实现、重构、调试或代码审查,并标出输入、限制和预期结果。
- **02** 执行计划:优先按“When to use this skill / Step 1 — Identify target + detect framework / Step 2 — Orient”拆成步骤,说明每一步会读取什么、修改什么、产出什么。
- **03** 交付结果:给出可复制的命令、文件改动、检查清单或内容草稿,并说明如何继续迭代。
- **04** 风险边界:结合 读取文件、写入/修改文件、执行终端命令、主要在本地完成、通常不需要额外 API Key 给出执行前确认项。
## Running Rules
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先小样例验证,再放大到真实任务。
- 交付时同时给结果、检查口径和下一步迭代建议。 原文出现了 `/openlore-write-tests` 这类斜杠命令;如果你的 Agent 支持命令触发,优先用命令开场,再补充目标和边界。
告诉 Agent 目标文件或材料、期望结果、不可改范围、是否允许联网或执行命令。本 Skill 的权限画像是:读取文件、写入/修改文件、执行终端命令。
先用一个小任务确认它会围绕“When to use this skill / Step 1 — Identify target + detect framework / Step 2 — Orient”工作;涉及文件或命令时,先看 diff、日志、预览或测试结果。
检查最终产物是否包含明确结果、必要证据和下一步动作;如果输出泛泛而谈,就补充输入、边界和验收标准后重跑。
---
name: openlore-write-tests
description: Write real tests for a function or spec scenario — language-agnostic (TypeScript, Python, C++…).…
category: 工程开发
source: tomevault-io/skills-registry
---
# openlore-write-tests
## 什么时候使用
- 用于组织测试、定位失败并形成修复闭环 适合处理工程开发场景下的代码实现、调试、重构、测试或代码审查,核心价值是把输入、判断、执行、验证和交付边界固定下来,避免 Agent 泛泛回答。 把任务拆成可执行、可检查、可继续迭代的步骤;通常不需…
- 面向代码实现、重构、调试或代码审查,优先处理能明确输入、步骤和验收标准的工作。
## 需要提供什么
- 目标材料、目录范围、期望结果和不可改动内容。
- 是否允许联网、执行命令、读写文件或调用外部服务。
## 执行规则
- 围绕「When to use this skill / Step 1 — Identify target + detect framework / Step 2 — Orient」组织步骤,不把推断写成作者事实。
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先跑小样例,确认结果可检查后再扩大任务范围。
## 输出要求
- 给出最终产物、关键证据、验证方式和下一步动作。
- 信息不足时标记 unknown,不编造命令、平台或依赖。 作者原文负责流程事实;仓库文件负责来源和命令;流狐只补充适用场景、限制和质量判断。
skill "openlore-write-tests" {
输入层 -> 用户目标 + 目标文件 + 禁止范围 + 验收标准
上下文层 -> When to use this skill / Step 1 — Identify target + detect framework / Step 2 — Orient
规则层 -> SKILL.md 触发条件 / 执行顺序 / 输出格式
运行层 -> Python | 读取文件、写入/修改文件、执行终端命令 | 主要在本地完成
安全层 -> 通常不需要额外 API Key + 小任务验证 + diff / 日志复核
输出层 -> 可复制结果 + 检查清单 + 下一步迭代
} openlore: Write Tests
When to use this skill
Trigger this skill when the user wants to write real tests for a function, module, or spec scenario, with phrasings like:
- "write tests for X"
- "add test coverage for Y"
- "what spec scenarios are untested?"
- "implement the test for this scenario"
- explicit command
/openlore-write-tests
The rule: read the implementation and spec contract before writing a single assertion.
No expect(true).toBe(true), no stubs, no placeholders.
Prerequisite: openlore analysis must exist (openlore analyze has been run).
If orient returns "error": "no cache" → run openlore analyze first, then retry.
Step 1 — Identify target + detect framework
Ask the user:
- Target — a function name, file path, spec scenario, or domain to test. If unsure, skip to Step 1b.
$PROJECT_ROOT— project root directory.
Step 1b — Find untested scenarios (if no target given)
Call the openlore MCP tool get_test_coverage with {"directory": "$PROJECT_ROOT"}.
Present the top 5 uncovered scenarios to the user, ranked by spec importance. Ask which to implement first.
Step 1c — Detect test framework
Scan the project root for framework config files:
| File found | Framework |
|---|---|
vitest.config.*, vitest.config.ts |
Vitest — runner: npx vitest run <file> |
jest.config.* |
Jest — runner: npx jest <file> |
pytest.ini, pyproject.toml (with [tool.pytest]), setup.cfg |
pytest — runner: pytest <file> -v |
CMakeLists.txt with enable_testing(), *.test.cpp |
CTest/GTest — runner: build + ctest |
go.mod |
Go test — runner: go test ./... |
Store as $TEST_RUNNER. If ambiguous, ask the user.
Step 2 — Orient
Call the openlore MCP tool orient with:
{
"directory": "$PROJECT_ROOT",
"task": "write tests for $TARGET",
"limit": 5
}
Extract:
$TARGET_FILE— the file containing the function(s) to test$EXISTING_TEST_FILE— nearby test file, if any (e.g.foo.test.ts,test_foo.py,foo_test.go)$SPEC_DOMAIN— the spec domain associated with the target
Step 3 — Read implementation + spec contract
This step is mandatory. Do not write any test before completing it.
3a — Read the function body
Call the openlore MCP tool get_function_body with:
{
"directory": "$PROJECT_ROOT",
"symbol": "$TARGET_FUNCTION",
"filePath": "$TARGET_FILE"
}
Identify:
- What the function takes as input, what it returns
- What external dependencies it calls (filesystem, network, DB, LLM, subprocess)
- What invariants are visible (guards, throws, early returns)
3b — Find the spec contract (if specs exist)
Call the openlore MCP tool search_specs with:
{
"directory": "$PROJECT_ROOT",
"query": "$TARGET — expected behaviour",
"limit": 5
}
For each matching spec scenario, note:
- The GIVEN / WHEN / THEN clauses — these become the test body
- The scenario name — this becomes the
it()/def test_/TEST()description
If no specs exist, infer the contract from the function signature, docstring, and call sites. Document the inferred contract explicitly before writing any test.
3c — Absorb local test conventions
If $EXISTING_TEST_FILE exists, read it. Extract:
- Mock setup pattern (
vi.mock,unittest.mock.patch,gmock, etc.) - Fixture or factory helpers
- Import path style (relative vs absolute)
- Describe/class/suite structure
If no test file exists nearby, find the closest test file in the project tree and read that instead.
Step 4 — Write tests
Write (or append to) $EXISTING_TEST_FILE (or create <name>.test.ts / test_<name>.py / <name>_test.go next to the source file).
Rules — enforced without exception
No placeholder assertions —
expect(true).toBe(true),assert True,EXPECT_TRUE(true),self.assertTrue(True)are forbidden. Every assertion must test real return values or side effects.One test = one scenario — each
it()/def test_/TEST()maps to one GIVEN/WHEN/THEN clause. Use the spec scenario name (or a descriptive contract statement) as the test description.Annotation tag (mandatory) — place a coverage tag on the line immediately above each
describe/ class / suite block soopenlore test --coveragecan track it:- TypeScript/JS:
// openlore: {"domain":"$DOMAIN","requirement":"$REQ","scenario":"$SCENARIO","specFile":"openspec/specs/$DOMAIN/spec.md"} - Python:
# openlore: {"domain":"$DOMAIN","requirement":"$REQ","scenario":"$SCENARIO"} - C++/Go:
// openlore: {"domain":"$DOMAIN","requirement":"$REQ","scenario":"$SCENARIO"}
If no spec scenario exists (contract inferred), omit the tag.
- TypeScript/JS:
Mock only system boundaries — mock filesystem, network, LLM API, DB connections, and external processes. Do not mock the function under test, its pure helpers, or in-memory logic.
One suite per function —
describe/ class / suite named after the function. Use nested blocks for distinct concerns (happy path, error path, edge cases).At least one edge case — empty input, null/None/nullptr, maximum value, or an error path must be included for every function tested.
Small model constraint — if the test file exceeds 200 lines, split into multiple files grouped by concern. Each file must be independently runnable.
Structure reference (adapt to the detected framework)
// TypeScript / Vitest
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { $TARGET_FUNCTION } from '../$TARGET_FILE';
vi.mock('../$DEPENDENCY', () => ({ ... }));
// openlore: {"domain":"$DOMAIN","requirement":"$REQUIREMENT","scenario":"$SCENARIO","specFile":"openspec/specs/$DOMAIN/spec.md"}
describe('$TARGET_FUNCTION', () => {
beforeEach(() => { vi.resetAllMocks(); });
describe('$SCENARIO_NAME', () => {
it('should $EXPECTED_BEHAVIOUR when $CONDITION', () => {
// GIVEN
// WHEN
const result = $TARGET_FUNCTION($INPUT);
// THEN
expect(result).toEqual($EXPECTED);
});
});
});
# Python / pytest
import pytest
from unittest.mock import patch, MagicMock
from $MODULE import $TARGET_FUNCTION
# openlore: {"domain":"$DOMAIN","requirement":"$REQUIREMENT","scenario":"$SCENARIO"}
class Test$TargetFunction:
def test_$scenario_name_when_$condition(self):
# GIVEN / WHEN / THEN
result = $target_function($input)
assert result == $expected
Step 5 — Run and fix
Run the test file with $TEST_RUNNER. Iterate until all tests pass.
| Outcome | Action |
|---|---|
| All green | Proceed to Step 6 |
| Failure in new test | Diagnose: is the assertion wrong, or is there a real bug? Fix the assertion if the expectation was incorrect. If a real bug is revealed, do not weaken the assertion — report the bug instead. |
| Failure in pre-existing test | Stop. Fix the regression before adding more tests. |
| Test can't compile / import | Fix the import path, mock setup, or dependency injection before retrying. |
Do not weaken assertions to make tests pass. A test that masks a bug is worse than no test.
Step 6 — Coverage check
Call the openlore MCP tool get_test_coverage with {"directory": "$PROJECT_ROOT"}.
Report:
- Which spec scenarios are now covered (new)
- Which scenarios remain uncovered in
$SPEC_DOMAIN - Whether any hub functions in
$SPEC_DOMAINare still untested (high-value next targets)
Absolute constraints
- Never write
expect(true).toBe(true),assert True, or equivalent placeholder assertions - Never skip Step 3 — the implementation read and spec contract are the test source of truth
- Never mock the function under test itself
- Never weaken an assertion to make a test pass — fix the implementation or the expectation
- If
get_test_coverageshows the scenario is already covered, report it and stop - Do not refactor the implementation as part of this skill — open a separate task
Source: clay-good/OpenLore — distributed by TomeVault.
先判断是否适合
作者设计意图
作者的方法与取舍
边界和复核