0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式C单元测试框架unity-初体验

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-08 10:42 次阅读

本文转自公众号,欢迎关注

嵌入式C单元测试框架unity-初体验 (qq.com)

前言

嵌入式领域,尤其是MCU领域,一般很少有使用单元测试框架,一般就是开发阶段开发人员按照自己的习惯和经验进行自测,然后就是系统集成测试,所以一般在单元测试这一环做的不是很规范。实际上我们在开发中应该要改善这种现状,加强单元测试的管理,避免单元测试纯凭开发人员是否有时间做,做到什么程度也是随缘。应该由测试来保证开发质量,避免依赖于个人,并且积累测试用例库,这样有助于产品迭代稳定,尤其是在BSP等领域,有一个好的测试框架和测试用例集能很好的完成芯片的验证,和生产测试等工作。

恰好有这样一个框架,专为嵌入式领域纯粹的C测试而生-unity,使用ANSI C编写,移植性好,资源占用少,就一个C文件和h文件,可以通过h进行一些配置,特别适合MCU开发等领域。

官网

http://www.throwtheswitch.org/

http://www.throwtheswitch.org/unity

下载源码

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

或者

https://github.com/ThrowTheSwitch/Unity/archive/master.zip

使用

http://www.throwtheswitch.org/unity

这个页面可以看到基本的介绍,浏览一下就知道个大概了,

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

下的README.md也可以先看一下。

先不管细节,不需要了解很多,不管三七二十一先用了再说。

这里使用某个MCU的开发板,MDK环境进行测试。

我们这里使用源码中的example_1进行测试。

添加代码

将下载的源码Unity\\src下的unity.c,unity.h,unity_internals.h

Unity\\examples下的unity_config.h

放到自己工程的unity目录下,这一部分是unity源码

Unity\\examples\\example_1\\src下的所有文件放置到自己工程的src目录下,这一部分是用户代码需要测试的

Unity\\examples\\example_1\\test下的所有文件放置到自己工程的test目录下,这一部分是测试代码

图片

配置头文件包含路径

添加上述几个文件夹到头文件包含路径

图片

依赖

默认依赖打印输出函数putchar

见unity_internals.h中

#ifndef UNITY_OUTPUT_CHAR


/* Default to using putchar, which is defined in stdio.h */


#include < stdio.h >


#define UNITY_OUTPUT_CHAR(a) (void)putchar(a)


#else


/* If defined as something else, make sure we declare it here so it's ready for use */


#ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION


extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION;


#endif


#endif

我们要根据自己的情况进行移植,

unity_config.h中配置以下宏,其中RS232_putc在我们自己的代码中实现

图片

注意:需要在unity_internals.h中#define UNITY_INCLUDE_CONFIG_H 1

或者在工程配置中定义宏UNITY_INCLUDE_CONFIG_H,才会使用unity_config.h

比如MDK工程中设置

图片

如果已经实现了标准输入输出重定向,有putchar则不需要使能这些宏,直接使用putchar。

测试1

example_1中有两个测试,一个是源码带2的一个是不带2的。

代码中

先将带2的相关代码不进行编译

图片

将TestProductionCode_Runner.c中的main函数名改为testrunner_main

在自己工程的main函数中调用该函数(先 extern int testrunner_main(void);申明下函数)

运行程序打印如下

test/TestProductionCode.c:20:test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode:PASS


test/TestProductionCode.c:33:test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken:FAIL: Expected 1 Was 0


test/TestProductionCode.c:41:test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue:PASS


test/TestProductionCode.c:51:test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain:PASS


test/TestProductionCode.c:61:test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed:FAIL: Expected 0x00001234 Was 0x00005A5A


-----------------------


5 Tests 2 Failures 0 Ignored


FAIL

图片

测试2

使用带2的代码

图片

TestProductionCode2_Runner.c中main函数名改为testrunner2_main

在自己的代码中调用

testrunner2_main

先 extern int testrunner2_main(void);申明该函数

运行看到输出如下

test/TestProductionCode2.c:20:test_IgnoredTest:IGNORE: This Test Was Ignored On Purpose


test/TestProductionCode2.c:25:test_AnotherIgnoredTest:IGNORE: These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet


test/TestProductionCode2.c:30:test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented:IGNORE


-----------------------


3 Tests 0 Failures 3 Ignored


OK

图片

总结

以上可以看到,unnity进行单元测试十分方便,移植也很简单,先进行一个初体验,后面再详细介绍其使用和设计原理。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16022

    浏览量

    343694
  • 嵌入式
    +关注

    关注

    4983

    文章

    18295

    浏览量

    288597
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28592
  • Unity
    +关注

    关注

    0

    文章

    126

    浏览量

    21541
收藏 人收藏

    评论

    相关推荐

    winAMS--嵌入式软件单元测试/集成测试工具

    /集成测试工具.winAMS是将通过交叉编译生成的原始代码作为评价代码,具有使用芯片仿真器进行仿真功能的测试工具.不仅可以对C语言编写的程序进行逻辑水平的测试,还可以对
    发表于 09-05 11:28

    适合于嵌入式系统的C语言单元测试框架是什么

    适合于嵌入式系统的C语言测试框架CUNIT本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.说明主流语言都有
    发表于 12-15 08:10

    如何搭建嵌入式C语言单元测试自动化框架

    关于嵌入式C语言单元测试自动化框架的搭建思路
    发表于 12-15 07:35

    Tessy嵌入式软件单元测试/ 集成测试工具的相关资料分享

    Tessy — 嵌入式软件单元测试/ 集成测试工具本文章向大家介绍Tessy — 嵌入式软件单元测试/ 集成
    发表于 12-21 07:11

    嵌入式需不需要单元测试

    前言嵌入式行业摸爬滚打这几年,遇见有规范单元测试的项目寥寥无几。归根到底,无非是公司希望快速迭代出产品,有问题等客户反馈再说。当然,也有人认为是嵌入式行业都是小而美的产品居多,没有到一定...
    发表于 12-21 08:16

    如何在.NET单元测试中使用嵌入式资源

    目录介绍背景使用代码下载源22.4 KB介绍有时,单元测试的逻辑要求使用嵌入到库中的资源。最有可能的是,该文件保留了黑盒的初始数据,并已通过单元测试进行了测试。这篇文章将展示如何使用这
    发表于 12-21 07:31

    STM32CubeMX添加功能代码加入Unity单元测试工程

    文章目录前言STM32CubeMX添加功能代码加入Unity单元测试工程链接微信公众号前言昨天被师兄问起程序单元测试的问题, 顿时一脸懵逼, 啥? 单元测试. 折腾了一天, 用
    发表于 01-10 08:10

    单元测试/集成测试自动化工具--WinAMS

    CoverageMasterwinAMS : 适用于嵌入式目标机代码的单元测试/集成测试工具全面支持嵌入式微机!验证嵌入式
    发表于 06-17 18:26

    如何提高嵌入式软件单元测试效率

    在本指南中,您将学习如何通过在更短的时间内运行更多的测试来增加您的单元测试吞吐量。 这种效率的提高来自于使用虚拟平台而不是物理硬件作为开发平台。 本指南对任何开发或运行嵌入式软件单元测试
    发表于 08-28 06:31

    嵌入式需要单元测试吗?

    前言 嵌入式行业摸爬滚打这几年,遇见有规范单元测试的项目寥寥无几。归根到底,无非是公司希望快速迭代出产品,有问题等客户反馈再说。当然,也有人认为是嵌入式行业都是小而美的产品居多,没有到一定量级之前
    的头像 发表于 10-23 16:08 2066次阅读

    慕课嵌入式系统(第六章.单元测试5)

    慕课电子科技大学.嵌入式系统.第六章.嵌入式软件系统.单元测试50 目录6 嵌入式软件系统6.4 单元测试56.4.1课堂重点6.4.2
    发表于 10-20 19:21 4次下载
    慕课<b class='flag-5'>嵌入式</b>系统(第六章.<b class='flag-5'>单元测试</b>5)

    慕课嵌入式系统(第二章.单元测试2)

    慕课电子科技大学.嵌入式系统.第二章.嵌入式硬件系统(第一部分.单元测试20 目录2 嵌入式硬件系统(第一部分)2.6 单元测试22.6.1
    发表于 10-20 22:06 3次下载
    慕课<b class='flag-5'>嵌入式</b>系统(第二章.<b class='flag-5'>单元测试</b>2)

    慕课嵌入式开发及应用(第二章.单元测试)

    慕课苏州大学.嵌入式开发及应用.第二章.入门与软件框架.单元测试0 目录2 入门与软件框架2.10 单元测试2.10.1 课堂重点2.10.
    发表于 11-02 19:21 15次下载
    慕课<b class='flag-5'>嵌入式</b>开发及应用(第二章.<b class='flag-5'>单元测试</b>)

    慕课嵌入式开发及应用(第一章.单元测试)

    慕课苏州大学.嵌入式开发及应用.第一章.基础与硬件.单元测试0 目录1 基础与硬件1.1 单元测试1.1.1课堂重点1.1.2测试与作业2 下一章0 目录1 基础与硬件1.1
    发表于 11-02 21:06 17次下载
    慕课<b class='flag-5'>嵌入式</b>开发及应用(第一章.<b class='flag-5'>单元测试</b>)

    用在嵌入式开发中的单元测试框架

    在更受限制的环境(例如用 C 编写的嵌入式系统)中进行单元测试的人来说,这组丰富的功能可能会令人生畏。 但是单元测试的重要之处在于测试,而不是
    的头像 发表于 03-27 10:08 681次阅读