Implement a comprehensive VBA testing framework that provides precise line-by-line error reporting through code weaving technology. Core Features: - CodeWeaver: Injects line number labels and error handling into VBA code - LoggerInjector: Manages TestLogger module for capturing test results - TestRunner: Orchestrates Excel lifecycle and test execution - Command-line interface supporting single and batch testing Key Capabilities: - Captures exact line numbers where errors occur - Displays source code context for error locations - Non-invasive testing (original files unchanged) - Batch testing support with detailed summaries Components: - vba_test_runner.py: Main framework implementation - demo.xlsm: Demo Excel file with test procedures - create_demo.py: Script to generate demo files - check_vba_access.py: VBA access permission checker Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
4.7 KiB
4.7 KiB
VBA 自动化测试与精确报错系统 - 实现总结
项目完成状态
✅ 已完成 - 所有核心功能已实现并测试通过
已实现的功能
1. 代码编织器 (CodeWeaver)
- ✅ 解析 VBA 代码中的所有 Sub/Function 过程
- ✅ 智能注入行号标签(10, 20, 30...)
- ✅ 自动跳过声明区、注释、空行
- ✅ 注入错误处理逻辑(On Error GoTo)
- ✅ 生成 Source Map(行号到源代码的映射)
2. 日志模块注入器 (LoggerInjector)
- ✅ 自动注入 TestLogger 辅助模块
- ✅ 支持模块替换(删除旧模块,注入新模块)
- ✅ 记录测试成功/失败状态
- ✅ 捕获错误详情(过程名、行号、错误号、描述)
3. 测试执行器 (TestRunner)
- ✅ Excel 生命周期管理
- ✅ VBA 代码读取和热替换
- ✅ 宏执行和结果获取
- ✅ 不保存原始文件(非侵入式)
4. 命令行界面
- ✅ 支持单个或批量测试
- ✅ 清晰的测试结果输出
- ✅ 测试汇总统计
测试验证
测试场景
✅ TestSuccessfulProcedure - 成功执行
[PASS] TestSuccessfulProcedure - Test Passed
✅ TestErrorProcedure - 除以零错误
[FAIL] TestErrorProcedure - Test Failed
Error Description: Division by zero
Error Line: 30
Source Code: result = x / y
✅ TestTypeMismatch - 类型不匹配错误
[FAIL] TestTypeMismatch - Test Failed
Error Description: Type mismatch
Error Line: 20
Source Code: y = x
✅ TestSubscriptError - 下标越界错误
[FAIL] TestSubscriptError - Test Failed
Error Description: Subscript out of range
Error Line: 40
Source Code: value = arr(5)
批量测试结果
===== VBA Batch Test Results =====
[1/4] [FAIL] TestErrorProcedure - Test Failed
Error Description: Division by zero
Error Line: 30
Source Code: result = x / y
[2/4] [FAIL] TestTypeMismatch - Test Failed
Error Description: Type mismatch
Error Line: 20
Source Code: y = x
[3/4] [FAIL] TestSubscriptError - Test Failed
Error Description: Subscript out of range
Error Line: 40
Source Code: value = arr(5)
[4/4] [PASS] TestSuccessfulProcedure - Test Passed
===== Test Summary =====
Passed: 1/4
Failed: 3/4
文件清单
| 文件名 | 状态 | 描述 |
|---|---|---|
vba_test_runner.py |
✅ 完成 | 主脚本,包含所有类 |
demo.xlsm |
✅ 完成 | 测试目标文件(不修改) |
create_demo.py |
✅ 完成 | 创建演示文件 |
README.md |
✅ 完成 | 项目文档 |
check_vba_access.py |
✅ 完成 | 检查 VBA 访问权限 |
关键技术实现
行号标签机制
VBA 的 Erl 函数会返回最近执行的行号标签:
10 x = 10
20 y = 0
30 result = x / y ' Erl 将返回 30
错误处理模板
On Error GoTo Auto_Err_Handler_{proc_name}
... 原有代码 ...
Call TestLogger.LogSuccess()
Exit Sub
Auto_Err_Handler_{proc_name}:
Call TestLogger.LogError("{proc_name}", Err.Number, Err.Description, Erl)
非侵入式测试
- 使用
wb.api.Close(False)不保存更改 - 原始 Excel 文件保持不变
- 代码编织只在内存中执行
使用说明
1. 安装依赖
pip install xlwings pywin32
2. 启用 VBA 项目访问
- 打开 Excel
- 文件 > 选项 > 信任中心
- 信任中心设置 > 宏设置
- 勾选"信任对 VBA 工程对象模型的访问"
3. 运行测试
# 测试单个过程
python vba_test_runner.py demo.xlsm Module1 TestSuccessfulProcedure
# 批量测试
python vba_test_runner.py demo.xlsm Module1 TestErrorProcedure TestTypeMismatch TestSubscriptError TestSuccessfulProcedure
已解决的问题
问题 1: VBA 模块命名限制
- 问题: 模块名不能以下划线开头
- 解决: 将
_TestLogger改为TestLogger
问题 2: Exit Sub 语法错误
- 问题: 代码生成
Sub而不是Exit Sub - 解决: 修复条件判断逻辑
问题 3: Excel API 兼容性
- 问题:
wb.close(SaveChanges=False)不支持 - 解决: 使用
wb.api.Close(False)
问题 4: Unicode 编码
- 问题: Windows 控制台不支持 Unicode 字符
- 解决: 使用 ASCII 字符
[PASS]和[FAIL]
核心价值
- 精确报错: 从"发生意外"到"第30行:result = x / y"
- 自动化测试: 批量执行多个 VBA 宏
- 非侵入式: 不污染原始代码文件
- 易于使用: 简单的命令行界面
扩展方向
- 支持类模块和窗体模块
- 支持参数化测试
- 生成 HTML 测试报告
- 集成到 CI/CD 流程
- 支持远程 Excel 实例
总结
该系统成功实现了 VBA 自动化测试与精确报错功能,通过代码编织技术解决了传统 VBA 调试的痛点。所有测试场景均已验证通过,系统稳定可用。