Tessy单元测试入门:从零开始构建你的第一个测试项目
当第一次接触单元测试工具时,那种面对复杂界面的茫然感我至今记忆犹新。Tessy作为一款专业的嵌入式单元测试工具,其功能强大但学习曲线确实不低。本文将带你用最简单的方式迈出第一步——从一个"Hello World"级别的Demo开始,在30分钟内完成从环境搭建到生成第一份覆盖率报告的全过程。
1. 环境准备与基础配置
1.1 安装Tessy
Tessy的安装过程相对直接,但有几个关键点需要注意:
- 访问官方下载页面获取最新安装包
- 运行安装向导时,建议选择默认路径
- 安装完成后首次启动会提示许可证配置
对于个人学习者,可以申请30天的试用许可证。企业用户则需要通过正规渠道获取商业许可证。
安装完成后,你会看到主界面分为几个主要区域:
- 左侧是项目导航窗口
- 中部是代码和测试编辑区
- 右侧是各种视图切换面板
1.2 创建最小化测试项目
点击菜单栏的File > New Project,在弹出的对话框中:
- 为项目命名(例如
FirstTessyDemo) - 指定项目存储路径
- 保持其他选项为默认值
提示:初学者建议为每个测试demo创建独立文件夹,避免文件混乱
2. 构建最简单的测试案例
2.1 准备被测函数
我们先从一个极其简单的函数开始测试。创建一个名为demo.c的文件,内容如下:
/* 判断数值是否在指定范围内 */ int is_in_range(int value, int min, int max) { if (value >= min && value <= max) { return 1; } return 0; }对应的头文件demo.h:
#ifndef DEMO_H #define DEMO_H int is_in_range(int value, int min, int max); #endif2.2 导入源代码到Tessy
在Tessy项目中右键点击Test Collections,选择New Module:
- 命名为
RangeCheck - 在
Sources标签页添加刚创建的demo.c和demo.h - 点击
Check Source验证代码解析是否成功
如果一切正常,你会在输出窗口看到Source check successful的提示。
3. 设计并执行测试用例
3.1 创建测试集合
右键点击刚创建的RangeCheck模块,选择New Test Collection,命名为BasicTests。这时Tessy会自动分析源代码,列出所有可测试的函数。
3.2 编写第一个测试用例
在TDE(Test Data Editor)视图中:
- 选中
is_in_range函数 - 点击
New Test Case按钮 - 为测试用例命名(如
NormalRange) - 设置输入参数:
- value = 5
- min = 1
- max = 10
- 设置预期输出(Expected Result)为1
再添加一个边界测试用例:
- 名称:
LowerBoundary - 输入参数:value=1, min=1, max=10
- 预期输出:1
3.3 执行测试并查看结果
点击工具栏上的Run按钮,Tessy将:
- 编译测试代码
- 执行所有测试用例
- 在CV(Coverage View)中显示结果
成功的测试用例会显示绿色标记,失败的则显示红色。我们的简单示例应该全部通过。
4. 分析覆盖率与生成报告
4.1 理解覆盖率指标
切换到CV视图,你会看到类似如下的覆盖率数据:
| 覆盖率类型 | 百分比 |
|---|---|
| 语句覆盖率 | 100% |
| 分支覆盖率 | 100% |
| MC/DC | 100% |
这个简单例子达到了完全覆盖,但在实际项目中很少见。
4.2 添加更多测试提升覆盖率
为了演示覆盖率分析,我们故意让测试不完整。删除LowerBoundary测试用例后重新运行,覆盖率视图将显示:
分支覆盖率: 50% 未覆盖分支: value < min的情况这直观展示了测试的不足之处。
4.3 生成简易测试报告
Tessy提供多种报告格式,最简单的操作是:
- 点击菜单
Report > Generate Report - 选择
Standard Report模板 - 指定输出路径为项目文件夹下的
reports目录 - 点击
Generate
报告将包含:
- 测试用例执行结果
- 覆盖率统计
- 未覆盖的代码位置
5. 项目结构与最佳实践
5.1 推荐的项目目录结构
随着项目复杂度的增加,良好的目录结构能显著提高可维护性:
MyTessyProject/ ├── src/ # 被测源代码 ├── tests/ # 测试代码 ├── tessy/ # Tessy项目文件 ├── reports/ # 生成的报告 └── README.md # 项目说明5.2 测试命名规范
清晰的命名有助于快速理解测试意图:
[被测对象]_[测试条件]_[预期结果] 示例: isInRange_NormalValue_ReturnsTrue isInRange_ValueBelowMin_ReturnsFalse5.3 常见问题排查
当遇到问题时,可以检查以下几点:
源代码无法解析:
- 确认头文件路径正确
- 检查编译器设置是否匹配实际环境
测试用例不执行:
- 确保测试集合已正确关联到模块
- 检查测试用例是否被禁用(灰色标记)
覆盖率数据不准确:
- 清理并重新构建项目
- 确认没有过滤掉任何代码文件
6. 从Demo到真实项目
6.1 逐步增加复杂度
掌握基础后,可以尝试测试更复杂的函数:
/* 计算数组平均值 */ float calculate_average(int *array, int size) { if (array == NULL || size <= 0) { return 0.0f; } int sum = 0; for (int i = 0; i < size; i++) { sum += array[i]; } return (float)sum / size; }这个函数引入了:
- 指针参数
- 边界条件检查
- 循环结构
- 浮点运算
相应的测试用例设计也需要考虑这些方面。
6.2 测试驱动开发(TDD)实践
Tessy也支持测试先行的开发方式:
- 先定义函数原型(在.h文件中)
- 创建空函数实现(返回默认值)
- 在Tessy中设计测试用例
- 实现函数逻辑直到所有测试通过
这种方法能确保代码从一开始就是可测试的。
6.3 持续集成中的Tessy
在企业环境中,Tessy通常被集成到CI/CD流程中。基本配置包括:
- 创建批处理脚本执行测试
- 设置Tessy命令行参数
- 配置生成JUnit格式的报告
- 与Jenkins等工具集成
一个简单的执行脚本示例:
@echo off set TESSY_PATH="C:\Program Files\Tessy\bin\tessy.exe" set PROJECT_FILE=MyProject.tpr %TESSY_PATH% -x %PROJECT_FILE% -r "report.xml" -f "FullTestSuite"7. 进阶技巧与资源
7.1 使用测试夹具(Test Fixtures)
对于需要复杂初始化的测试,可以创建共享的setup/teardown函数:
/* 在测试代码中 */ void setup() { // 初始化数据库连接等资源 } void teardown() { // 清理资源 }在Tessy中配置这些函数作为模块的初始化和清理钩子。
7.2 参数化测试
当需要测试大量相似用例时,可以使用Tessy的参数化测试功能:
- 创建包含测试参数的CSV文件
- 在TDE中导入该文件
- Tessy会自动为每行数据生成测试用例
7.3 调试失败的测试
当测试失败时,可以:
- 查看详细的执行日志
- 使用Tessy内置的调试器单步执行
- 检查实际输出与预期的差异
注意:调试时需要确保构建配置包含调试信息
7.4 学习资源推荐
要进一步掌握Tessy,可以参考:
- 官方文档(特别是"Getting Started"部分)
- 内置的示例项目
- 专业培训课程(针对企业用户)
- 用户论坛中的案例分享