بنقرة واحدة
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