2026-08-25-测试简历技术栈增强对比版实施计划
# 测试简历技术栈增强对比版实施计划
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 新增一份 A4 两页测试岗位技术栈增强对比版 PDF,把核心能力与技术栈合并为第一页首个模块,同时保证当前正式 PDF、在线页面和履历事实不变。
Architecture: 在现有 qaResumePdfData.json 增加一份小型增强技术栈配置,避免复制完整履历。现有 ReportLab 生成器通过显式 CLI 参数只生成对比版,并复用测试简历的其他内容;增强版用四行面板替换第一页原“核心能力”,并跳过第二页原“技能栈”。独立契约测试负责执行生成、验证当前 PDF 哈希不变、检查两页 A4、内容位置与关键文字。
Tech Stack: Python 3、ReportLab、pypdf、pdfinfo、Node.js 20、PNG 渲染检查
# Task 1: 定义对比版生成契约
Files:
Create:
scripts/test_qa_resume_tech_stack_variant.jsTest:
scripts/test_qa_resume_tech_stack_variant.js[ ] Step 1: 写失败测试
测试读取当前正式 PDF 哈希,执行显式生成参数,断言正式文件未变化,并检查新增 PDF 的页数、尺寸、四个分组和事实边界:
const assert = require('assert')
const crypto = require('crypto')
const fs = require('fs')
const path = require('path')
const { execFileSync } = require('child_process')
const root = path.resolve(__dirname, '..')
const official = path.join(root, 'docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdf')
const variant = path.join(root, 'docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026_技术栈增强对比版.pdf')
const digest = file => crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex')
const before = digest(official)
execFileSync('uv', [
'run', '--with', 'reportlab', '--with', 'pypdf', 'python',
path.join(root, 'scripts/generate_resume_pdfs.py'), '--qa-tech-stack-variant'
])
assert.strictEqual(digest(official), before)
assert.ok(fs.existsSync(variant))
const info = execFileSync('pdfinfo', [variant], { encoding: 'utf8' })
assert.match(info, /Pages:\s+2\b/)
assert.match(info, /Page size:\s+595(?:\.\d+)? x 841(?:\.\d+)? pts \(A4\)/)
const extract = [
'import sys',
'from pypdf import PdfReader',
'print("\\n".join((p.extract_text() or "") for p in PdfReader(sys.argv[1]).pages))'
].join('; ')
const text = execFileSync('uv', ['run', '--quiet', '--with', 'pypdf', 'python', '-c', extract, variant], { encoding: 'utf8' })
for (const label of ['AI 质量与测试设计', '自动化与协议测试', '性能与数据质量', '工程化与交付']) {
assert.ok(text.includes(label), `missing skill group: ${label}`)
}
for (const term of ['Pytest', 'Playwright', 'WebSocket', 'Locust', 'Jenkins', 'GitLab CI', 'FastAPI']) {
assert.ok(text.includes(term), `missing skill term: ${term}`)
}
assert.doesNotMatch(text, /精通|正式FDE|生产验收完成|固定人效倍数/)
const extractPages = [
'import json, sys',
'from pypdf import PdfReader',
'print(json.dumps([(p.extract_text() or "") for p in PdfReader(sys.argv[1]).pages], ensure_ascii=False))'
].join('; ')
const pages = JSON.parse(execFileSync('uv', ['run', '--quiet', '--with', 'pypdf', 'python', '-c', extractPages, variant], { encoding: 'utf8' }))
assert.ok(pages[0].includes('核心能力与技术栈'))
assert.ok(pages[0].indexOf('核心能力与技术栈') < pages[0].indexOf('近期 AI Coding 实践'))
assert.doesNotMatch(pages[1], /技能栈/)
console.log('QA tech stack comparison PDF contract passed')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
- [ ] Step 2: 运行测试确认失败
Run: /Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_qa_resume_tech_stack_variant.js
Expected: FAIL,因为 --qa-tech-stack-variant 尚未实现或对比版文件尚未生成。
- [ ] Step 3: 提交失败契约
git add scripts/test_qa_resume_tech_stack_variant.js
git commit -m "test: define QA tech stack comparison PDF"
2
# Task 2: 实现结构化技能栈和独立生成入口
Files:
Modify:
docs/.vuepress/components/resume/qaResumePdfData.jsonModify:
scripts/generate_resume_pdfs.pyTest:
scripts/test_qa_resume_tech_stack_variant.js[ ] Step 1: 增加四层技能配置
在 qaResumePdfData.json 根对象加入:
"techStackVariant": [
{
"label": "AI 质量与测试设计",
"tools": "AI 应用测试、Agent 执行、Prompt/输入约束、Human-in-the-loop、ASR/LLM 评测;Claude Code、Codex、OpenClaw",
"scope": "测试资产结构化、用例设计与执行、结果复核、模型效果与异常边界评测"
},
{
"label": "自动化与协议测试",
"tools": "Python、Pytest、Playwright、Robot Framework、Selenium、Appium;HTTP、WebSocket、Mock、契约测试",
"scope": "接口、Web/UI、移动端及复杂集成链路的自动化回归与问题定位"
},
{
"label": "性能与数据质量",
"tools": "Locust、JMeter、MySQL、Redis、SQLite;吞吐、首包/首块、实时率、P95、容量与数据巡检",
"scope": "性能容量分析、数据准确性验证、异常分类及自动巡检告警"
},
{
"label": "工程化与交付",
"tools": "Jenkins、GitLab CI、Docker、Git;Vue 3、FastAPI、RabbitMQ 全栈协作实践",
"scope": "持续集成、测试环境与内网交付、日志追溯、上下游和设备适配协作"
}
]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- [ ] Step 2: 增加紧凑技能面板和可选数据入口
在 generate_resume_pdfs.py 增加对比版输出常量、argparse 参数、四行紧凑面板,并让 build_qa_story 接收可选增强技能:
QA_TECH_STACK_OUTPUT_PATH = ROOT / "docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026_技术栈增强对比版.pdf"
def detailed_skill_panel(groups: list[dict], styles: dict[str, ParagraphStyle]) -> Table:
rows = [[
paragraph(f"<b>{group['label']}</b>", styles["tag"]),
paragraph(f"<b>工具/方法:</b>{group['tools']}<br/><b>适用场景:</b>{group['scope']}", styles["small"]),
] for group in groups]
table = Table(rows, colWidths=[37 * mm, 140 * mm], hAlign="LEFT")
table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), PANEL),
("TEXTCOLOR", (0, 0), (0, -1), ACCENT),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
("TOPPADDING", (0, 0), (-1, -1), 3.5),
("BOTTOMPADDING", (0, 0), (-1, -1), 3.5),
("LINEBELOW", (0, 0), (-1, -2), 0.35, LINE),
("BOX", (0, 0), (-1, -1), 0.5, LINE),
]))
return table
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
build_qa_story 根据 enhanced_skills 选择首个模块:增强版在摘要后输出 section_title("核心能力与技术栈", styles) 和 detailed_skill_panel;普通版继续输出原“核心能力”三行面板。函数末尾只在 enhanced_skills is None 时追加原“技能栈”。main 在收到 --qa-tech-stack-variant 时只构建对比版并立即返回;默认无参数行为仍生成原 FDE 与 QA 文件。
- [ ] Step 3: 运行契约测试确认通过
Run: /Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_qa_resume_tech_stack_variant.js
Expected: QA tech stack comparison PDF contract passed。
- [ ] Step 4: 提交实现
git add docs/.vuepress/components/resume/qaResumePdfData.json scripts/generate_resume_pdfs.py docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026_技术栈增强对比版.pdf
git commit -m "feat: add QA tech stack comparison PDF"
2
# Task 3: 视觉验收与回归
Files:
Modify if needed:
scripts/generate_resume_pdfs.pyTest:
scripts/test_qa_resume_tech_stack_variant.jsTest:
scripts/test_fde_resume_pdf.jsTest:
scripts/test_resume_profile_consistency.jsTest:
scripts/test_llm_wiki.js[ ] Step 1: 渲染两页 PNG
Run:
mkdir -p tmp/pdfs/qa-tech-stack-variant
pdftoppm -png -r 150 docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026_技术栈增强对比版.pdf tmp/pdfs/qa-tech-stack-variant/page
2
Expected: 生成 page-1.png 和 page-2.png,没有第三页。
- [ ] Step 2: 逐页检查版面
使用图像查看工具检查两页,要求没有截断、重叠、黑块、异常字符或过小正文;第一页四行“核心能力与技术栈”面板完整并位于近期项目之前,第二页没有重复技能栈,页脚保持在安全区内。如果失败,只缩短重复措辞或调整技能面板的局部间距,然后重生成和重渲染。
- [ ] Step 3: 执行回归测试
Run:
/Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_qa_resume_tech_stack_variant.js
/Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_fde_resume_pdf.js
/Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_resume_profile_consistency.js
/Users/ywang/.nvm/versions/node/v20.20.2/bin/node scripts/test_llm_wiki.js
git diff --check -- . ':(exclude)utils/config.yml'
2
3
4
5
Expected: 四个脚本均通过,git diff --check 无输出。
- [ ] Step 4: 清理临时渲染文件并提交必要修正
删除 tmp/pdfs/qa-tech-stack-variant/ 中的 PNG;如果视觉验收产生代码修正,精确暂存生成器、数据、测试和最终 PDF,提交:
git commit -m "fix: refine QA comparison PDF layout"