1. 项目概述
Tessy作为一款专业的嵌入式单元测试工具,在汽车电子、工业控制等领域有着广泛应用。但在实际使用过程中,即使是经验丰富的测试工程师也难免会遇到各种"坑"。这篇指南是我在三年Tessy使用过程中踩过的各种报错问题的经验总结,尤其针对那些官方文档没有明确说明,但实际项目中必然会遇到的典型问题。
不同于基础操作手册,本文聚焦于"报错解决"这个痛点场景。我将从环境配置、用例设计、测试执行、结果分析四个维度,梳理出12类高频报错场景。每个案例都包含错误现象还原、根因分析、解决方案三个部分,并附上我验证过的具体操作步骤。这些内容都是通过真实项目踩坑后提炼的实战经验,能帮助测试人员节省至少50%的问题排查时间。
2. 核心问题解析
2.1 环境配置类报错
2.1.1 编译器路径配置错误
现象:执行测试时提示"Compiler not found"或"Invalid compiler path"
根因分析:
- Tessy需要调用原生编译器(如GCC、IAR)生成测试桩
- 项目迁移或多人协作时容易遗漏编译器路径配置
- 路径中包含中文或特殊字符时可能解析失败
解决方案:
- 检查Tessy菜单栏:Options → Compiler → Selected compiler
- 确认路径指向真实的编译器可执行文件(如arm-none-eabi-gcc.exe)
- 对于网络路径,建议映射为本地驱动器(如Z:盘)
- 路径中避免使用空格和中文
踩坑记录:某次在路径中使用"Program Files"导致空格解析异常,改为PROGRA~1后解决
2.1.2 许可证校验失败
现象:启动时弹出"License check failed"或"Invalid license"
根因分析:
- 浮动许可证服务器地址变更
- 本地时钟与服务器不同步
- 防火墙拦截了许可证验证端口
解决方案分三步走:
- 检查license.dat文件中的SERVER行是否指向正确IP
- 在CMD执行
net time \\许可证服务器IP同步时间 - 在防火墙添加例外端口(通常为27000-27009)
2.2 测试用例设计类报错
2.2.1 桩函数参数不匹配
现象:执行时报"Stub parameter mismatch"或"Invalid argument count"
典型场景:
c复制// 被测代码
int sensor_read(uint8_t id, float* value);
// 测试桩错误实现
int sensor_read_stub(uint8_t id) { ... } // 缺少第二个参数
解决方法:
- 在Tessy的Stubs界面勾选"Auto-validate parameters"
- 使用#pragma声明函数原型:
c复制#pragma TESSY stub sensor_read prototype int(uint8_t, float*)
- 对于可变参数函数,需要特殊处理:
c复制#pragma TESSY stub printf prototype int(const char*, ...)
2.2.2 内存越界检测失效
现象:数组越界操作未触发错误报告
根因分析:
- 未开启内存保护选项
- 数组边界检查粒度设置过大
配置步骤:
- Project Settings → Debug → Memory Protection → 勾选"Check array bounds"
- 调整检查粒度(建议4字节对齐):
ini复制[Memory]
Alignment=4
2.3 测试执行类报错
2.3.1 多线程死锁
现象:测试用例执行卡死,日志显示"Waiting for mutex"
调试方法:
- 在Tessy中启用线程调试视图:
View → Debug Windows → Thread Status - 添加互斥锁超时检测:
c复制#pragma TESSY mutex_timeout 5000 // 5秒超时
- 对于递归锁,需要特别标注:
c复制#pragma TESSY mutex_recursive
2.3.2 浮点精度差异
现象:相同用例在不同平台结果不一致
解决方案:
- 统一设置FPU精度模式:
c复制#pragma TESSY fpu_precision double
- 允许误差范围断言:
c复制TEST_ASSERT_FLOAT_WITHIN(0.001, expected, actual);
2.4 结果分析类报错
2.4.1 覆盖率数据异常
现象:覆盖率报告显示未覆盖的已执行代码
排查步骤:
- 检查编译器优化选项,建议使用-O0
- 确认.gcno和.gcda文件生成路径正确
- 执行合并命令:
bash复制tessycli coverage --merge --input=*.gcda --output=total.cov
2.4.2 XML报告生成失败
现象:导出报告时提示"Invalid XML format"
解决方法:
- 检查特殊字符转义:
xml复制<description><![CDATA[变量值: &123;]]></description>
- 设置编码声明:
c复制#pragma TESSY report_encoding UTF-8
3. 高级调试技巧
3.1 实时变量监控
在测试执行过程中,通过Watch窗口动态修改变量值:
- 右键点击变量 → Add to Watch
- 在Value列直接输入新值(支持表达式)
- 对于指针变量,使用地址访问:
code复制*(int*)0x20001000 = 42
3.2 条件断点设置
在循环体中设置条件断点避免频繁暂停:
- 右键断点 → Condition...
- 输入触发条件(如
i > 100) - 支持Hit Count(如每10次循环暂停)
3.3 自动化错误注入
通过脚本模拟硬件异常:
python复制# tessy_error_inject.py
import tessy
tessy.set_register("PC", 0xFFFF0000)
tessy.trigger_exception("HardFault")
在Tessy中配置Pre-test Hook调用该脚本。
4. 性能优化建议
4.1 并行测试配置
- 修改tessy.ini启用多核:
ini复制[Execution]
MaxThreads=4
- 按模块拆分测试套件:
c复制#pragma TESSY test_suite module1 parallel
#pragma TESSY test_suite module2 parallel
4.2 增量测试策略
- 只重新运行修改过的用例:
bash复制tessycli run --changed-only
- 基于代码变更选择测试集:
bash复制tessycli select --git-diff HEAD~1
5. 常见问题速查表
| 错误现象 | 可能原因 | 快速检查点 |
|---|---|---|
| 测试用例卡死 | 死锁/无限循环 | 查看Thread Status视图 |
| 覆盖率0% | 编译选项错误 | 检查-fprofile-arcs参数 |
| 桩函数未调用 | 链接顺序错误 | 调整Stub Link Order |
| 浮点结果不一致 | FPU配置差异 | 统一设置#pragma fpu_precision |
| 内存访问错误 | 越界/未初始化 | 启用Memory Protection |
最后分享一个血泪教训:每次升级Tessy版本后,务必重新验证所有测试桩的兼容性。某次从4.2升级到4.3时,由于ABI变化导致指针传递方式改变,花了整整两天才定位到这个问题。现在我的团队严格执行版本变更时的全量回归测试流程。