CLRlove7

🧠 大模型生成策略 - AssertPath-LLM

基于结构引导的单元测试断言生成框架


📌 核心问题

传统 LLM 生成单元测试断言时存在三大挑战:

  1. 幻觉问题:生成语法正确但语义错误的断言
  2. 注意力稀释:长上下文下关键程序点信息丢失
  3. 目标定位困难:难以精准识别需要断言覆盖的分支条件

💡 技术方案

1️⃣ 测试义务标注 & TOG 构建

源码经过 AST/CFG/DDG 多视图融合分析,识别测试义务点,生成 Test-Oriented Graph (TOG)。

源码 → AST/CFG/DDG 多视图融合 → 红边标注测试义务点 → TOG

2️⃣ 最小线性子路径分解(MLSP)

将全局断言生成任务分解为局部子路径覆盖任务:

特性 传统方法 MLSP
上下文长度 O(n²) O(n)
注意力稀释 严重 有效缓解
路径覆盖 局部 全局最优

算法优势

3️⃣ 7槽位断言模板机制

槽位 语义 示例
AssertType 断言方法类型 assertEquals, assertThrows
Expected 期望值 200, expectedUser
Actual 实际执行结果 service.calculate(x)
Delta 精度容差 0.001
Message 失败提示 "Calculation mismatch"
Precondition 前置条件校验 assertNotNull(input)
Postcondition 后置状态验证 verify(mock).call()

4️⃣ 闭环反馈迭代

┌─────────────┐
│  源码输入    │
└──────┬──────┘
       ↓
┌─────────────┐
│  TOG 构建    │ ← 领域知识库
└──────┬──────┘
       ↓
┌─────────────┐
│  MLSP 分解   │
└──────┬──────┘
       ↓
┌─────────────┐
│  LLM 生成   │
└──────┬──────┘
       ↓
┌─────────────┐
│  断言执行   │
└──────┬──────┘
       ↓
┌─────────────┐
│  覆盖分析   │ → 未覆盖路径 → 返回 MLSP
└──────┬──────┘
       ↓
┌─────────────┐
│  知识库更新 │
└─────────────┘

🔬 技术实现

TOG 图结构

class TestObligationGraph:
    def __init__(self):
        self.nodes: List[CodeNode]      # 代码节点
        self.edges: List[Edge]          # 控制流边
        self.test_obligation: Set[Edge] # 测试义务边(需覆盖)
        self.node_features: Dict        # 节点特征
        
    def mark_test_obligations(self):
        """标注需要断言覆盖的边"""
        for edge in self.edges:
            if self.is_branch_boundary(edge):
                self.test_obligation.add(edge)

MLSP 算法

def mlsp_decompose(tog: TestObligationGraph) -> List[LinearSubpath]:
    """最小线性子路径分解"""
    subpaths = []
    obligation_edges = tog.test_obligation
    
    for target_edge in obligation_edges:
        # 提取从入口到目标边的最短路径
        path = find_minimal_path(tog, target_edge)
        subpaths.append(LinearSubpath(
            nodes=path.nodes,
            obligation_edge=target_edge,
            linearized=True  # 保证线性
        ))
    
    return merge_overlapping(subpaths)

断言槽位填充

def fill_assertion_slots(
    subpath: LinearSubpath,
    llm: BaseLLM,
    knowledge_base: KnowledgeBase
) -> Assertion:
    """7槽位断言模板填充"""
    # 1. 检索相似案例
    similar = knowledge_base.retrieve(subpath)
    
    # 2. 构建提示
    prompt = build_prompt(
        code=subpath.get_code(),
        template=AssertionTemplate.SEVEN_SLOT,
        similar_cases=similar,
        domain_knowledge=knowledge_base.get_domain()
    )
    
    # 3. LLM 生成
    raw_assertion = llm.generate(prompt)
    
    # 4. 解析填充
    return parse_and_fill(raw_assertion, AssertionTemplate.SEVEN_SLOT)

关键发现

  1. MLSP 有效性:将覆盖率从 78% 提升至 96%
  2. 模板约束:7槽位模板将幻觉率降低 67%
  3. 知识库增强:检索增强使准确率提升 18%