一键导入
e2e-test-design
E2E 测试设计指南,包含双重验证机制(协议验证 + 文档内容验证)
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
E2E 测试设计指南,包含双重验证机制(协议验证 + 文档内容验证)
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
执行 Office4AI MCP Server 验收测试 —— Phase 1 注册验收(tools/resources/收敛) + Phase 2 功能验收(manual_test E2E)
Edit an existing Word / PowerPoint / Excel file — especially template operations (fill {{placeholders}} and SDT content controls, reuse slide masters, change spreadsheet data while preserving charts) — by submitting a short Python script to the office4ai `office_run_script` tool. Works with no Office Add-In connection. Use when the user asks to fill a template, update a report/deck/workbook, replace placeholders, or edit a .docx / .pptx / .xlsx while keeping its styling intact.
Extract a reusable template from a reference Word / PowerPoint / Excel file — turn concrete values into placeholders — by submitting a short Python script to the office4ai `office_run_script` tool. Word headings become named SDT content controls, concrete text becomes {{tokens}} for docxtpl, a designed slide becomes a reusable master layout, an Excel named range becomes a blanked template region. Works with no Office Add-In connection. Use when the user has a finished/reference document but no template, and wants to reuse its structure/branding to generate more files.
Create Word / PowerPoint / Excel files from scratch or from a reusable template by submitting a short Python script to the office4ai `office_run_script` tool. Works with no Office Add-In connection. Use when the user asks to generate a .docx / .pptx / .xlsx, produce a report / deck / workbook, or instantiate a corporate template.
Demo authoring SKILL fixture — exercises the skill:// resources source mode (root + scripts + references + binary asset). Triggers in S3 producer tests only.
以架构师视角审查代码变更,关注模块边界、DTO 规范、测试完整性和长期可维护性。 当需要审查 PR、工作区变更或提交代码时使用。
| name | e2e-test-design |
| description | E2E 测试设计指南,包含双重验证机制(协议验证 + 文档内容验证) |
| usage | 设计 E2E 测试时参考此指南,特别是涉及文档内容修改的测试。 区分只读事件和修改事件,选择合适的验证策略。 |
E2E 测试支持两种验证模式:
协议验证 (DataValidator) → 验证服务端返回的 data 结构和值
文档验证 (ContentValidator) → 通过 python-docx 验证实际文档内容
success: true,但文档未被正确修改这些事件(包括但不限于)不修改文档,只需验证协议返回:
| 事件 | 说明 |
|---|---|
word:get:documentStats | 获取文档统计 |
word:get:documentStructure | 获取文档结构 |
word:get:selectedContent | 获取选中内容 |
word:get:styles | 获取样式列表 |
验证策略:
validator=lambda data: data.get("wordCount", 0) > 0
这些事件(包括但不限于)会修改文档,应使用双重验证:
| 事件 | 说明 |
|---|---|
word:insert:text | 插入文本 |
word:replace:selection | 替换选中内容 |
word:insert:table | 插入表格 |
word:set:style | 设置样式 |
验证策略:
validator=lambda data, reader: (
data.get("success", False) and
reader.contains("预期插入的文本")
)
from manual_tests.e2e_base import (
DataValidator, # Callable[[dict[str, Any]], bool]
ContentValidator, # Callable[[dict[str, Any], DocumentReader], bool]
Validator, # DataValidator | ContentValidator
DocumentReader, # 文档内容读取器
)
@dataclass
class DocumentReader:
path: Path
@property
def doc(self) -> Document:
"""懒加载 python-docx Document 对象"""
@property
def paragraphs(self) -> list[str]:
"""获取所有段落文本"""
@property
def text(self) -> str:
"""获取全文文本(段落用换行连接)"""
@property
def table_count(self) -> int:
"""获取表格数量"""
def reload(self) -> None:
"""重新加载文档(修改后调用)"""
def contains(self, text: str) -> bool:
"""检查文档是否包含指定文本"""
def paragraph_contains(self, index: int, text: str) -> bool:
"""检查指定段落是否包含文本"""
def get_paragraph(self, index: int) -> str | None:
"""获取指定段落的文本"""
TestCase(
name="空白文档统计",
fixture_name="empty.docx",
description="空白文档应有 0 字",
expected=ExpectedStats(word_count=0),
# 传统验证器:仅检查协议返回
validator=lambda data: data.get("wordCount", 0) == 0,
)
TestCase(
name="插入文本测试",
fixture_name="empty.docx",
description="向空白文档插入 'Hello World'",
# 双重验证器:检查协议返回 + 文档内容
validator=lambda data, reader: (
# 协议验证
data.get("success", False) and
# 文档内容验证
reader.contains("Hello World")
),
)
def validate_table_insert(data: dict, reader: DocumentReader) -> bool:
"""验证表格插入"""
# 重新加载以获取最新内容
reader.reload()
# 协议验证
if not data.get("success", False):
return False
# 文档验证:检查表格数量
if reader.table_count < 1:
return False
# 检查表格内容
table = reader.doc.tables[0]
return table.rows[0].cells[0].text == "预期内容"
TestCase(
name="插入表格测试",
fixture_name="empty.docx",
validator=validate_table_insert,
)
只读事件 → DataValidator(简单 lambda)
修改事件 → ContentValidator(双重验证)
def my_validator(data, reader):
# 1. 先验证协议返回
if not data.get("success"):
return False
# 2. 再验证文档内容
reader.reload() # 确保获取最新内容
return reader.contains("预期内容")
某些修改可能需要时间生效,必要时添加等待:
import asyncio
async def test_with_delay():
result = await workspace.execute(action)
await asyncio.sleep(0.5) # 等待文档保存
reader = DocumentReader(fixture.working_path)
assert reader.contains("预期内容")
from dataclasses import dataclass, field
from typing import Any
from manual_tests.e2e_base import ExpectedStats, Validator
@dataclass
class TestCase:
name: str
fixture_name: str
description: str
expected: ExpectedStats | None = None
validator: Validator | None = None # DataValidator | ContentValidator
tags: list[str] = field(default_factory=list)
| 文件 | 说明 |
|---|---|
manual_tests/e2e_base.py | DocumentReader、Validator 类型定义 |
manual_tests/get_document_structure_e2e/ | 只读事件测试示例 |
manual_tests/get_document_stats_e2e/ | 只读事件测试示例 |
# 类型检查
poe typecheck
# 运行 E2E 测试
uv run python manual_tests/get_document_structure_e2e/test_basic_structure.py --test all
最后更新: 2026-02-04