历史上的今天
返回首页

历史上的今天

今天是:2025年08月11日(星期一)

正在发生

2021年08月11日 | STM32 | 分享几个开源的测试框架

2021-08-11 来源:eefocus

这是一篇测试相关的笔记。我们软件开发最终都离不开测试的,可以通过测试来发现很多问题。在这之前先扯谈一波:


在这给还没找工作的朋友提个醒,能找开发的职位就别找测试的职位,除非你真的很喜欢测试。亲身经历,做测试很不好受。测试其实有两类,一种是自己去测自己测的东西,另一种是去测别人做的东西。如果是第一种,我倒是很愿意做,因为我们本质上还是开发工程师,大概80%的工作时间在做开发,20%的工作时间在测自己开发的东西。这个测试的时间值得花,可以通过测试来发现我们在开发过程中没有注意到的点。如果是第二种,我们本质上就是测试工程师了,大概80%的时间在测别人的东西,20%的时间在想着怎么测别人的东西。如果是这一种的话,那我们就只能当别人的配角了。


找工作时,有一点要注意:有些职位写着嵌入式软件工程师,实则测试工程师,这个得问清楚。


回归正题,下面开始我们的这篇笔记:


几个开源的测试框架

框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。 框架这个广泛的定义使用的十分流行,尤其在软件概念。比如我们套用一些测试框架来测试我们写的一些功能函数,的出来的测试结果大概是这样子的:

======000

从输出结果中看,我们可以清晰地看出测试的情况。下面分享几个开源的测试框架:

1、 Unity测试框架

这里的Unity并不是那个游戏开发工具 ,而是一个开源的测试框架。Unity测试框架的项目链接:

https://github.com/ThrowTheSwitch/Unity/releases1.

目前更新到v2.5.0:

======001

Unity 是一个轻量级的测试框架,它使用 C 语言实现, 代码本身很小 。其代码中大多数是宏定义,所以实际编译后的代码会更小, 比较适合在嵌入式测试应用。


2、 CuTest测试框架

CuTest项目链接:

https://sourceforge.net/projects/cutest/1.

CuTest是一款微小的C语言单元测试框,只有2个文件,CuTest.c和CuTest.h,全部代码加起来不到一千行。麻雀虽小,五脏俱全,测试的构建、测试的管理、测试语句,都全部包含在内。


3、 Embedded Unit测试框架

Embedded Unit项目链接:

https://sourceforge.net/projects/embunit 1.

Embedded Unit是个纯标准c构建的单元测试框架,主要用在嵌入式c的单体测试上,其主要特点是不依赖于任何C的标准库,所有的对象都是静态分配。


4、 gtest 测试框架

gtest项目链接:

https://github.com/google/googletest/releases/tag/release-1.8.01.

gtest 是 google 公司开发的一个开源的单元测试框架,基于 C++开发,可以对 C++语言和 C 语言进行单元测试。 gtest 有以下特点:

  • 提供强大的断言集,支持布尔型、整型、浮点型、字符串以及所有实现了比较运
    算符和输出运算符的自定义类的判断;

  • 提供断言扩展功能,当所需要的断言在 gtest 中没有提供时,可以使用 gtest 提供
    的方法进行扩展;

  • gtest 会自动收集我们的测试用例,开发者不需要对测试用例进行组织;

  • 提供死亡测试的功能,用于测试代码在特定情况下异常崩溃的情况;

  • 可将公共的用例初始化和清理工作放入测试夹具中,由 gtest 自动调用;

  • 使用参数化自动生成多个相似的测试用例

Unity的使用分享

这里分享Unity在STM32平台上的移植与使用(keil工程)。移植的过程很简单,一般这些测试框架都是打印的方式把测试结果输出。在STM32中 ,我们一般是通过串口输出到串口上位机,所以我们在移植Unity的时候,处理好这个问题就可以用在STM32上了。


首先,把Unity源码目录下的unity.c、unity.h、unity_internals.h三个文件复制至我们的工程目录下,并把unity.c添加到我们的keil工程中,然后添加文件路径:

======003

======004

我们打开unity_internals.h文件,发现其有包含一个头文件unity_config.h:

======005

这个文件是配置文件,我们与平台相关的特性放在这个文件中。而这个文件Unity源码中并未提供,所以需要我们自己建立,我这边新建的unity_config.h文件的内容如下:

======006

主要在这里面放了硬件相关的头文件包含以及两个必要的宏定义。第一个宏定义用于重定向输出至串口,第二个宏定义就是我们的串口初始化。

在unity_internals.h中我们发现unity_config.h文件被条件编译屏蔽掉了,我们需要定义宏把它打开:

======007

最后在我们的main.c中包含头文件unity.h即可使用unity测试框架。在unity_internals.h中有很多可修改的配置,比如在不同的平台中,整数的长度是不一样的,在 Unity 中,允许开发者设置整数的长度。如果没有设置, 


下面开始编写测试用例。 在 Unity 中,每个测试用例是一个函数, 该函数没有参数和返回值。下面我们来测试一个闰年判断函数:

======008

在测试函数中用到 TEST_ASSERT_TRUE 和 TEST_ASSERT_FALSE , 是 Unity 实现的两个断言, 用于判断布尔型表达式的值为真或为假。这些测试框架一般都是用断言来进行测试的,包括以上分享的几个框架都是如此。本例中只用到了两个断言,在 Unity 中还有很多断言,如下是部分断言列举:

======009

======010

Unity 默认需要实现用例初始化函数 setUp 和用例清理函数 tearDown,这两个函数均没有参数和返回值。 在闰年判断函数的测试用例中,由于不需要初始化和清理操作,实现的两个函数如下:

======021

在编写了测试用例后, 接下来就可以在 main 函数中运行测试用例。在 Unity 中,使用宏 RUN_TEST 运行测试用例,参数为要运行的测试用例的函数名称。主函数如下:

======011

UNITY_BEGIN函数就是UNITY初始化函数,我们的串口初始化也是在这里面被调用的:

======012

======013

RUN_TEST函数用于运行我们的测试用例。UNITY_END函数就是返回我们的测试结果。最终,运行得到如下结果:

======014

假如,我们把测试闰年的测试函数里的2000改为2001:

======015

那么输出结果就变为:

======016

可以从结果看出没有通过的用例相关的代码所在行。在进行这样子的测试之前,我们当然得要明白我们的功能函数的功能及其预期输出,我们才能去进行测试用例的设计及进行测试。


以上就是关于Unity测试框架的使用分享,这只是这个测试框架的基本使用。有兴趣的、有用得上的朋友可以自己进行深入研究及使用。


相关书籍

第一本书:《软件单元测试入门与实践》周立功

这个Unity测试框架是我在周立功周工几个月前出版的新书《软件单元测试入门与实践》中看到的。之前刚出版的时候,他们有送书活动,我申请了一本纸质版书籍,没来得及看,最近仔细翻了一下,发现还实用,又学到了很多新东西。这不只是一本讲测试的书,也是一本教我们如何调高软件质量的书。书中有理论和实践大概各占一半,介绍了很多实用的工具和技巧。

======017

前面几章很详细地介绍了一些测试相关的知识,比如黑盒测试、白盒测试、灰盒测试、静态测试,动态测试等。介绍了静态测试工具:pc-lint 编码规则检查工具与 SourceMonitor 代码结构检查工具。其中pc-lint可以集成到keil中进行使用。从某种意义上说,PC-Lint 是一种更加严格的编译器,它除了可以检查出一般的语法错误外,还可以检查出那些虽然符合语法要求,但很可能是潜在的、不易发现的错误。

======018

后面几章分享一些实用工具的使用,比如Unity测试框架、cmake自动构建工具、持续集成系统 gitlab 等。


第二本书:《测试驱动的嵌入式C语言开发》尹哲翻译

这本是在周工那本书的参考文献里的其中一本。

======019

======020

这是老外写的书。看目录好像还不错,有空的时候可以当做课外书来读。

以上就是本次的笔记分享,希望各位喜欢!

推荐阅读

史海拾趣

Frolyt Condensers & Elements GmbH公司的发展小趣事

在电子元件领域,Frolyt Condensers & Elements GmbH起初是一家专注于电容器研发的小型制造商。2005年,公司研发团队成功开发出一种新型高性能铝电解电容器,该电容器在耐高温、长寿命和低阻抗方面表现出色,迅速吸引了市场的关注。通过持续的技术创新和严格的品质控制,Frolyt的电容器产品在汽车电子、通信设备等多个领域得到广泛应用,公司因此实现了市场份额的快速增长。

GAPTEC Electronic GmbH & Co. KG公司的发展小趣事

背景:在闪存市场取得成功后,Galaxy Microelectronics开始探索多元化发展道路。

发展:公司决定进入DRAM市场,并投入大量资源进行技术研发。经过几年的努力,Galaxy Microelectronics成功推出了多款高性能DRAM产品,进一步丰富了其产品线。此外,公司还开始涉足SSD固态硬盘领域,推出了多款具有竞争力的产品,进一步巩固了其在存储市场的地位。

Cybernetic Micro Systems公司的发展小趣事

Cybernetic Micro Systems(简称CMS)的创始人李华,是一位热衷于电子技术的天才工程师。他在大学期间就研发出了一款高效能、低功耗的微处理器原型,这一成果引起了业界的广泛关注。毕业后,李华决定创业,将他的研究成果商业化。于是,Cybernetic Micro Systems应运而生,专注于研发和生产高性能的微处理器和配套设备。凭借独特的技术优势,CMS很快在电子行业中崭露头角。

埃派克森微电子(Apexone)公司的发展小趣事

作为一家具有社会责任感的企业,埃派克森微电子在发展过程中始终关注社会公益事业。在四川汶川地震发生后,公司积极发起救援捐赠活动,通过中国扶贫基金会为灾区捐款10万元,帮助受灾民众度过难关。这一行动体现了埃派克森的社会责任感和人文关怀精神,也为公司在社会中树立了良好的形象。

这五个故事展示了埃派克森微电子在电子行业中的发展历程和取得的成就。从创新起步到专利技术的突破与商用,再到业绩的连续增长和国际化步伐的加快,以及积极履行社会责任的公益行动,都充分展现了埃派克森微电子的实力和担当。未来,随着科技的不断进步和市场需求的不断变化,埃派克森微电子将继续保持创新精神,不断提升产品性能和市场竞争力,为电子行业的发展做出更大的贡献。

Flexxon Pte Ltd公司的发展小趣事

2020年新冠疫情的爆发对全球供应链造成了巨大冲击。然而,Flextronics(Flexxon Pte Ltd)凭借其强大的供应链管理和风险管理能力,迅速调整生产计划、优化资源配置、加强员工健康防护,确保了生产线的稳定运行和订单的及时交付。在疫情期间,Flextronics还积极为客户提供远程技术支持和解决方案,助力客户应对市场挑战。这一系列举措不仅展现了公司的韧性和实力,也进一步巩固了其在电子制造服务领域的领先地位。

Cal Crystal Lab Inc / Comclok Inc公司的发展小趣事

随着电子行业的快速发展,技术创新和合作成为了企业发展的重要驱动力。Cal Crystal Lab Inc深知这一点,积极寻求与其他企业的技术合作。通过与国内外知名高校和研究机构的深入合作,公司不断引进新技术、新工艺,提升了产品的技术含量和附加值。同时,Cal Crystal Lab Inc还与其他企业建立了战略合作关系,共同开发新产品、拓展新市场,实现了共赢发展。

问答坊 | AI 解惑

我自己的DSP2812开发板

系统资源 DSP 处理器TMS320F2812 ,最高工作频率150MHz; SHX-DSP2812开发板 DSP 芯片内置18K X 16 位 SRAM, 4K X 16 位BOOT ROM , 1K X 16 位 OPT ROM ; DSP 芯片内置128K X 16 位FLASH; 外扩32k×16bit 的程序RAM,32k×16bit ...…

查看全部问答>

恩智浦Cortex开发板免费申请

恩智浦Cortex开发板免费申请…

查看全部问答>

CMLPECL及LVDS间的互连

希望对大家设计电路有所帮助!…

查看全部问答>

设计一个数码相框具体方案,不知道怎么写!!!!

我最近参加了一个比赛,题目内容如下: 设计一个数码相框具体方案,详细参数如下: 1. 屏幕尺寸: 8.9英寸   2. 屏幕特性: 1024×600,A+级防划伤特丽屏   3. 容量: 8G   4. 视频功能: 支持1920×1080分辨率 ...…

查看全部问答>

TAMPER(中文手册上叫侵入检测)到底有什么用啊?

                                 我一直不清楚TAMPER(中文手册上叫侵入检测)有什么用啊?…

查看全部问答>

launchpad仿真器上有4线JTAG资源吗?

launchpad仿真器上好像也有四线接口啊,那个TP1~TP7,可是没找到TEST,不知可不可以四线仿真呢?…

查看全部问答>

cc2530资料

cc2530相关资料,包括要用的相关软件…

查看全部问答>

为什么Proteus仿真msp430出现这个错误SEH trap C000001D in module'MSP430.DLL;

为什么Proteus仿真msp430出现这个错误SEH trap C000001D in module\'MSP430.DLL; …

查看全部问答>

最近在学lm3s系列

完全不知道肿么入手啊,求书,求经验,求大神赐教啊…

查看全部问答>

【LPC54100】第五周-串口下载中文字库到flash

本帖最后由 shower.xu 于 2015-5-15 14:34 编辑 总觉得时间和口袋里的钱一样,越来越不够用了..... 先把所有帖子做个汇总: 【LPC54100】第一周-分享部分原理图和blink跑起 第一周2-添加一个小显示屏并驱动成功 【LPC54100】第二周-添加按键 ...…

查看全部问答>