首页/新闻资讯/正文详情

Tessy嵌入式C单元测试:边界用例与覆盖率实战

发布时间:2026/11/3 11:01:35 来源:云帆数科 栏目:资讯中心
Tessy嵌入式C单元测试:边界用例与覆盖率实战
简介这份PDF白皮书围绕Tessy单元测试与分类树方法展开面向嵌入式软件测试人员、开发工程师及需要提升单元测试规范性的技术团队重点回应如何系统设计测试用例、执行单元测试并改善软件质量。压缩包仅含1个PDF文件大小约1.87MB便于下载后直接查阅。内容从单元测试在IEC 61508、ISO 26262、Automotive SPICE、IEC 62304等标准中的要求切入结合TESSY工具示例说明被测单元、接口、初始用例、测试执行、故障排查与回归测试流程并逐步讲解分类树方法的测试相关方面识别、分类、重复分类及组合表用例指定配有示例与工具支持说明。已有4876人学习下载适合希望把单元测试从概念落到用例设计与自动化执行的读者参考。1. 从一条边界用例翻车说起Tessy 单元测试能补上什么某嵌入式项目里有个区间判断函数集成测试跑了几轮都正常现场却偶发把上界值当成区间内。回头补一条单元测试用例start5,len2,value7预期返回 0实际返回 1问题当场暴露。Tessy 单元测试就是干这个的围绕 C 函数自动识别接口、组织用例、驱动执行、回收覆盖率并生成报告把这类边界错误按在软件测试的最底层也让软件质量不再只靠集成测试兜底。它适合写嵌入式 C、要过功能安全标准、被集成测试拖慢回归节奏的团队。后面按测试对象、两种执行方式、分类树用例设计、避坑和覆盖率基线拆开讲力求照着能复现。2. 单元测试与模块测试在安全标准里把测试对象定准2.1 unit 和 module 在 C 语言里为什么最后都落到函数安全相关嵌入式软件的标准里模块测试和单元测试经常混着出现。IEC 61508 用 module testingISO 26262 用 unit testingAutomotive SPICE 说 software unitIEC 62304 在 5.5 要求 Software Unit Implementation and VerificationDIN EN 50128 把最低层软件组件叫 moduleISO 13849 的 V 模型也要求模块测试DO-178 则盯低层需求和软件组件验证。术语不同落到 C 语言测试对象基本都是一个函数。ISO 26262 对 unit 的定义是“atomic level software component … that can be subjected to stand-alone testing”翻成工程话就是能单独拉出来测的最小软件组件。IEC 61508 对 module 的定义是“construct that consists of procedures and/or data declarations …”一个 module 里可能有好几个函数但实际项目里最常见还是一个函数对应一个 module。为了避免和 C 的源文件 module 混淆后面统一说 unit指 C 函数。这个定义看着像咬文嚼字实际影响测试边界。比如一个函数只做数值转换入参和返回值都在寄存器/栈上隔离成本低另一个函数读写全局状态、调外设驱动、依赖中断硬把它当 unit 测stub 工作量可能比函数本身还大。我一般会先看函数的接口复杂度纯计算函数优先做单元测试带硬件副作用和全局状态的函数先拆接口再测。标准要求的是验证单元按规格工作不是让测试工具去硬啃一个耦合怪。注意标准里写“模块测试”不等于只能测整个 .c 文件。C 语言里把函数作为 unit 是通行做法前提是接口清单列全全局变量和被调函数都算进广义接口。2.2 接口清单黑盒测试的输入、输出和被调函数单元测试按接口规格做黑盒测试不依赖函数内部结构。接口不只是形参函数读取的变量是输入写入的变量是输出返回值算结果被调函数在广义上也属于接口。一个变量可以同时是输入和输出比如自增计数器。测试用例的结构就是“给输入变量一组具体值断言输出变量和返回值等于预期”。以区间判断函数为例接口表可以这样列变量/元素方向类型约束边界关注点start输入int任意整数负值、0、正值len输入int规格要求 len00、1、大于1、负数非法value输入int任意整数小于 start、等于 start、区间内、等于 startlen、大于上界返回值输出int1 在区间0 不在两个分支都要有预期被调函数广义接口函数按规格返回/写状态正常返回、错误码、副作用Tessy 用源码自动识别接口形参、全局变量、返回值一般都能扫出来。自动识别之后必须人工核对三件事全局变量有没有漏指针参数指向的缓冲区长度按谁算宏和条件编译有没有把接口改掉。指针参数尤其容易翻车工具看到的是指针地址测试数据要按指针指向的类型和长度准备否则用例看着执行了实际只覆盖到前几个字节。接口表不是给工具看的摆设它决定用例设计的上限。输入变量列不全分类树就少一个维度输出断言写少了函数改坏也发现不了。我习惯把接口表贴在测试工程目录里后面加用例、改 stub、做回归都拿它对一遍省得三周后自己都忘了某个全局变量是干嘛的。2.3 什么时候值得做复杂度、调用频次、安全关键三条筛选线单元测试能降低测试复杂度把整个应用里的一小块功能单独拎出来验证也能检查错误敏感输入不只测“正常值”。但它不是所有函数都值得同等投入。白皮书里提到用 McCabe 圈复杂度筛函数我一般再加两条调用频次和安全等级。三条线一起过优先级基本就清楚了。筛选线观察指标建议动作复杂度McCabe 圈复杂度高、分支多、嵌套深优先做单元测试用例按分支和条件组合展开调用频次被多个模块调用、在中断/周期任务里频繁执行优先做回归频率也高安全关键属于安全相关单元、标准要求 SIL/ASIL 对应覆盖必须做覆盖率目标按等级定接口纯度纯计算、少全局状态、少硬件依赖适合做隔离成本低时序交互单元间时序、中断与主循环交互单元测试单独做不完交给集成测试复杂度高但接口很脏的函数常见做法是先重构再测不然 stub 会写成另一个小系统。调用频次高的函数哪怕逻辑简单也值得测因为一旦错了影响面大。安全关键单元没什么好商量的标准要求单元测试和覆盖率省这一步后面审计还得补。单元测试也有边界。它验证不了单元之间的时序交互比如两个任务通过队列传递数据的时序、中断和主循环的竞态这些归集成测试。把单元测试当万能药最后会得到一堆绿色用例和一个仍然偶发死机的系统。筛选的目的不是少测是把测试资源放在能最早暴露缺陷的地方。2.4 谁写用例谁执行分工的现实折中开发者不适合测自己的代码这一点在单元测试里尤其明显。规格要求的功能如果开发者压根没实现他设计用例时也很难想到去测这个缺失功能异常输入、错误处理、边界条件自己写代码时容易顺着自己的实现思路走。外部测试人员来测也有问题大部分时间花在熟悉接口上得搞清楚“绿色”这种抽象输入怎么变成具体 RGB 值还得判断结果变量对不对。折中做法是测试人员按规格写抽象用例和预期结果开发者把抽象值转成具体值并执行。比如测试人员写“输入颜色绿色预期输出亮度等级2”开发者知道绿色对应 RGB(0,255,0)把它填进 Tessy 用例执行。用例失败开发者当场能查实现改完再跑。这个分工把“用例设计基于规格”和“执行基于实现知识”拆开了比让开发者凭空想用例靠谱。交接字段测试人员填开发者填用例 IDUT_RANGE_001不改规格来源需求条目/接口文档核对实现输入抽象值上界值、区间内值具体 start/len/value预期输出返回 0/1、错误码核对断言执行结果不填通过/失败/阻塞缺陷链接不填缺陷单号很多标准要求开发和测试组织分离这种“测试人员设计、开发者执行”的做法不完全满足分离要求实践中也不多见。但它至少把用例设计的规格视角保住了比开发者自己写自己测强。团队小的时候我一般会让另一个人做用例评审哪怕不独立成组也能把“漏实现的功能没人测”这个坑填掉一半。3. 用 Tessy 跑通区间判断单元original-binary 与 test-application 怎么选3.1 被测单元与那个必现的边界错误原始资料里的示例是一个整数区间判断函数给定起点 start 和长度 len判断 value 是否落在start value startlen内只看整数。C 实现常见写法如下/* 判断整数值是否落在 [start, startlen) 区间内 * start: 区间起点 * len: 区间长度规格要求 len 0 * value: 待判断的整数 * 返回: 1 在区间内0 不在区间内 */ int range_contains(int start, int len, int value) { if (value start value (start len)) { /* 边界错误应为 */ return 1; } return 0; }逻辑说明函数有两个分支比较value和区间上下界。错误在第二个比较用了当value start len时会被误判为在区间内。参数说明start和value可以是任意整数len按规格必须大于 0长度非法时函数没有错误码这本身就是接口设计缺口测试时要单独标出来。用start5, len2, value7执行预期返回 0实际返回 1。这个用例不需要跑整个系统也不需要等某个业务流程触发单元测试几秒钟就能暴露。后面所有操作都围绕这个函数展开换成自己的被测函数时接口表和预期值照同样方式替换。3.2 两种执行路径原二进制测试与测试应用测试单元测试有两种常见执行方式。原二进制测试用完整应用编译、链接、烧录都按最终产品来调试器在函数入口下断点应用跑到断点后喂输入数据单步或继续执行到函数结束读输出变量。测试应用测试只把被测单元从原应用里拿出来配一个测试用 main 和启动代码被调函数用 stub 替代编成一个专门的可执行测试应用。| 维度本文还有配套的精品资源点击获取

相关推荐

职场抗AI化:掌握这些工具降低被替代风险
职场抗AI化:掌握这些工具降低被替代风险

1. 项目概述 2026届毕业生即将面临一个全新的就业环境——AI技术正在重塑几乎所有行业的用人需求。作为从业多年的职场观察者,我注意到一个令人担忧的现象:传统岗位正在以每年15-20%的速度被AI工具替代。但与此同时,掌握特定工具技能的求职者… · 2026/11/3 11:01:35

智能物流核心部件:电动辊筒技术创新与应用
智能物流核心部件:电动辊筒技术创新与应用

1. 项目背景:小县城里的智能物流“隐形冠军” 在浙江一个不起眼的县城工业区里,藏着一家年产值过亿的电动辊筒生产企业。每天清晨,2000套电动辊筒从这里发往全国各地的物流分拣中心。这家企业没有豪华的办公楼,却在行业内拥有一个… · 2026/11/3 11:01:35

智能体设计模式:策略、观察者与状态模式实践
智能体设计模式:策略、观察者与状态模式实践

1. 智能体设计模式概述 智能体(Agent)作为人工智能领域的重要概念,已经从早期的简单规则系统发展到如今具备自主决策能力的复杂系统。在构建智能体时,设计模式(Design Pattern)的应用能够显著提升开发效率、… · 2026/11/3 11:01:35

AI不做裁判:无排序无打分讨论系统的设计与实践
AI不做裁判:无排序无打分讨论系统的设计与实践

最近做了件挺反直觉的事:搭了一个专门用来讨论复杂问题的系统,然后把排序、打分、评选“哪个回答更好”这些功能全砍了。标题就叫“AI 不做裁判”,听起来像是行为艺术,但真正跑起来以后,我发现它解决了不少主流讨论平台… · 2026/11/3 17:25:35

同步FIFO设计避坑指南:格雷码、空满逻辑与时序收敛
同步FIFO设计避坑指南:格雷码、空满逻辑与时序收敛

1. 为什么“同步FIFO”不是一句空话,而是一个必须亲手拆开的黑盒子 “同步FIFO”这四个字在数字电路设计文档里出现频率极高,但真正把它从教科书概念变成可复位、可仿真、可上板验证的模块,中间隔着至少三道真实工程门槛:第一道是… · 2026/11/3 17:25:35

Nginx图片代理方案:解决HTTPS混合内容与防盗链问题
Nginx图片代理方案:解决HTTPS混合内容与防盗链问题

1. 项目概述在Web开发中,我们经常会遇到两个棘手的图片加载问题:一是HTTPS站点加载HTTP图片会触发浏览器混合内容警告,二是第三方图片资源站的防盗链机制会阻止图片显示。这两个问题看似简单,但实际解决起来却需要一定的技巧。我最… · 2026/11/3 17:25:35

从七个习惯到四象限:高效能人士的时间管理与目标落地
从七个习惯到四象限:高效能人士的时间管理与目标落地

简介:面向职场人士、在校学生及培训讲师准备的读书分享与主题汇报场景,这份《高效能人士的七个习惯》PPT演讲模板围绕积极主动、以终为始、要事第一、双赢思维四个习惯展开,提供从目标设定、优先级排序到时间管理与互利沟通的内容框架&#x… · 2026/11/3 17:25:35

MOSFET数据手册深度解读:从绝对最大额定值到SOA安全工作区
MOSFET数据手册深度解读:从绝对最大额定值到SOA安全工作区

1. 这不是“读说明书”,而是解码功率开关的DNA你手头那本几十页厚、密密麻麻全是英文缩写和曲线图的MOSFET数据手册,真就只是个“参考文档”?不。它本质上是一份器件级设计契约——制造商用它向你承诺:在特定条件下,这… · 2026/11/3 17:25:35

旋转圆叠加方波动画全解析:从傅里叶级数到Python实现
旋转圆叠加方波动画全解析:从傅里叶级数到Python实现

你肯定刷到过那个画面:一个接一个的圆套着圆,圆心之间互相牵着走,最外圈的小笔尖拖出一条不断延伸的波形,最后硬生生拼出一个棱角分明的方波。这几乎是“傅里叶级数”的官方代言图,我第一次看到时第一反应是“这玩意儿… · 2026/11/3 17:24:34

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码