stm32|分享几个开源的测试框架(代码片段)

嵌入式大杂烩 嵌入式大杂烩     2022-12-01     571

关键词:

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

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

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

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

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

几个开源的测试框架

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

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

1、 Unity测试框架

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

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

目前更新到v2.5.0:

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

2、 CuTest测试框架

CuTest项目链接:

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

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

3、 Embedded Unit测试框架

Embedded Unit项目链接:

https://sourceforge.net/projects/embunit 

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

4、 gtest 测试框架

gtest项目链接:

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

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

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

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

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

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

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

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

Unity的使用分享

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

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

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

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

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

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

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

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

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

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

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

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

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

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

那么输出结果就变为:

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

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

相关书籍

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

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

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

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

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

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

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

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

本笔记的keil工程及以上两本书的电子档可以关注公众号【嵌入式大杂烩】,回复【unity】进行获取。

stm32+lwip:使用stm32cubemx生成项目(代码片段)

...文章:stm32+lwip(一):使用STM32CubeMX生成项目stm32+lwip(二):UDP测试stm32+lwip(三):TCP测试stm32+lwip(四):网页服务器测试stm32+lwip(五):以太网帧发送测试 STM32CubeMX是一个图形化的配置工具,根据用户配置可以生成相应的代码,可以帮助开发... 查看详情

stm32g070rbt6基于arduino框架gpio输入输出模式(代码片段)

...RBT6基于Arduino框架GPIO输入输出模式📌相关篇《【硬件开源电路】STM32G070RBT6开发板》🎈《STM32G070RBT6基于Arduino框架下点灯程序》⛳STM32G070RBT6GPIO输入输出在LQFP-64封装当中,可用的IO引脚数量59个,可以说相当多。在A... 查看详情

stm32单片机系统内存启动方式(an2606文档)分享(代码片段)

STM32单片机系统内存启动方式(AN2606中文文档)分享不管是对于学习STM32还是面对设计STM32电路,阅读这个文档会对你有很大的帮助。409页的文档,几乎涵盖STM32全系列。文档地址:https://www.stmcu.com.cn/Designresource/detail/applic... 查看详情

stm32单片机系统内存启动方式(an2606文档)分享(代码片段)

STM32单片机系统内存启动方式(AN2606中文文档)分享不管是对于学习STM32还是面对设计STM32电路,阅读这个文档会对你有很大的帮助。409页的文档,几乎涵盖STM32全系列。文档地址:https://www.stmcu.com.cn/Designresource/detail/applic... 查看详情

stm32f103c8t6基于arduino框架下利用定时器跑rbg灯闪烁(代码片段)

...架下利用定时器跑RGB灯闪烁🌼演示效果✨在程序示例测试当中发现好多库对STM32系列支持的不够全面,其中原因有STM32固件本身就有缺陷和bug,导致好多库都只能在部分型号中实现。另外测试STM32F1_RTC库,也是只能... 查看详情

stm32f103(十九)adc相关的几个实验—内部温度传感器内部参照电压光敏传感器(代码片段)

...a;STM32F103(十八)ADC总结(5W字)ADC相关的几个实验—内部温度传感器、内部参照电压、光敏电阻一、前言二、内部温度传感器1、原理2、代码实现:3、完整代码1、adc.h代码2、adc.c代码3、main.c4、测试三、内部... 查看详情

stm32f401rct6基于arduino框架点灯程序(代码片段)

STM32F401RCT6基于Arduino框架点灯程序✨经测试,这次跑示例程序没有遇到像STM32F103VET6那样的串口乱码的bug,串口打印正常。📓串口指定方式📋翻阅固件源码可以看到默认的串口是PA3,PA2:C:\\Users\\Administrator\... 查看详情

超好用的手机开源自动化测试工具分享

随着消费者对移动应用使用的占比增加,APP测试越来越被重视!在现已出现的开源移动自动化测试工具中,总结了几个最实用的,希望对大家有帮助:一、Calabash(适用于Android和iOS)Calabash-android是支持android的UI... 查看详情

guilite移植gui例程到stm32(代码片段)

...【GuiLite】移植GUI例程到STM32最近在做Github找到一个有趣的开源Gui框架:GuiLite,按照说明移植了GuiLite到STM32F4OLED屏幕上,分析一下自己的移植经验一、Gui 查看详情

stm32g070rbt6基于arduino框架adc输入电压检测(代码片段)

...0RBT6基于Arduino框架ADC输入电压检测📌相关篇《【硬件开源电路】STM32G070RBT6开发板》📚模数转换器(ADC)📑在STM32G070CB/KB/RB设备中嵌入了一个本地的12位模数转换器。它可以通过硬件采样扩展到16位分辨率。ADC... 查看详情

stm32打印logo(hal库)(代码片段)

本章分享如何用STM32输出LOGO消息先看效果生成工具在白框内自定义你要的文字代码分享/*USERCODEBEGINHeader*//*********************************************************************************@file:main.c*@brief:Mainprogrambody******** 查看详情

stm32cubemx开发01——全新的编程框架(代码片段)

代码使用cubemx工具开发,主要使用了函数指针和结构体方面的知识。程序具有非常具有可移植性,实用性。一、main函数main.c/*USERCODEBEGINHeader*//*********************************************************************************@file:main.c*@brief:Mainprogra 查看详情

stm32g070rbt6基于arduino框架下点灯程序(代码片段)

...M32系列开发环境搭建不在本示例范围内。相关篇《【硬件开源电路】STM32G070RBT6开发板》自制成本不超过10块钱.通过ST-Link烧录演示ST-Link下载ArduinoIDE设置选项通过串口下载通过串口下载前提是已经设置好了nBOOT_SEL和nBoot0默认勾选... 查看详情

arduino框架下stm32全系列开发固件安装指南(代码片段)

Arduino框架下STM32全系列开发固件安装指南目前基于Arduino框架下开发STM32单片机的固件基本都是基于:https://github.com/stm32duino,在此之前的STM32开发固件还有一个比较早期的:https://github.com/rogerclarkmelbourne,不过后者已经... 查看详情

stm32f103vet6基于arduino开发框架下串口和软串口输出乱码解决方案(代码片段)

...rduino开发框架下串口和软串口输出乱码解决方案⛳昨天在测试过程中就已经发现了,后面无意间尝试选择了STM32F10ZET6单片机进行烧录测试,结果串口输出正常了。STM32F10ZET6单片机的话是144引脚的,容量一样,STM32F1... 查看详情

开源电路stm32f401rct6开发板(代码片段)

【开源电路】STM32F401RCT6开发板🌷实物PCBA:🌼优化后的3D效果图📚STM32F401RCT6开发板简介📑主控是LQFP-64封装的STM32F401RCT6芯片,MicroUSB接口供电,功能引脚全部引出,一个REST复位按键,2个按键分... 查看详情

em7028原理

参考技术A本设计分享的是基于EM7028和STM32制作的便携式心率测试仪,并开源其制作的原理图/PCB源文件/HEX文件等。最近这几年运动手环火的不行不行的,运动手环还带有心率检测、血氧检测、计步器、体温等等各种集合检测,然后... 查看详情

基于stm32与esp8266的太空人wifi天气时钟(代码开源)(代码片段)

        前言:本文为手把手教学ESP8266著名开源项目——太空人WiFi天气时钟,不同的是本次项目采用的是STM32作为MCU。两者开发过程中有因为各自芯片的特点(时钟频率,内存大小等),导致开发程序... 查看详情