Tessy这套工具,做嵌入式软件测试的朋友应该都不陌生。它是Hitex(现在属于Vector旗下)出的单元测试和集成测试工具,在汽车电子、工业控制这些对代码质量要求极高的领域,几乎是标配级别的存在。我最早接触Tessy是在做BMS(电池管理系统)的HIL测试时,当时被测控制器里跑的是基于AUTOSAR架构的C代码,为了把每个软件组件的边界值、分支覆盖做扎实,部门统一引进了Tessy。第一次装的时候,真是被它折磨得够呛,光许可证和路径配置就折腾了两天。后来换新电脑、换版本又装过几次,慢慢才摸清了里头的门道。这篇文章就把我反复踩坑后整理出来的安装思路、路径设置经验和排错清单分享出来,特别说明一下,咱们聊的是以正规授权和许可证管理为前提的安装配置流程,不是鼓励大家去搞非法的激活手段,工作里用盗版工具给自己埋雷,完全不划算。
1. 装Tessy之前,先搞清楚它到底是怎么工作的
很多人拿到安装包就急着点下一步,结果装完发现一堆问题。我的建议是先花点时间弄明白Tessy的定位和运行机制,这样后续的很多坑其实是可以提前绕开的。
1.1 Tessy不是普通软件,它是一套测试工作流
Tessy做的事情可以概括成三个字:测C/C++函数。它会把你的源代码自动解析成函数级别的测试对象,然后让你在界面里配置测试用例、输入参数、桩函数(Stub)和期望值,最后自动编译、执行,并生成覆盖率报告。整个过程通常要跟编译器、调试器、目标机甚至版本管理工具联动,所以它本质上是一个测试工作流引擎,而不像记事本那样是个独立软件。
这个定位决定了它的安装逻辑:光装Tessy主程序是不够的,你还得准备一套能正常工作的编译调试环境,并确保两者之间能互相识别。大多数新人在安装阶段翻车,不是Tessy本身坏了,而是它依赖的工具链没有到位。
1.2 常见的部署形态和许可机制
Tessy在Windows和Linux上都有版本,Windows下一般用图形界面(Tessy Desktop),Linux下则更多用命令行版本(Tessy CLI)配合自动化脚本跑回归。汽车行业里最常见的是Windows图形界面加Lauterbach调试器(TRACE32)来做宿主机测试和目标机测试。
许可证这块,Tessy走的是授权服务器机制。合法授权通常分两种:
- 浮动许可证(Floating License):授权装在单位的许可证服务器上,多人共用,客户端通过网络获取授权。
- 单机许可证(Node-Locked License):授权文件绑定某一台机器的硬件信息,只能在这台机器上用。
安装配置的核心任务之一,就是让Tessy客户端正确找到授权服务器地址,或让本机授权服务正常工作。网上说的所谓“破解”,本质上就是绕过这个授权检查机制——风险很大,也不稳定,因为Tessy的许可校验在每次版本升级时都会变化。相比之下,老老实实走正规渠道,跟Vector的代理商要试用License,或者让公司采购正式许可,才是对项目负责的态度。
1.3 版本选型要结合被测代码
Tessy版本很多,比如Tessy 3.x、4.x、5.x甚至更新的版本。不同版本对编译器版本、调试器固件、操作系统位数的支持都不一样。选版本时不能光看新,要看你的被测代码使用的编译器和调试器是否在官方支持矩阵里。比如老项目用的GCC 4.8,而新版Tessy可能只支持GCC 9以上的版本,这时候硬装新版Tessy,在工程解析和编译阶段就会频繁报错。
我个人的建议是:如果项目已经有一台旧电脑能稳定运行某个Tessy版本,先别急着升级;新项目再考虑用新版本,顺便把工具链一起升级。这样可以最大程度避免“为装新工具而改老代码”的尴尬。
2. 安装前的环境准备和选型要点
老话说磨刀不误砍柴工,安装前的准备做得越细,后面的坑越少。这一节我把我在准备阶段的检查清单和测试心得写出来,供你参考。
2.1 操作系统与运行库检查
Tessy在Windows上通常要求64位系统,Windows 10或Windows 11企业版/专业版都可以。但有几个要注意的地方:
- 系统用户名和路径不能有中文。Tessy对路径中的非ASCII字符支持一直不太友好——我见过同事用“.\测试项目\”当工作区路径,结果编译步骤怎么都过不去,改成拼音目录后立刻正常。这一点请务必记住。
- 需要安装Visual C++ Redistributable运行库。Tessy的界面和底层库依赖VC运行时,如果系统是精简版或Ghost版,缺这个库会导致界面闪退或启动报错。
- .NET Framework版本不要太老。Tessy图形界面的部分模块需要.NET 4.5以上,Win10自带一般没问题,Win7的话要特别注意补丁打全。
如果你在Linux下安装,那么发行版版本和glibc版本都要提前查一遍,Ubuntu 18.04和Ubuntu 20.04之间就可能因为glibc版本差异导致安装失败。另外命令行的输出编码也要小心,Tessy CLI默认使用UTF-8,如果一个项目的源码是GBK编码,解析时就会产生乱码路径和函数名。
2.2 配套工具链的准备
Tessy要编译测试代码,所以你必须提前装好编译器。常见组合:
宿主机测试(Host Test):用PC自带的编译器,比如MinGW GCC、MSVC或者Sourcery CodeBench。Tessy其实是把桩函数、测试驱动代码和你写的被测函数放在一起编译生成一个可执行文件,然后在这个可执行文件里跑测试框架。
目标机测试(Target Test):用交叉编译器,比如针对PowerPC、ARM、Renesas RH850等平台厂商提供的编译器。这时Tessy需要通过调试器(比如Lauterbach TRACE32、PLS UDE)下载到目标板,跑完后读回覆盖率数据。
我的经验是:先把编译器通路验证好。也就是在Tessy环境里,你单独执行那个“编译并链接”的命令,应该能成功生成可执行文件,再说测试配置的事。如果这一步都不过,Tessy报错会很让人头大。
2.3 内存和硬盘:比你想象的要吃资源
Tessy在解析大型C文件、生成覆盖率数据时,内存占用相当可观。我之前测一个单文件两万行C代码的模块,Tessy进程占内存超过了4GB,连接到TRACE32跑覆盖率时,最高干到过8GB。所以装Tessy的机器,内存建议至少16GB,少于8GB的话,解析和覆盖率合并那步分分钟卡到你想砸电脑。
硬盘建议留至少50GB的剩余空间,因为Tessy会在工作区里生成中间文件、编译产物、测试报告,一个中型项目的工作区经常能膨胀到10多个GB。放在机械硬盘上的话,首次解析一个大型工程可能得等几分钟,如果换成NVMe固态,体验会好非常多。
2.4 许可证服务器规划
前面说到了浮动和单机两种许可,安装时有一个常见误区:装完主程序后不装许可证客户端,直接打开软件,结果报“Cannot find license”。实际上,绝大多数情况下你不需要自己装许可证服务,只要确保Tessy的许可证配置指向正确的服务器IP和端口(默认一般是某个固定端口或FLEXlm服务端口),并且在防火墙里放行对应端口就行。
如果你是个人电脑上使用,想申请Tessy的试用许可,那就要按照官方流程走:提供你的电脑主机名、MAC地址(物理网卡地址,不是无线网卡的随机地址)等信息,拿到许可文件之后,放到指定目录。这里不得不吐槽一句:Tessy的许可文件和机器码绑定机制非常死板,一旦你换网卡(比如加了USB无线网卡)或者更新了主机名,可能就得重新申请授权。所以建议授权绑定的电脑,BIOS里的网卡别随便换。
3. 安装全流程拆解:从双击安装包到正常打开
这一节是操作实录。我以Windows 10环境、Tessy 4.x版本的安装为例,把过程拆成几个关键步骤,每个步骤里标注容易出错的地方。
3.1 安装前关闭干扰项
双击安装包之前,先做三件事:
退出杀毒软件和Windows Defender实时保护。这不是必要的,但Tessy的安装过程会写注册表、启动服务、释放很多小型工具,某些杀毒软件会对这些行为报毒或拦截,安装到一半卡住甚至回滚的情况我都见过。最稳妥的办法:装完后再开启实时保护,并把Tessy安装目录添加到白名单。
关闭UAC用户账户控制。UAC控制级别调低到“从不通知”再安装,可以减少很多不必要的弹窗。装完记得调回来,不然日常使用其他软件会被骚扰。
断开非必要网络连接。如果电脑连着公司网络,且Tessy安装包是网络部署的,安装时可能会同步触发许可证网络探测。虽然不影响安装,但会拖慢速度。
3.2 安装包解压与目录选择
Tessy的安装包通常是一个自解压或光盘镜像形态,解压后是Setup.exe。这里有一个关键点:安装目录别用默认的“C:\Program Files\Tessy”。装到带空格的Program Files目录下,虽然Tessy官方说支持,但我在实际使用中遇到过一些批处理脚本和编译器路径解析问题,特别是用Makefile方式调用Tessy时,带空格路径需要各种转义,容易出错。
我习惯把Tessy装到类似“D:\Vector\Tessy4x”这样的目录下,全路径无空格、无中文。具体安装步骤:
- 以管理员身份运行Setup.exe。
- 选择语言为英文(Tessy没有官方中文界面,选择中文语言包是没有的)。
- 安装类型选“Custom”,这样可以自行决定装哪些组件。
- 组件勾选时,如果你不确定,就全选。Tessy的组件之间依赖关系很紧密,少装某个插件可能会导致后面加载覆盖率视图时功能缺失。
- 安装过程中如果要求重启,请先重启,再接着后续配置。
我做过的实测是:默认全组件安装耗时大约10-15分钟,装完以后安装目录大概占用3GB左右。
3.3 许可证服务组件配置
安装完成后,桌面会出现Tessy的快捷方式,但先别急着打开。先去许可证配置程序里把授权设置好。
Tessy的许可证配置程序一般叫做“License Manager”或“FlexLM Configuration Utility”,在开始菜单的Tessy文件夹下。打开后有两种配置方式:
- 如果你的单位有许可证服务器:选择“Floating License”,输入服务器主机名或IP,以及端口号,然后点“Apply”应用。
- 如果你拿到的是单机许可文件:选择“Node-Locked License”,导入许可文件(通常是一个.lic文件),软件会自动校验机器码是否匹配。校验不通过会报错,这时就要检查许可证文件里的HostID是否和你电脑当前网卡一致。
这里有一个特别容易踩的坑:Tessy在获取机器码时,可能有多个网卡地址,它默认取的是某一个特定的网卡(一般是第一个物理网卡)。如果你格式化过一次系统或者虚拟机里装过,机器码会变,旧的许可就失效了。所以在申请单机许可前,先看License Manager里显示的HostID是什么,然后把这个HostID发给供应商,别自己单独看ipconfig /all,两者可能不是同一个。
3.4 环境变量配置:合理规划路径的关键步骤
配置完许可证,接着设置环境变量。这步看似简单,但直接决定了Tessy能否找到各类外部工具。
在Windows系统属性里打开“环境变量”,需要关注的变量主要有:
- T_TESSY_HOME:指向Tessy的安装根目录。这个变量很多内部脚本会用到,如果不设置,后续很多自动化操作会失败。
- T_PYTHON_HOME:指向Python安装目录。Tessy 4.x以后的自动化接口依赖Python,如果系统里没装Python,建议装一个Python 3.6或3.8,并配置此变量。注意,Tessy的CLI脚本可能只兼容特定Python版本,装得太新反而会报语法不兼容。
- PATH:把Tessy的bin目录追加到PATH里,这样你在命令行里就能直接调用tessy命令。
设置完环境变量后,最好重启一次电脑,确保所有服务重新加载。不重启的话,有些外部工具还是找不到路径,这是我的血泪教训——当年装完没重启,直接开Tessy,结果编译模块一直提示找不到编译器,排查半天才发现是环境变量没刷新。
3.5 首次启动与工程创建工作区设置
环境变量配好后,双击桌面快捷方式打开Tessy。
首次启动会要求你指定一个工作区目录(Workspace)。这个目录是用来存放Tessy工程文件、测试数据和中间产物的。我强烈建议你不要用默认的“我的文档”,而是建一个独立的目录,比如“D:\TessyWorkspace”。理由有三点:
- 方便备份和迁移。整个Workspace可以打包拷贝到新电脑,Tessy工程打开后直接恢复全部测试上下文。
- 避免系统盘空间膨胀。前文说了Workspace可能很大,放C盘很容易把系统盘塞满。
- 路径长度更短。Tessy内部生成的文件路径嵌套非常深,如果工作区路径本身就很长,一旦超过Windows的MAX_PATH限制,就会出现莫名其妙的文件找不到错误。
启动后,建议立刻做两件事:确认许可证状态界面(Help菜单里的License Info)显示正常的授权信息;然后新建一个空工程跑一遍Tessy自带的Demo例程,验证工具链是否真的通了。
4. 路径设置的完整考虑:为什么路径会影响Tessy的生死
Tessy对路径极度敏感,这几乎是所有使用者的共识。这一节专门讲路径设置,因为这是标题里明确提到的内容,也是实际使用中坑最多的地方。
4.1 Tessy内部工作的几个关键路径
在Tessy里,路径概念贯穿整个测试生命周期,最重要的有这么几类:
- 工作区路径(Workspace Path):所有工程文件的根目录。
- 工程路径(Project Path):具体被测模块的工程文件所在目录。
- 源代码路径(Source Code Path):被测C/C++文件所在的位置,可以手动添加多个路径。
- 头文件路径(Include Path):编译器查找头文件时搜索的目录。这个一定要配全,否则Tessy无法解析函数原型和数据结构,界面上经常出现“未知类型”报错。
- 编译输出路径(Build Output Path):测试代码编译后生成的中间文件和可执行文件的存放目录。
- 报告输出路径(Report Output Path):测试完成后生成的HTML/XML报告存放目录。
你可能会问,为什么Tessy不能自动识别这些路径?答案是——Tessy主要用静态分析方式解析代码,它需要你明确告诉它从哪里读代码、把编译产物写哪里。它不等于IDE,不能像Visual Studio那样靠解决方案文件自动推断所有依赖路径。
4.2 路径设置实操:我个人的组织习惯
我使用Tessy时,习惯按照“工程=>模块=>测试数据”三级结构来管理路径:
D:\TessyWorkspace │ ├── Projects │ ├── ProjectA │ │ ├── Source │ │ │ ├── src │ │ │ └── include │ │ ├── TessyTest │ │ │ ├── data │ │ │ └── report │ │ └── Build │ └── ProjectB └── Common └── StubLib在Tessy工程里设置路径时,我坚持三个原则:
- 全局共享的头文件和桩函数库放在Workspace外的公共目录里,用相对路径或环境变量引用,避免每个工程都复制一份。
- 编译输出路径和报告路径设置成相对路径(相对于工作区),这样项目从一个机器拷到另一台机器时不用改配置。
- 源代码路径可以绝对路径,因为源码往往在版本管理工具的工作副本里,位置会变化,但每次新checkout之后,重新指定一次源码路径是常规操作。
4.3 在Tessy界面里配置源码和头文件路径
Tessy的路径配置入口一般在“Project”菜单或工程属性窗口里。具体做法:
- 右键点击工程名,选择“Settings”进入配置界面。
- 在“Source”选项卡中,添加被测C文件,可以手动输入或通过文件选择器选择。注意,这里添加的是被测源文件,不含测试文件。
- 在“Include Path”选项卡中,把项目里所有头文件的搜索目录加进去。原则是“宁多勿少”——多加几个无效目录最多浪费一点解析时间,少加一个目录可能就直接解析失败。
- 在“Compiler”选项卡中,选择正确的编译器型号,并配置编译选项(比如“-std=c99”)。Tessy会用这里的信息去解析代码和生成测试代码。
一个重要技巧:如果你在Eclipse或者Keil里能成功编译这个模块,那直接把帮助里“显示完整编译命令”的内容复制出来,对照着把Tessy的Include Path补齐。这个方法比一个个目录手动输入要高效得多,也几乎不会漏。
4.4 路径长度、大小写和权限问题
路径设置时还有几个隐蔽问题:
- Windows下路径总长度不要超过200个字符。Tessy生成的辅助文件会在你的路径后面追加几十上百个字符,所以尽可能保持工作区路径短。比如“D:\TSW\ProjA”就比“D:\TessyWorkSpace\AutomotiveProject2024\ControllerSoftware”安全得多。
- Windows文件系统不区分大小写,但Tessy内部部分脚本可能要求头文件路径里的实际文件名大小写与磁盘完全一致。如果遇到头文件找不到,查一下是不是大小写不匹配。
- 工作区目录需要完全读写权限。不要放在“C:\Program Files\”下,也不要放在需要管理员权限才能写的位置。我之前见过有人把Workspace放在Program Files下,结果Tessy生成测试数据时一直报权限错误。
5. 常见问题排查与使用建议
最后把我在安装和早期使用中遇到的典型问题整理出来,做成一个速查表。这些都是被问过无数次的问题,收藏这一份基本能解决大部分初期的坎。
5.1 问题速查表:从启动到编译,逐个击破
| 问题现象 | 可能原因 | 排查思路 |
|---|---|---|
| 启动双击无反应 | 运行库缺失、许可证服务未启动 | 先查Windows事件查看器里有没有异常记录,再查VC运行库是否完整 |
| 报“Cannot find license” | 许可证服务器地址错误、端口不通、授权过期 | 确认License Manager配置、防火墙放行、许可文件是否在有效期内 |
| 解析代码时报“Unknown Type” | 头文件路径不全,解析器找不到类型定义 | 把编译器完整Include路径复制到Tessy设置里 |
| 编译失败,提示编译器无法启动 | 编译器路径配置错误、环境变量PATH未刷新 | 在CMD里试着手动执行编译器命令,先确编译器本身能用 |
| 代码解析后函数列表为空 | 源码文件没有正确添加,或源码语法错误导致解析中止 | 先单独编译源码排除语法问题,再看Tessy日志里解析告警信息 |
| 覆盖率数据为0 | 测试代码编译了但测试可执行文件没真正跑起来 | 检查目标机连接、调试器脚本是否正常加载可执行文件 |
| 生成报告失败 | 报告路径不存在或没有写权限 | 确保报告输出目录存在,或在Tessy里设置为自动创建 |
| 打开已有工程报路径无效 | 工程文件记录的路径是绝对路径,换了机器或移动了目录 | 手工修改工程文件里路径,或重新导入工程并重新指定路径 |
5.2 关于路径设置的一个实用技巧:善用相对路径
使用相对路径能极大提升工程可迁移性。在Tessy里面,“相对路径”是以工作区目录为基准来计算的,而不是以工程文件当前位置为基准。因此,如果你所有测试数据都放在“工作区\ProjectA\TestData”,那相对路径就是“ProjectA\TestData”,不管工作区搬到哪里,只要保持内部结构不变,配置就无需改动。
我之前被这个问题坑过:有一次从服务器拉了一个大工程到本地,因为路径变了,工程里几十个文件路径全部失效。后来花了点时间把所有路径改成相对路径,再把工作区整体打包,换电脑、换同事环境都再没出过路径问题。
5.3 与新工具链配合:先跑Demo工程再跑真实工程
给新手的一个实战建议:拿到Tessy后,先别急着拿公司代码来测,先把Tessy安装目录下的Demo工程完整跑通一遍。
Demo工程的好处是:路径、编译器、测试用例、批处理脚本都已经配置好了,你可以通过它验证工具链是否真的可用。等Demo工程跑通了,再把自己手头的源码引进来,这时如果还报错,问题就只可能是你自己的路径配置或代码兼容性,排查面一下子就缩小了。
我在给团队做Tessy培训时,一直强调一个“三段式”验证法:
- 第一阶段:Demo工程能否编译并执行测试用例,验证Tessy基本安装正确。
- 第二阶段:用自己的代码,但做最简化处理——只测一个简单的无依赖函数,比如计算器里的add()函数,验证源码解析和基本测试链路通。
- 第三阶段:再接入真实的头文件目录、桩函数库、目标机环境,逐步把复杂度加上去。
很多同事跳过前两个阶段直接上真实代码,结果配置了一整天,也不知道到底是自己路径少了还是Tessy安装有问题,白白消耗时间和耐心。
5.4 习惯用CLI做回归测试
当你把Tessy在图形界面下打通了以后,我建议花点时间了解一下Tessy命令行接口(CLI)。原因是:嵌入式软件的单元测试,后期一定会涉及到回归测试,也就是每次代码变更后,都要跑一遍全部测试用例。如果在图形界面里一个个点,效率太低,还容易漏。
Tessy支持通过命令行方式创建工程、导入测试用例、执行测试并导出报告。这意味着你可以把Tessy集成到持续集成流水线(比如Jenkins)里,让服务器自动完成编译、测试、覆盖率统计和报告发布。我自己现在的工作流程就是:本地用Tessy Desktop做用例调试,代码提交后由CI服务器调用Tessy CLI跑全量回归,覆盖率结果直接发到部门内部的质量看板。
用CLI之前,一定要先配好环境变量,特别是T_TESSY_HOME和PATH里能直接找到tessy命令。然后在命令行输入“tessy -help”,确认命令行帮助能正常显示。如果出现找不到Python模块的报错,多半是T_PYTHON_HOME没配对,或者Python版本不兼容。
5.5 测试桩函数和覆盖率相关的一点建议
Tessy里最锻炼人的一个功能是桩函数(Stub)管理。嵌入式代码的依赖特别多,比如一个函数内部调用了底层寄存器读写接口,在宿主机测试时根本没有硬件,这时候你就得给这个底层接口写桩函数。
刚开始接触Tessy的人,容易在桩函数配置上走弯路:给每个被调函数都写一个空桩,结果测试覆盖率非常低,因为很多业务逻辑在桩函数里没返回值,被测函数执行不到完整的分支。
我自己的习惯是:先分析清楚被测函数的依赖关系,把能通过输入参数直接控制的分支尽量用真实代码跑,必须打桩的接口再写一个返回“正常情况”的桩,然后在用例里再补几个异常场景,让桩返回错误码。这样既保证了测试覆盖率,又不会让桩函数数量爆炸到没法维护。特别注意:桩函数的返回值必须与真实接口的数据类型保持一致,否则Tessy在编译阶段会报类型不匹配错误,这个错误信息往往比较隐蔽,指向的并不是真正的桩函数,而是某个头疼的头文件里漏了#include。
5.6 频繁切换版本时的注意事项
后期如果机器上装了多个Tessy版本(比如一个老项目用4.2,一个新项目用5.0),要注意环境变量的切换。T_TESSY_HOME、PATH中的bin目录指向哪个版本,决定了你跑命令行时用的是哪个Tessy。我曾经因为PATH里多个版本顺序不对,导致CLI脚本调用了老版本,结果生成的工程文件被老版本读了一遍,再打开时封面和工程信息全部错乱。
如果你有多个Tessy版本并存的场景,最好给每个版本做一个独立的命令行调用批处理脚本,脚本内部动态设置这个版本对应的环境变量和PATH,避免互相干扰。
一点个人心得
Tessy这款软件,功能强大,但入门门槛确实被安装配置拉高了一截。我见过不少人第一次用的时候,光装环境就耗了一整天,甚至因为许可证和路径问题直接放弃,回到手工编写单元测试的原始状态。其实只要按照这套思路来:装前检查环境、理解路径体系、先跑Demo、再逐步接入真实工程,整个过程是可以控制在两三个小时之内的。
最后再分享一个我自己的小习惯:每次配置完Tessy环境,我都会把环境变量的截图、安装目录说明、License Manager的配置界面截图,整理成一个内部的安装记录文档,放到团队共享盘。等哪次有人在新电脑上再装Tessy,直接把这份文档拉出来照着做就行,省得每次从零开始回忆。这也是我写这篇文章的初衷,希望它能成为你的一份参考。