LingFlow v3.3.0 质量控制框架
版本: v3.3.0 日期: 2026-03-23 目的: 为所有工作流程建立严格的质量标准和检查机制
📋 目录
质量控制总览
质量控制维度矩阵
| 工作流程 | 质量维度 | 检查项 | 评分标准 |
|---|---|---|---|
| 工作流编排 | 6个维度 | 30+项 | 5级评分 |
| 代码优化 | 7个维度 | 35+项 | 5级评分 |
| 测试执行 | 5个维度 | 25+项 | 5级评分 |
| 文档生成 | 6个维度 | 30+项 | 5级评分 |
质量标准原则
- 零容忍: 版本号错误、过时信息、缺失关键字段
- 一致性: 所有文档使用统一的格式、版本、命名
- 完整性: 每个维度必须覆盖所有检查项
- 可验证: 所有检查项必须可自动或手动验证
- 持续改进: 基于实际使用反馈不断优化标准
工作流编排质量标准
维度1: 任务定义质量 (Task Definition Quality)
检查项
TD1.1 任务ID唯一性
- ✅ 每个任务必须有唯一的task_id
- ✅ task_id格式: [module]-[action]-[number]
- ✅ 无重复task_id
示例:
# ❌ 错误
task_id = "task-1"
task_id = "task-1" # 重复
# ✅ 正确
task_id = "auth-login-001"
task_id = "auth-register-002"
TD1.2 任务描述完整性 - ✅ description字段不为空 - ✅ description说明"做什么",而非"怎么做" - ✅ description在10-200字符之间
示例:
TD1.3 任务优先级合理性 - ✅ 必须明确指定TaskPriority - ✅ CRITICAL任务占比 < 10% - ✅ CRITICAL/HIGH任务不超过30%
示例:
# ❌ 错误
priority = TaskPriority.NORMAL # 默认值,未明确指定
# ✅ 正确
priority = TaskPriority.CRITICAL # 明确指定核心任务
priority = TaskPriority.HIGH # 明确指定重要任务
TD1.4 代理类型匹配 - ✅ agent_type必须在预定义的6种中 - ✅ agent_type与任务类型匹配 - ✅ 代理能力覆盖任务需求
示例:
# ❌ 错误
agent_type = "my_custom_agent" # 不存在的代理类型
agent_type = "implementation" # 任务是代码审查,不匹配
# ✅ 正确
agent_type = "review" # 审查任务使用review代理
agent_type = "implementation" # 实现任务使用implementation代理
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 所有检查项完美通过 |
| ⭐⭐⭐⭐ | ≥90% | 1-2个次要问题 |
| ⭐⭐⭐ | ≥75% | 3-5个问题 |
| ⭐⭐ | ≥50% | 多个严重问题 |
| ⭐ | <50% | 任务定义质量极差 |
维度2: 依赖关系质量 (Dependency Quality)
检查项
DQ2.1 依赖完整性 - ✅ 所有依赖任务已在工作流中定义 - ✅ 无循环依赖 (A→B→C→A) - ✅ 无自引用依赖 (A→A)
示例:
# ❌ 错误
dependencies=["non-existent-task"] # 依赖不存在的任务
dependencies=["task-1", "task-2", "task-1"] # task-2→task-1→task-1 (自引用)
dependencies=["task-1", "task-2", "task-3"] # task-1→task-2→task-3→task-1 (循环)
# ✅ 正确
dependencies=["setup"] # 依赖已定义的setup任务
dependencies = [] # 无依赖的起始任务
DQ2.2 依赖合理性 - ✅ 依赖关系符合业务逻辑 - ✅ 避免过度依赖 (一个任务依赖>5个任务) - ✅ 最小化依赖 (只依赖必须的前置任务)
示例:
# ❌ 错误
dependencies = ["task1", "task2", "task3", "task4", "task5", "task6"] # 过度依赖
# ✅ 正确
dependencies = ["setup"] # 最小依赖,逻辑合理
DQ2.3 依赖解析成功率 - ✅ 工作流编排器能成功解析所有依赖 - ✅ 无无法满足的依赖 - ✅ 依赖解析在100次迭代内完成
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 无任何依赖问题 |
| ⭐⭐⭐⭐ | ≥90% | 1-2个次要依赖问题 |
| ⭐⭐⭐ | ≥75% | 存在过度依赖 |
| ⭐⭐ | ≥50% | 存在循环依赖 |
| ⭐ | <50% | 依赖关系混乱 |
维度3: 并行执行安全性 (Parallel Execution Safety)
检查项
PQ3.1 并行安全检查 - ✅ parallel_safe=false的任务不在并行组中 - ✅ debugging任务单独执行 - ✅ 共享资源的任务串行执行
示例:
# ❌ 错误
tasks = [
Task("debug-1", "Debug issue 1", agent_type="debugging"),
Task("debug-2", "Debug issue 2", agent_type="debugging")
]
# 两个debugging任务并行执行 (unsafe)
# ✅ 正确
results = await coordinator.execute_tasks_parallel(tasks, max_parallel=1)
# 串行执行
# 或分开执行
result1 = await coordinator.execute_task(task1)
result2 = await coordinator.execute_task(task2)
PQ3.2 资源冲突检测 - ✅ 无文件写冲突 - ✅ 无数据库连接池竞争 - ✅ 无共享内存冲突
示例:
# ❌ 错误
Task("write-config", "Write config", context={"file": "config.json"})
Task("write-config2", "Write config", context={"file": "config.json"})
# 两个任务同时写config.json
# ✅ 正确
Task("write-config", "Write config", context={"file": "config.json"})
Task("read-config", "Read config", context={"file": "config.json"})
# 写和读可以并行(使用锁)
PQ3.3 并行度合理性 - ✅ max_parallel不超过系统CPU核心数 - ✅ max_parallel不超过代理的max_tasks限制 - ✅ 并行任务数量合理 (2-5个)
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 完全安全的并行执行 |
| ⭐⭐⭐⭐ | ≥90% | 1-2个轻微资源冲突 |
| ⭐⭐⭐ | ≥75% | 存在资源竞争风险 |
| ⭐⭐ | ≥50% | 并行安全问题严重 |
| ⭐ | <50% | 并行执行极度危险 |
维度4: 上下文质量 (Context Quality)
检查项
CQ4.1 上下文相关性 - ✅ context字段与任务高度相关 - ✅ 无无关信息 - ✅ context大小合理 (< 10KB)
示例:
# ❌ 错误
context = {
"task": "login",
"irrelevant_data": "大量无关数据...",
"debug_info": "调试信息..."
} # 包含无关信息,体积大
# ✅ 正确
context = {
"module": "authentication",
"endpoint": "/api/login",
"method": "POST"
} # 相关且精简
CQ4.2 上下文压缩效果 - ✅ 压缩后上下文 < 4000 tokens - ✅ 压缩率 > 30% - ✅ 关键信息保留率 > 95%
示例:
# 检查压缩效果
compressed = coordinator.compressor.compress(original_context)
assert estimate_tokens(compressed) < 4000, "上下文过大"
assert estimate_tokens(compressed) / estimate_tokens(original_context) < 0.7, "压缩率不足"
CQ4.3 上下文一致性 - ✅ context字段命名一致 (snake_case) - ✅ context结构一致 - ✅ 无重复字段
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 上下文完美优化 |
| ⭐⭐⭐⭐ | ≥90% | 压缩率良好,有少量冗余 |
| ⭐⭐⭐ | ≥75% | 压缩率不足或信息丢失 |
| ⭐⭐ | ≥50% | 上下文质量差 |
| ⭐ | <50% | 上下文完全不合格 |
维度5: 执行结果质量 (Execution Result Quality)
检查项
ERQ5.1 执行成功率 - ✅ 整体成功率 ≥ 95% - ✅ CRITICAL任务成功率 100% - ✅ 无重复失败的任务
示例:
# 检查执行结果
total = len(results)
success = sum(1 for r in results.values() if r.success)
critical_success = sum(1 for t, r in results.items()
if t.priority == TaskPriority.CRITICAL and r.success)
assert critical_success / critical_total == 1.0, "CRITICAL任务必须100%成功"
assert success / total >= 0.95, "整体成功率必须≥95%"
ERQ5.2 错误处理质量 - ✅ 所有失败任务都有详细error信息 - ✅ error信息包含可操作的修复建议 - ✅ 无通用错误消息 ("Error occurred", "Failed")
示例:
# ❌ 错误
TaskResult(
success=False,
error="Task failed"
)
# ✅ 正确
TaskResult(
success=False,
error="Database connection timeout after 30s. Check DB server status and increase timeout in config/database.py:42"
)
ERQ5.3 执行时间合理性 - ✅ 任务执行时间 ≤ 预估时间 * 2 - ✅ 无明显性能瓶颈 (单个任务 > 600s) - ✅ 并行加速比 ≥ 1.5
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 所有任务成功,时间合理 |
| ⭐⭐⭐⭐ | ≥90% | 1-2个次要失败 |
| ⭐⭐⭐ | ≥75% | 多个失败或性能问题 |
| ⭐⭐ | ≥50% | 执行质量差 |
| ⭐ | <50% | 执行完全失败 |
维度6: 工作流可维护性 (Workflow Maintainability)
检查项
WMQ6.1 工作流文档化 - ✅ 每个工作流有对应的文档说明 - ✅ 文档描述工作流的目的、输入、输出 - ✅ 文档包含示例代码
示例:
# 用户认证工作流
## 目的
实现完整的用户注册和登录功能
## 输入
- 用户凭证 (username, password)
- 认证配置
## 输出
- JWT token
- 用户会话
## 示例
```python
workflow = [
Task("validate", "Validate input", ...),
Task("auth", "Authenticate", deps=["validate"]),
Task("token", "Generate token", deps=["auth"])
]
**WMQ6.2 工作流可测试性**
- ✅ 每个工作流有对应的测试用例
- ✅ 测试覆盖正常流程和异常流程
- ✅ 测试可独立运行
**示例**:
```python
# ❌ 错误: 不可测试
workflow = [Task(...)] # 无测试
# ✅ 正确: 可测试
def test_auth_workflow():
workflow = create_auth_workflow()
results = await orchestrator.execute_workflow(workflow)
assert all(r.success for r in results.values())
def test_auth_workflow_with_invalid_input():
workflow = create_auth_workflow(invalid=True)
results = await orchestrator.execute_workflow(workflow)
assert not results["validate"].success
WMQ6.3 工作流可扩展性 - ✅ 工作流设计易于添加新任务 - ✅ 工作流支持参数化配置 - ✅ 无硬编码的特定路径或值
评分标准
| 评分 | 通过率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 完全可维护 |
| ⭐⭐⭐⭐ | ≥90% | 文档或测试有缺失 |
| ⭐⭐⭐ | ≥75% | 部分可维护 |
| ⭐⭐ | ≥50% | 难以维护 |
| ⭐ | <50% | 完全不可维护 |
代码优化评估维度
维度1: 性能优化 (Performance Optimization)
检查项
PO1.1 时间复杂度 - ✅ 所有循环有明确的时间复杂度分析 - ✅ 避免O(n²)以上的嵌套循环 - ✅ 使用合适的数据结构 (set O(1) vs list O(n))
示例:
# ❌ 错误: O(n²)
def find_duplicates(arr):
for i in range(len(arr)): # O(n)
for j in range(i+1, len(arr)): # O(n)
if arr[i] == arr[j]:
return True
return False
# ✅ 正确: O(n)
def find_duplicates(arr):
seen = set() # O(1) lookup
for item in arr: # O(n)
if item in seen:
return True
seen.add(item)
return False
PO1.2 空间复杂度 - ✅ 内存使用有明确的上限 - ✅ 避免不必要的数据拷贝 - ✅ 使用生成器代替列表 (大数据集)
示例:
# ❌ 错误: 内存占用大
def process_large_file(filename):
data = []
with open(filename) as f:
for line in f:
data.append(line.strip())
return [process(line) for line in data] # 两次内存占用
# ✅ 正确: 流式处理
def process_large_file(filename):
with open(filename) as f:
for line in f: # 流式处理,不占用全部内存
yield process(line.strip())
PO1.3 缓存策略 - ✅ 重复计算的函数有缓存 - ✅ 缓存有合理的过期策略 - ✅ 避免缓存污染
示例:
# ✅ 正确: 使用缓存
from functools import lru_cache
@lru_cache(maxsize=128) # 合理的缓存大小
def expensive_function(n):
# 昂贵的计算
return result
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 所有算法最优,缓存完善 |
| ⭐⭐⭐⭐ | 90%优化,有少量改进空间 |
| ⭐⭐⭐ | 存在明显性能瓶颈 |
| ⭐⭐ | 性能问题严重 |
| ⭐ | 性能无法接受 |
维度2: 内存管理 (Memory Management)
检查项
MM2.1 内存泄漏检查 - ✅ 无未释放的资源 (文件、连接、锁) - ✅ 使用上下文管理器 (with statement) - ✅ 及时删除大对象
示例:
# ❌ 错误: 可能泄漏
def process_file(filename):
f = open(filename)
data = f.read()
# 如果这里抛出异常,文件不会关闭
process(data)
f.close()
# ✅ 正确: 使用with
def process_file(filename):
with open(filename) as f: # 自动关闭
data = f.read()
return process(data)
MM2.2 对象生命周期 - ✅ 无循环引用导致的内存泄漏 - ✅ 及时删除不再使用的对象 - ✅ 使用弱引用 (weakref) 处理循环引用
示例:
# ❌ 错误: 循环引用
class Parent:
def __init__(self):
self.children = []
class Child:
def __init__(self, parent):
self.parent = parent
parent.children.append(self) # 循环引用
# ✅ 正确: 使用弱引用
import weakref
class Child:
def __init__(self, parent):
self.parent = weakref.ref(parent) # 弱引用
parent.children.append(self)
MM2.3 内存优化 - ✅ 使用__slots__减少内存占用 - ✅ 使用数组类型代替列表 (数值数据) - ✅ 避免不必要的数据复制
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完美内存管理 |
| ⭐⭐⭐⭐ | 轻微内存问题 |
| ⭐⭐⭐ | 存在内存泄漏风险 |
| ⭐⭐ | 严重内存问题 |
| ⭐ | 内存管理极差 |
维度3: 并发与异步 (Concurrency & Async)
检查项
CA3.1 异步操作 - ✅ I/O操作使用async/await - ✅ 避免阻塞事件循环 - ✅ 正确使用asyncio.gather并行执行
示例:
# ❌ 错误: 阻塞事件循环
import time
async def fetch_data():
time.sleep(5) # 阻塞5秒
return data
# ✅ 正确: 使用asyncio.sleep
async def fetch_data():
await asyncio.sleep(5) # 不阻塞
return data
CA3.2 并发安全 - ✅ 共享资源使用锁保护 - ✅ 避免死锁 (有序获取锁) - ✅ 使用线程安全的数据结构
示例:
# ❌ 错误: 竞态条件
counter = 0
async def increment():
global counter
counter += 1 # 非原子操作
# ✅ 正确: 使用锁
import asyncio
counter = 0
lock = asyncio.Lock()
async def increment():
global counter
async with lock:
counter += 1
CA3.3 资源池管理 - ✅ 使用连接池 (数据库、HTTP) - ✅ 合理设置池大小 - ✅ 及时释放资源回池
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完美的并发设计 |
| ⭐⭐⭐⭐ | 有少量并发问题 |
| ⭐⭐⭐ | 存在竞态条件 |
| ⭐⭐ | 并发设计有严重问题 |
| ⭐ | 并发无法工作 |
维度4: 代码精简度 (Code Simplicity)
检查项
CS4.1 代码行数 - ✅ 函数长度 < 50行 - ✅ 类长度 < 300行 - ✅ 模块长度 < 500行
示例:
# ❌ 错误: 函数过长 (100+行)
def complex_function(data):
# ... 100+ 行代码 ...
pass
# ✅ 正确: 拆分为小函数
def complex_function(data):
validated = validate_data(data)
processed = process_data(validated)
return format_result(processed)
def validate_data(data):
# ... 20行 ...
pass
def process_data(data):
# ... 30行 ...
pass
def format_result(data):
# ... 10行 ...
pass
CS4.2 圈复杂度 - ✅ 函数圈复杂度 < 10 - ✅ 避免深层嵌套 (>4层) - ✅ 使用早返回 (early return)
示例:
# ❌ 错误: 高复杂度,深层嵌套
def process_data(data):
if data:
if data.get('valid'):
if data['type'] == 'A':
if data['subtype'] == '1':
# ... 嵌套太深
return result
return None
# ✅ 正确: 早返回,降低复杂度
def process_data(data):
if not data:
return None
if not data.get('valid'):
return None
if data['type'] != 'A':
return None
if data['subtype'] != '1':
return None
return result
CS4.3 重复代码 - ✅ 代码重复率 < 5% - ✅ 提取重复逻辑到函数 - ✅ 使用模板或配置代替重复代码
评分标准
| 评分 | 重复率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | < 3% | 代码精简完美 |
| ⭐⭐⭐⭐ | < 5% | 重复率良好 |
| ⭐⭐⭐ | < 10% | 有重复代码 |
| ⭐⭐ | < 20% | 重复代码较多 |
| ⭐ | ≥ 20% | 重复代码严重 |
维度5: 模块化设计 (Modularity)
检查项
MD5.1 单一职责 - ✅ 每个模块只有一个明确的目的 - ✅ 模块内部高内聚 - ✅ 模块之间低耦合
示例:
# ❌ 错误: 多职责
class UserModule:
def authenticate(self): pass
def send_email(self): pass
def log_data(self): pass
def calculate_stats(self): pass
# ✅ 正确: 单一职责
class AuthModule:
def authenticate(self): pass
class EmailModule:
def send_email(self): pass
class LoggingModule:
def log_data(self): pass
class StatsModule:
def calculate_stats(self): pass
MD5.2 依赖倒置 - ✅ 依赖抽象接口而非具体实现 - ✅ 使用依赖注入 - ✅ 避免循环依赖
示例:
# ❌ 错误: 依赖具体实现
class UserService:
def __init__(self):
self.db = MySQLDatabase() # 硬编码
# ✅ 正确: 依赖抽象
class DatabaseInterface:
def query(self, sql): pass
class UserService:
def __init__(self, db: DatabaseInterface):
self.db = db # 依赖注入
MD5.3 接口设计 - ✅ 接口简洁明了 - ✅ 遵循最小知识原则 - ✅ 接口命名清晰
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完美的模块化设计 |
| ⭐⭐⭐⭐ | 模块化良好,有改进空间 |
| ⭐⭐⭐ | 部分模块化 |
| ⭐⭐ | 模块化不足 |
| ⭐ | 无模块化可言 |
维度6: 可测试性 (Testability)
检查项
T6.1 单元测试覆盖 - ✅ 代码覆盖率 ≥ 90% - ✅ 核心逻辑覆盖率 100% - ✅ 每个函数有对应测试
示例:
# ❌ 错误: 无测试
def calculate(x, y):
return x * y
# ✅ 正确: 有完整测试
def calculate(x, y):
return x * y
def test_calculate():
assert calculate(2, 3) == 6
assert calculate(-1, 5) == -5
assert calculate(0, 10) == 0
T6.2 依赖注入 - ✅ 所有依赖可通过构造函数注入 - ✅ 使用mock隔离外部依赖 - ✅ 无全局状态
示例:
# ❌ 错误: 难以测试
class UserService:
def get_user(self, user_id):
return Database.query(user_id) # 硬编码依赖
# ✅ 正确: 易于测试和mock
class UserService:
def __init__(self, db: Database):
self.db = db # 可注入
def get_user(self, user_id):
return self.db.query(user_id)
T6.3 测试隔离性 - ✅ 测试之间相互独立 - ✅ 使用setUp/tearDown清理 - ✅ 测试可重复执行
评分标准
| 评分 | 覆盖率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | ≥ 95% | 测试完美 |
| ⭐⭐⭐⭐ | ≥ 90% | 测试充分 |
| ⭐⭐⭐ | ≥ 80% | 测试不足 |
| ⭐⭐ | ≥ 60% | 测试严重不足 |
| ⭐ | < 60% | 几乎无测试 |
维度7: 错误处理质量 (Error Handling Quality)
检查项
EHQ7.1 异常处理 - ✅ 所有可能失败的函数有异常处理 - ✅ 使用具体的异常类型 - ✅ 异常信息包含足够的上下文
示例:
# ❌ 错误: 无异常处理
def divide(a, b):
return a / b
# ✅ 正确: 完整异常处理
def divide(a: float, b: float) -> float:
"""Divide two numbers.
Args:
a: Dividend
b: Divisor
Returns:
Quotient
Raises:
ValueError: If b is zero
TypeError: If inputs are not numbers
"""
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError(f"Expected numbers, got {type(a)} and {type(b)}")
if b == 0:
raise ValueError(f"Cannot divide {a} by zero")
return a / b
EHQ7.2 错误恢复 - ✅ 可恢复的错误有恢复逻辑 - ✅ 不可恢复的错误有清晰的失败信息 - ✅ 错误不影响系统稳定性
EHQ7.3 日志记录 - ✅ 所有错误都记录日志 - ✅ 日志包含足够的调试信息 - ✅ 日志级别正确 (ERROR, WARNING, INFO)
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完美的错误处理 |
| ⭐⭐⭐⭐ | 错误处理良好 |
| ⭐⭐⭐ | 部分错误处理 |
| ⭐⭐ | 错误处理不足 |
| ⭐ | 几乎无错误处理 |
测试执行严格标准
维度1: 测试覆盖率 (Test Coverage)
检查项
TC1.1 行覆盖率 - ✅ 总体行覆盖率 ≥ 90% - ✅ 核心模块覆盖率 ≥ 95% - ✅ 新代码覆盖率 100%
TC1.2 分支覆盖率 - ✅ 分支覆盖率 ≥ 85% - ✅ 所有if语句的分支都测试 - ✅ 异常路径都有测试
TC1.3 函数覆盖率 - ✅ 函数覆盖率 ≥ 95% - ✅ 所有public函数都有测试 - ✅ 所有complex函数都有测试
评分标准
| 评分 | 行覆盖率 | 分支覆盖率 | 函数覆盖率 |
|---|---|---|---|
| ⭐⭐⭐⭐⭐ | ≥ 95% | ≥ 90% | ≥ 98% |
| ⭐⭐⭐⭐ | ≥ 90% | ≥ 85% | ≥ 95% |
| ⭐⭐⭐ | ≥ 80% | ≥ 75% | ≥ 90% |
| ⭐⭐ | ≥ 70% | ≥ 60% | ≥ 80% |
| ⭐ | < 70% | < 60% | < 80% |
维度2: 测试质量 (Test Quality)
检查项
TQ2.1 测试独立性 - ✅ 每个测试可独立运行 - ✅ 测试之间无依赖关系 - ✅ 测试执行顺序不影响结果
示例:
# ❌ 错误: 测试有依赖
def test_create_user():
global user
user = create_user("test")
assert user is not None
def test_delete_user():
delete_user(user) # 依赖上面的测试
# ✅ 正确: 测试独立
def test_create_user():
user = create_user("test")
assert user is not None
# 清理
delete_user(user)
def test_delete_user():
user = create_user("test2")
delete_user(user)
assert get_user("test2") is None
TQ2.2 测试可读性 - ✅ 测试命名清晰 (test_what_is_tested) - ✅ 测试使用AAA模式 (Arrange, Act, Assert) - ✅ 断言信息清晰
示例:
# ❌ 错误: 测试命名不清
def test1():
assert calculate(1, 2) == 3
# ✅ 正确: 测试命名清晰
def test_calculate_returns_sum_of_two_positive_numbers():
# Arrange
a, b = 1, 2
expected = 3
# Act
result = calculate(a, b)
# Assert
assert result == expected, f"Expected {expected}, got {result}"
TQ2.3 测试边界条件 - ✅ 测试最小值 - ✅ 测试最大值 - ✅ 测试边界值 (0, None, 空字符串)
示例:
# ✅ 正确: 测试边界条件
def test_calculate_with_boundary_values():
assert calculate(0, 0) == 0 # 最小值
assert calculate(1, 1) == 2 # 最小正数
assert calculate(MAX_INT, 1) == MAX_INT + 1 # 边界值
assert calculate(-1, 1) == 0 # 负数
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 所有测试完美 |
| ⭐⭐⭐⭐ | 90%测试符合标准 |
| ⭐⭐⭐ | 75%测试符合标准 |
| ⭐⭐ | 50%测试符合标准 |
| ⭐ | < 50%测试符合标准 |
维度3: 测试性能 (Test Performance)
检查项
TP3.1 测试速度 - ✅ 单元测试 < 1秒/测试 - ✅ 集成测试 < 10秒/测试 - ✅ 全量测试套件 < 5分钟
TP3.2 测试隔离 - ✅ 使用测试数据库 - ✅ 使用测试配置 - ✅ 测试不污染生产环境
TP3.3 测试可重复性 - ✅ 测试可重复执行,结果一致 - ✅ 无随机性或时间依赖 - ✅ 清理所有副作用
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 测试性能完美 |
| ⭐⭐⭐⭐ | 测试性能良好 |
| ⭐⭐⭐ | 测试较慢 |
| ⭐⭐ | 测试很慢 |
| ⭐ | 测试无法接受 |
维度4: 测试维护性 (Test Maintainability)
检查项
TM4.1 测试代码质量 - ✅ 测试代码符合代码规范 - ✅ 测试代码可读性高 - ✅ 无重复的测试代码
TM4.2 测试工具使用 - ✅ 使用测试框架 (pytest, unittest) - ✅ 使用测试工具 (mock, fixture) - ✅ 使用覆盖率工具
TM4.3 测试文档 - ✅ 复杂测试有注释 - ✅ 测试意图清晰 - ✅ 测试结果可理解
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 测试完美维护 |
| ⭐⭐⭐⭐ | 测试维护良好 |
| ⭐⭐⭐ | 测试维护一般 |
| ⭐⭐ | 测试难维护 |
| ⭐ | 测试无法维护 |
维度5: 持续集成 (Continuous Integration)
检查项
CI5.1 自动化测试 - ✅ 每次commit自动运行测试 - ✅ 测试失败阻止merge - ✅ 测试报告自动生成
CI5.2 测试环境 - ✅ CI环境与生产环境一致 - ✅ 测试数据可重现 - ✅ 测试依赖可版本控制
CI5.3 测试反馈 - ✅ 测试失败快速反馈 - ✅ 失败信息清晰 - ✅ 支持本地复现
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | CI完美 |
| ⭐⭐⭐⭐ | CI良好 |
| ⭐⭐⭐ | CI基本可用 |
| ⭐⭐ | CI有严重问题 |
| ⭐ | CI几乎不可用 |
文档生成质量控制
维度1: 文档准确性 (Documentation Accuracy)
检查项
DA1.1 版本号一致性 ⭐ 零容忍 - ✅ 所有文档版本号与实际版本一致 - ✅ 无过期版本号 (V1.1.0在v3.3.0文档中) - ✅ 版本号格式统一 (vX.Y.Z)
示例:
# ❌ 错误: 版本号不一致
## LingFlow v3.3.0 工作流程
... 参见 docs/V1.1.0_FINAL_SUMMARY.md ...
# ✅ 正确: 版本号一致
## LingFlow v3.3.0 工作流程
... 参见 docs/V3.3.0_FINAL_SUMMARY.md ...
DA1.2 内容准确性 - ✅ 代码示例可执行 - ✅ 配置示例正确 - ✅ API文档与实际API一致
DA1.3 时效性 - ✅ 文档与代码同步更新 - ✅ 无过时信息 - ✅ 变更记录完整
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 文档100%准确 |
| ⭐⭐⭐⭐ | 偶尔有小错误 |
| ⭐⭐⭐ | 部分信息过时 |
| ⭐⭐ | 信息过时严重 |
| ⭐ | 文档完全错误 |
维度2: 文档完整性 (Documentation Completeness)
检查项
DC2.1 必需章节 - ✅ 所有文档有README或概述 - ✅ API文档有所有public方法 - ✅ 配置文档有所有配置项
DC2.2 代码文档 - ✅ 所有模块有docstring - ✅ 所有public类有docstring - ✅ 所有public函数有docstring
示例:
# ❌ 错误: 无文档
def calculate(x, y):
return x * y
# ✅ 正确: 完整文档
def calculate(x: float, y: float) -> float:
"""Multiply two numbers.
Args:
x: First number
y: Second number
Returns:
Product of x and y
Raises:
TypeError: If inputs are not numbers
Examples:
>>> calculate(2, 3)
6
"""
if not isinstance(x, (int, float)) or not isinstance(y, (int, float)):
raise TypeError("Inputs must be numbers")
return x * y
DC2.3 注释覆盖 - ✅ 复杂逻辑有注释 - ✅ 临时标记 (TODO, FIXME, XXX) 最小化 - ✅ 注释与代码一致
评分标准
| 评分 | 覆盖率 | 说明 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | 100% | 文档完美 |
| ⭐⭐⭐⭐ | ≥ 95% | 文档充分 |
| ⭐⭐⭐ | ≥ 85% | 文档基本完整 |
| ⭐⭐ | ≥ 70% | 文档不完整 |
| ⭐ | < 70% | 文档严重缺失 |
维度3: 文档清晰度 (Documentation Clarity)
检查项
DCl3.1 结构清晰 - ✅ 文档有清晰的目录 - ✅ 章节逻辑顺序合理 - ✅ 使用一致的格式
DCl3.2 表达清晰 - ✅ 使用简单易懂的语言 - ✅ 避免歧义 - ✅ 使用图表辅助说明
DCl3.3 示例充分 - ✅ 每个功能有示例 - ✅ 示例可执行 - ✅ 示例覆盖常见用例
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 文档完美清晰 |
| ⭐⭐⭐⭐ | 文档非常清晰 |
| ⭐⭐⭐ | 文档基本清晰 |
| ⭐⭐ | 文档不够清晰 |
| ⭐ | 文档混乱 |
维度4: 文档一致性 (Documentation Consistency)
检查项
DCons4.1 术语一致性 - ✅ 同一概念使用相同术语 - ✅ 命名规范一致 (snake_case, camelCase) - ✅ 缩写一致性
示例:
# ❌ 错误: 术语不一致
- User Module
- 用户模块
- authModule
- User_Module
# ✅ 正确: 术语一致
- User Module
- User Module (所有地方)
- user_module (代码)
- user_module (所有地方)
DCons4.2 格式一致性 - ✅ 代码块使用相同的标记语言 - ✅ 标题级别使用一致 - ✅ 列表格式一致
DCons4.3 版本一致性 ⭐ 零容忍 - ✅ 所有引用的版本号正确 - ✅ 无过期链接 - ✅ 无过时文档引用
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完全一致 |
| ⭐⭐⭐⭐ | 偶尔不一致 |
| ⭐⭐⭐ | 部分不一致 |
| ⭐⭐ | 不一致严重 |
| ⭐ | 完全不一致 |
维度5: 文档可维护性 (Documentation Maintainability)
检查项
DM5.1 模块化 - ✅ 大文档拆分为小文档 - ✅ 使用include避免重复 - ✅ 每个章节独立维护
DM5.2 更新机制 - ✅ 文档更新与代码同步 - ✅ 有文档review流程 - ✅ 版本号自动更新
DM5.3 搜索友好 - ✅ 文档可搜索 - ✅ 有索引或标签 - ✅ 有交叉引用
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 文档完美维护 |
| ⭐⭐⭐⭐ | 文档维护良好 |
| ⭐⭐⭐ | 文档维护一般 |
| ⭐⭐ | 文档难维护 |
| ⭐ | 文档无法维护 |
维度6: 文档可访问性 (Documentation Accessibility)
检查项
DAcc6.1 可用性 - ✅ 文档易于找到 - ✅ 文档易于访问 - ✅ 多种格式可用 (HTML, PDF, Markdown)
DAcc6.2 国际化 - ✅ 支持多语言 - ✅ 术语翻译准确 - ✅ 日期/时间格式正确
DAcc6.3 无障碍访问 - ✅ 支持屏幕阅读器 - ✅ 图片有alt文本 - ✅ 色彩对比度符合标准
评分标准
| 评分 | 说明 |
|---|---|
| ⭐⭐⭐⭐⭐ | 完全可访问 |
| ⭐⭐⭐⭐ | 基本可访问 |
| ⭐⭐⭐ | 部分可访问 |
| ⭐⭐ | 难以访问 |
| ⭐ | 无法访问 |
质量检查清单
工作流编排检查清单
class WorkflowQualityChecker:
"""工作流质量检查器"""
def check_task_definition(self, tasks):
"""检查任务定义质量"""
issues = []
for task in tasks:
# TD1.1 任务ID唯一性
if not is_unique(task.task_id):
issues.append("Duplicate task_id")
# TD1.2 任务描述完整性
if not task.description or len(task.description) < 10:
issues.append("Description too short")
# TD1.3 任务优先级合理性
if not isinstance(task.priority, TaskPriority):
issues.append("Priority not specified")
# TD1.4 代理类型匹配
if task.agent_type not in AGENT_TYPES:
issues.append("Invalid agent_type")
return issues
def check_dependencies(self, tasks):
"""检查依赖关系质量"""
# DQ2.1 依赖完整性
if has_circular_dependency(tasks):
return ["Circular dependency detected"]
# DQ2.2 依赖合理性
if has_excessive_dependencies(tasks, max_deps=5):
return ["Too many dependencies"]
return []
def check_parallel_safety(self, tasks):
"""检查并行执行安全性"""
# PQ3.1 并行安全检查
unsafe = [t for t in tasks if not is_parallel_safe(t)]
if unsafe:
return [f"Unsafe tasks: {[t.task_id for t in unsafe]}"]
# PQ3.2 资源冲突检测
if has_resource_conflict(tasks):
return ["Resource conflict detected"]
return []
代码优化检查清单
class CodeOptimizationChecker:
"""代码优化检查器"""
def check_performance(self, code):
"""检查性能优化"""
# PO1.1 时间复杂度
if has_quadratic_complexity(code):
return ["Quadratic complexity detected"]
# PO1.2 空间复杂度
if has_memory_leak(code):
return ["Potential memory leak"]
return []
def check_simplicity(self, code):
"""检查代码精简度"""
# CS4.1 代码行数
if count_lines(code) > 50:
return ["Function too long (>50 lines)"]
# CS4.2 圈复杂度
if calculate_complexity(code) > 10:
return ["Complexity too high (>10)"]
# CS4.3 重复代码
if calculate_duplication(code) > 0.05:
return ["Code duplication > 5%"]
return []
测试执行检查清单
class TestQualityChecker:
"""测试质量检查器"""
def check_coverage(self, test_results):
"""检查测试覆盖率"""
# TC1.1 行覆盖率
if test_results.line_coverage < 0.90:
return ["Line coverage < 90%"]
# TC1.2 分支覆盖率
if test_results.branch_coverage < 0.85:
return ["Branch coverage < 85%"]
# TC1.3 函数覆盖率
if test_results.function_coverage < 0.95:
return ["Function coverage < 95%"]
return []
def check_test_quality(self, tests):
"""检查测试质量"""
issues = []
# TQ2.1 测试独立性
if not are_tests_independent(tests):
issues.append("Tests have dependencies")
# TQ2.2 测试可读性
if not test_names_are_clear(tests):
issues.append("Test names unclear")
# TQ2.3 测试边界条件
if not tests_cover_boundaries(tests):
issues.append("Boundary conditions not covered")
return issues
文档质量检查清单
class DocumentationQualityChecker:
"""文档质量检查器"""
def check_accuracy(self, docs):
"""检查文档准确性"""
issues = []
# DA1.1 版本号一致性 ⭐ 零容忍
if has_incorrect_version(docs, expected_version="3.3.0"):
issues.append("INCORRECT VERSION NUMBER")
# DA1.2 内容准确性
if code_examples_dont_run(docs):
issues.append("Code examples don't execute")
return issues
def check_completeness(self, docs):
"""检查文档完整性"""
issues = []
# DC2.2 代码文档
if not all_functions_have_docstrings(docs):
issues.append("Missing docstrings")
# DC2.3 注释覆盖
if complex_logic_lacks_comments(docs):
issues.append("Missing comments for complex logic")
return issues
def check_consistency(self, docs):
"""检查文档一致性"""
issues = []
# DCons4.3 版本一致性 ⭐ 零容忍
if has_outdated_version_references(docs):
issues.append("OUTDATED VERSION REFERENCES")
# DCons4.1 术语一致性
if terminology_inconsistent(docs):
issues.append("Terminology inconsistent")
return issues
质量评分系统
综合评分算法
def calculate_overall_score(scores):
"""计算综合评分
Args:
scores: 各维度评分字典
Returns:
综合评分 (0-5)
"""
# 计算各维度平均分
avg_score = sum(scores.values()) / len(scores)
# 检查零容忍项
zero_tolerance_issues = check_zero_tolerance_issues(scores)
# 如果有零容忍问题,评分降级
if zero_tolerance_issues:
return min(avg_score - 2, 1)
return avg_score
评分等级
| 综合评分 | 等级 | 说明 |
|---|---|---|
| 4.5 - 5.0 | ⭐⭐⭐⭐⭐ Excellent | 所有维度优秀 |
| 3.5 - 4.4 | ⭐⭐⭐⭐ Very Good | 大部分维度优秀 |
| 2.5 - 3.4 | ⭐⭐⭐ Good | 基本达标 |
| 1.5 - 2.4 | ⭐⭐ Fair | 需要改进 |
| 0.0 - 1.4 | ⭐ Poor | 不合格 |
零容忍检查清单
以下问题一旦发现,直接降级:
- 版本号错误: 文档中的版本号与实际不符
- 过期信息: 文档中引用过时的版本或API
- 安全问题: eval(), exec(), 硬编码密钥等
- 严重Bug: 会导致崩溃或数据丢失的bug
- 依赖循环: 无法解析的循环依赖
- 内存泄漏: 明显的内存泄漏问题
质量控制流程
工作流程
1. 代码/文档创建
↓
2. 自动化检查
- 运行质量检查器
- 运行测试套件
- 运行linter
↓
3. 人工审查
- 检查零容忍项
- 审查评分
- 检查报告
↓
4. 反馈与修复
- 报告问题
- 修复问题
- 重新检查
↓
5. 合格判定
- 所有零容忍项通过
- 综合评分 ≥ 3.0
- 无Critical级别问题
↓
6. 合并与发布
自动化检查命令
# 工作流编排质量检查
python -m lingflow.quality.workflow_checker
# 代码优化检查
python -m lingflow.quality.code_checker
# 测试质量检查
python -m lingflow.quality.test_checker
# 文档质量检查
python -m lingflow.quality.doc_checker
# 综合质量检查
python -m lingflow.quality.all_checkers
质量报告生成
from lingflow.quality import QualityReporter
reporter = QualityReporter()
# 生成报告
report = reporter.generate_report(
workflow_quality=workflow_score,
code_quality=code_score,
test_quality=test_score,
doc_quality=doc_score
)
# 输出报告
print(report.to_markdown())
print(report.to_html())
总结
LingFlow v3.3.0 质量控制框架建立了全面、严格的质量标准:
质量控制维度
| 工作流程 | 维度数 | 检查项数 | 零容忍项 |
|---|---|---|---|
| 工作流编排 | 6 | 30+ | 循环依赖、版本错误 |
| 代码优化 | 7 | 35+ | 内存泄漏、安全问题 |
| 测试执行 | 5 | 25+ | 无 |
| 文档生成 | 6 | 30+ | 版本错误 ⭐ |
| 总计 | 24 | 120+ | - |
核心原则
- 零容忍: 版本号错误、过期信息、安全问题
- 一致性: 统一格式、命名、版本
- 完整性: 覆盖所有检查项
- 可验证: 自动化检查
- 持续改进: 基于反馈优化
下一步
- 实现自动化检查器
- 集成到CI/CD流程
- 建立质量门禁
- 定期审查和更新标准
文档版本: 3.3.0 最后更新: 2026-03-23 状态: ✅ 生产就绪 零容忍: 版本号错误、过期信息