Bull's blog Bull's blog
Resume
  • MBTI 人格测评
  • SBTI 沙雕人格测评
  • AI 人格测评
  • 工具首页
  • 测试工具箱
  • 测试文件下载中心
  • 图片测试文件下载
  • 音频测试文件下载
  • 视频测试文件下载
  • 文档测试文件下载
  • 拼音听写纸
  • 英语单词日课
  • 纸笔游戏
  • AI 播客生成器
  • AI 音乐生成器
  • 晨起习惯清单
  • 书包收拾挑战
  • 工作笔记
  • 分类
  • 标签
  • 归档
  • zh-CN
  • en-US
  • ja-JP

Bull

Resume
  • MBTI 人格测评
  • SBTI 沙雕人格测评
  • AI 人格测评
  • 工具首页
  • 测试工具箱
  • 测试文件下载中心
  • 图片测试文件下载
  • 音频测试文件下载
  • 视频测试文件下载
  • 文档测试文件下载
  • 拼音听写纸
  • 英语单词日课
  • 纸笔游戏
  • AI 播客生成器
  • AI 音乐生成器
  • 晨起习惯清单
  • 书包收拾挑战
  • 工作笔记
  • 分类
  • 标签
  • 归档
  • zh-CN
  • en-US
  • ja-JP
  • superpowers
  • plans
wangyang
2026-08-25
目录

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.js

  • Test: 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')
1
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"
1
2

# Task 2: 实现结构化技能栈和独立生成入口

Files:

  • Modify: docs/.vuepress/components/resume/qaResumePdfData.json

  • Modify: scripts/generate_resume_pdfs.py

  • Test: 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": "持续集成、测试环境与内网交付、日志追溯、上下游和设备适配协作"
  }
]
1
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
1
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"
1
2

# Task 3: 视觉验收与回归

Files:

  • Modify if needed: scripts/generate_resume_pdfs.py

  • Test: scripts/test_qa_resume_tech_stack_variant.js

  • Test: scripts/test_fde_resume_pdf.js

  • Test: scripts/test_resume_profile_consistency.js

  • Test: 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
1
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'
1
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"
1
上次更新: 2026/08/25, 09:02:47
最近更新
01
asr-translation-accuracy-benchmark
08-25
02
resume-fde
08-25
03
case-d-specimen-automation
08-25
更多文章>
Theme by Vdoing | Copyright © 2018-2026 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式