بنقرة واحدة
write-tests
编写新测试文件或为现有模块补充测试时使用,覆盖命名约定、速度要求、Mock 模式与断言规范。关键词:测试编写、单元测试、pytest、MockProvider、测试速度、精准测试。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
编写新测试文件或为现有模块补充测试时使用,覆盖命名约定、速度要求、Mock 模式与断言规范。关键词:测试编写、单元测试、pytest、MockProvider、测试速度、精准测试。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
在发布commit前执行检查清单,包括gitignore验证、改动总结、ChangeLog更新与标准格式commit。关键词:commit前检查、gitignore、ChangeLog、commit格式、版本管理。
当需要让外部项目正确接入 Sirius Pulse 时使用,覆盖 Python API 调用、CLI 调用、配置组织和安全实践。关键词:外部接入、库调用、CLI 集成、provider 配置。
遍历项目结构变化并同步更新文档。监控模块变化、配置更新,生成检查清单以确保 SKILL、文档、示例和架构信息的实时一致性。关键词:项目结构、模块映射、文档同步、变更追踪、完整性检查。
使用此技能在发布新版本到 PyPI 时执行完整的发布流程。涵盖版本更新、构建验证、tag 推送和 GitHub Actions 自动化。关键词:PyPI 发布、版本控制、自动化构建、Trusted Publishing。
在为 Sirius Pulse 做发布准备时使用,用于校验版本信息、命令可运行性、文档准确性与技能同步状态。关键词:发布准备、发布前检查、文档同步、命令校验。
当修改 Sirius Pulse 代码后,强制同步代码与文档、SKILL、示例的一致性。涵盖架构变更、接口变更、配置变更的全量检查清单与项目结构地图。关键词:代码同步、文档联动、变更追踪、检查清单、项目结构。
| name | write-tests |
| description | 编写新测试文件或为现有模块补充测试时使用,覆盖命名约定、速度要求、Mock 模式与断言规范。关键词:测试编写、单元测试、pytest、MockProvider、测试速度、精准测试。 |
为 Sirius Pulse 编写正确、快速、可维护的 pytest 测试。测试必须从业务侧出发,依照业务逻辑和用户实际使用路径设计,优先验证用户输入、公开入口、系统处理与可观察结果之间的闭环。所有测试必须满足四个核心要求:
测试用例应先回答“用户如何使用这个能力”,再决定调用哪个入口和断言什么结果。优先从公开 API、引擎入口、CLI/配置入口、WebUI API、持久化结果等用户可触达路径验证行为。
# 禁止:在测试中手动睡眠
import asyncio
await asyncio.sleep(8) # 等同于浪费 8 秒
time.sleep(3)
# 禁止:启动耗时后台任务(除非测试的正是该任务)
engine.start_background_tasks()
# 后台任务会触发日记生成等 LLM 调用
engine = EmotionalGroupChatEngine(
work_path=tmp_path,
persona=PersonaProfile(name="TestBot"),
config={
"sensitivity": 0.0, # ← 降低回复概率,减少不必要的 LLM 调用
},
)
from sirius_pulse.core.emotional_engine import EmotionalGroupChatEngine
from sirius_pulse.models.persona import PersonaProfile
from sirius_pulse.models.models import Message, Participant
from sirius_pulse.providers.mock import MockProvider
provider = MockProvider(
responses=[
"第一条回复",
"第二条回复",
]
)
engine = EmotionalGroupChatEngine(
work_path=tmp_path,
persona=PersonaProfile(name="TestBot"),
provider_async=provider,
)
MockProvider 按序返回 responses,用完后循环最后一条。可通过 provider.requests 检查引擎向 LLM 发出的所有请求。
@pytest.mark.asyncio
async def test_process_message_replies_to_greeting(tmp_path):
provider = MockProvider(responses=["你好呀!"])
engine = EmotionalGroupChatEngine(
work_path=tmp_path,
persona=PersonaProfile(name="TestBot"),
provider_async=provider,
)
participant = Participant(name="u1", user_id="u1")
msg = Message(role="human", content="大家好", speaker="u1")
reply = await engine.process_message(msg, [participant], "group_a")
assert reply is not None
assert "你好" in reply.content
所有涉及引擎的测试必须使用 pytest.mark.asyncio:
import pytest
@pytest.mark.asyncio
async def test_something(tmp_path):
engine = EmotionalGroupChatEngine(work_path=tmp_path, ...)
...
非异步逻辑(纯数据模型、工具函数)可用普通 def。
| 场景 | 推荐写法 | 不推荐 |
|---|---|---|
| 验证回复内容 | assert "关键词" in reply.content | 完整字符串匹配(易因微调而失败) |
| 验证事件类型 | assert SessionEventType.X in types | 仅验证事件数量 |
| 验证记忆写入 | assert len(manager.entries) == 1 | 隐式依赖其他测试的数据 |
| 验证异常 | pytest.raises(ValueError, match="...") | try/except + assert False |
断言应优先落在业务结果上,例如回复内容、事件类型、记忆可检索性、配置生效结果、错误提示和持久化文件内容。只有当调用次数、内部字段或中间结构本身是业务契约时,才应直接断言这些实现细节。
测试文件应按被测模块命名:
| 被测模块 | 测试文件 |
|---|---|
memory/basic/manager.py | tests/test_basic_memory.py |
memory/diary/manager.py | tests/test_diary_memory.py |
memory/context_assembler.py | tests/test_context_assembler.py |
core/emotional_engine.py | tests/test_engine_event_stream.py |
core/prompt_factory.py | tests/test_response_assembler.py |
from sirius_pulse.providers.mock import MockProvider
provider = MockProvider(responses=["reply1", "reply2"])
# 第 3 次调用会循环回到 "reply1"
# 检查请求内容
assert len(provider.requests) == 2
assert "system" in provider.requests[0]["messages"][0]["role"]
from unittest.mock import patch
with patch("sirius_pulse.memory.diary.generator.DiaryGenerator.generate") as mock_gen:
mock_gen.return_value = DiaryEntry(...)
# 执行被测代码...
"""Tests for BasicMemoryManager heat tracking."""
from __future__ import annotations
import pytest
from sirius_pulse.memory.basic.manager import BasicMemoryManager
class TestBasicMemoryHeat:
def test_new_group_has_zero_heat(self):
mgr = BasicMemoryManager()
assert mgr.compute_heat("g1") == 0.0
def test_heat_increases_after_messages(self):
mgr = BasicMemoryManager()
for i in range(5):
mgr.add_entry("g1", f"u{i}", "user", f"msg{i}")
assert mgr.compute_heat("g1") > 0.0