如何对嵌入式软件进行单元测试

C语言单元测试工具Ceedling介绍+快速入门 摘要:Ceedling是一个基于Ruby的C语言单元测试框架,集成了常用工具链。安装需先配置Ruby环境和GCC编译器,通过gem安装。使用步骤包括:创建项目目录并初始化,生成src和test文件夹;测试文件遵循test_前缀命名规则,需包含Unity测试框架头文件;使用CMock处理外部依赖,通过IgnoreAndReturn(忽略输入)或ExpectAndReturn(精确匹配)模拟函数行为。示例演示了测试add和mul函数,其中mul测试通过mock隔离了add函数依赖。最后用ceedling tes 阅读详情
AI摘要

本文介绍了如何利用ceedling框架对嵌入式软件进行单元测试。ceedling集成了Unity、CMock和CException,提供了自动化配置与测试流程。文章详细讲解了安装步骤、配置文件设置、测试代码编写及常用打桩宏的使用方式,并给出了执行测试用例的方法。

    ceedling就是一款嵌入式软件测试框架。ceedling是一个用ruby语言编写的C语言自动化测试框架,它集成了Cmock、Unity和Cexception等多个开源项目。在整个ceedling框架中,使用unity进行代码测试,使用CMock生成模拟函数,使用CException进行异常处理,ceedling本身可以理解为对这三个框架的整合,提供自动化配置、操作等,简化开发。

一 ceedling安装步骤

ceedling使用ruby开发脚本,使用gcc工具链编译,因此需要安装ruby和gcc。

(1)首先安装ruby。ruby安装包见《rubyinstaller-devkit-3.0.2-1-x64.zip》

(2)安装 gcc。拷贝文件夹《mingw64》拷贝到目录C:\Program Files\下。之后把路径C:\Program Files\mingw64\bin添加到系统环境变量中。

验证:gcc --version

(3)安装ceedling,执行命令gem install ceedling,执行此命令需要连接外网。安装完毕验证:ceedling version

(4)安装gcovr。执行命令pip install gcovr,用命令gcovr --help来验证gcovr安装是否成功。

二 ceedling配置

 ceedling是通过project.yml来进行配置。project.yml解释如下:

#项目元数据

:project:

  :use_exceptions: FALSE           # 是否启用 C++ 异常(C 项目一般 FALSE)

  :use_test_preprocessor: TRUE    # 是否对测试文件也跑一遍预处理器

  :use_auxiliary_dependencies: TRUE

  :build_root: build              # 所有中间文件、目标文件、测试可执行文件都会放到 build/

  :test_file_prefix: test_        # 测试源文件必须 test_ 开头(可改)

# 路径配置

:paths:

  :test:

    - test/**                    # 递归搜索 test 目录下所有测试文件

  :source:

    - src/**                     # 被测源码

  :include:

    - inc                        # 公共头文件

    - mocks                      # 手动桩或额外包含路径

- third_party/cmsis/include  # 第三方库

#工具链定义

:tools:

  :test_compiler:

    :executable: gcc             # 可执行文件名(Windows 用 gcc.exe)

    :arguments:

      - -std=c11                 # C 语言标准

      - -Wall

      - -Wextra

      - -Werror                  # 把告警当错误

      - -Wno-unused-parameter    # 针对 Unity 生成代码的告警

      - -I"${':include'}"        # 展开 :paths:include 里的路径

      - -I"${':source'}"

      - -DUNITY_INCLUDE_CONFIG_H # 告诉 Unity 使用 Ceedling 生成的配置

# 全局宏定义

:defines:

  :common: &common_defines       # 定义锚点,后面可以引用

    - UNIT_TEST

    - DEBUG=1

  :test:

    - *common_defines            # 引用锚点

    - TEST                                    # 仅在测试编译时生效

  :release:

    - *common_defines

- NDEBUG                                  # 发布版本去掉 assert

# CMock 配置

:cmock:

  :mock_prefix: mock_            # 生成的桩文件名前缀

  :when_no_prototypes: :warn     # 如果头文件没有函数原型就告警

  :enforce_strict_ordering: TRUE # 是否严格要求函数调用顺序

  :includes:

    - stddef.h                   # 每个桩文件都强制包含的头

    - stdint.h

  :treat_inlines: :include       # 也 mock 声明为 static inline 的函数

  :treat_externs: :exclude       # 不自动 mock extern 变量

  :plugins:

    - :ignore                    # 支持 ignore_args

    - :callback                  # 支持 callback 插件

- :expect_any_args           # 支持 ExpectAnyArgs

#Unity 配置

:unity:

  :use_param_tests: FALSE

  :fixture:

    :plugins:

      - stdout_gtest_like

# 插件(gcov / bullseye / xml 报告等)

:plugins:

  :enabled:

    - gcov                       # 覆盖率报告

    - xml_tests_report           # 生成 JUnit XML 给 CI

    - stdout_pretty_tests_report # 彩色命令行输出

  :gcov:

    :reports:

      - HtmlDetailed             # 生成 html

    :gcovr:

      :html_medium_threshold: 75 # 覆盖率 75% 以上标绿

      :html_high_threshold: 90

# 环境变量

:environment:

  - :path:

      - C:\tools\mingw64\bin    # Windows 下额外 PATH

三 如何使用ceedling编写测试代码

  1. 在某一目录(英文目录)下,执行如下命令:

ceedling new my_project

目录结构自动生成如下所示:

my_project

├─ src/               # 放被测源码

├─ test/              # 放测试文件

├─ project.yml        # 配置文件

把你要测试的源文件(例i2c_dw_core.c)拷贝到src/目录下,并且i2c_dw_core.c的头文件导入更换为:

#include "i2c_dw_core.h"

#include "i2c_dw_core_cmock.h"

  1. 新建文件i2c_dw_core.h,内容如下所示:

#ifndef I2C_DW_CORE_H

#define I2C_DW_CORE_H

#include "base.h"

# 如下函数声明是待测函数的声明

int i2c_dw_init_master(struct dw_i2c_dev *dev);

void i2c_dw_xfer_msg(struct dw_i2c_dev *dev);

#endif

(3)新建文件i2c_dw_core_cmock.h内容如下所示:

#ifndef I2C_DW_CORE_CMOCK

#define I2C_DW_CORE_CMOCK

# 如下函数声明是需要打桩的函数的声明

void __i2c_dw_disable_nowait(struct dw_i2c_dev *dev);

void rt_completion_done(struct rt_completion *completion);

#endif

(4)在src/目录下新建文件base.h(所有待测源文件的数据类型定义可以共用base.h),内容如下:

#ifndef BASE_H

#define BASE_H

# 开始添加待测文件用到的所有数据类型的定义

typedef unsigned int UINT32;

#endif

(5)生成文件test_i2c_dw_core.c,并在此文件中编写测试代码

执行命令ceedling module:create[i2c_dw_core]

在test/目录下,打开文件test_i2c_dw_core.c进行测试代码编写。

首先在#include "i2c_dw_core.h"语句后添加如下一条语句: #include "mock_i2c_dw_core_cmock.h"

开始编写测试代码。。。

四 ceedling常用打桩宏及其用法

一般用前四个

(1)Func_Ignore()

  彻底忽略型

  Func要求:无返回值,如有返回值则不能使用此宏。有无入参均可。

  源文件调用多少次都放行。

(2)Func_IgnoreAndReturn(ret)

  忽略入参,但固定返回ret

  Func要求:有返回值。有无入参均可。

  源文件调用多少次都放行。

(3)Func_Expect(arg1, arg2, …)

  Func要求:无返回值,有入参。

  这个宏作用是告诉 CMock “下一次调用 Func 时,实参必须完全等于括号里的值,否则测试立即失败”。参数按位置逐一比较。

  此宏只能匹配一次调用(调用后就被“消耗”掉)。

  如果函数还有返回值,需用 Func_ExpectAndReturn(arg1, arg2, …, ret)

(4)Func_ExpectAndReturn(a,b,ret)

  Func要求:有返回值,有入参。这个宏作用是期望下一次调用的参数必须严格匹配括号里的值,并且让调用返回ret。参数个数、顺序、值都必须完全一致

  此宏只能匹配一次调用(调用后就被“消耗”掉)。

(5)当入参指针把结果写回给调用者时用如下宏 
  函数名_ReturnThruPtr_形参名

(6)Func_ExpectAnyArgs()

  Func要求:无返回值,有入参。

  这个宏作用是告诉 CMock“下一次调用 Func 时,不管传什么参数,都算通过”。

  只能匹配一次调用(调用后就被“消耗”掉)。

(7)Func_ExpectAnyArgsAndReturn(ret)

  Func要求:有返回值,有入参。

  这个宏作用是告诉CMock:“下一次调用 Func 时,参数完全无所谓,但必须返回ret”。

  此宏只能匹配一次调用(调用后就被“消耗”掉)。

五 执行单元测试用例

以管理员身份打开windows终端,然后进入工程目录my_project

执行如下命令:

ceedling clean

ceedling test:test_i2c_dw_core.c   #仅执行测试代码文件test_i2c_dw_core.c

ceedling gcov:test_i2c_dw_core.c   #生成测试报告,测试报告在目录my_project\build\artifacts\gcov\gcovr下。

运行所有测试用例: ceedling test:all

针对所有用例生成测试报告:ceedling gcov:all

六 配置文件样例

链接:https://download.youkuaiyun.com/download/wanglei200708/91860164

[软件测试]-Ceedling安装步骤(Windows) 官网下载Ruby,使用rubyinstaller-devkit-2.7.2-1-x64版本;下载完成后一直点击下一步(注意勾选安装向导中添加到Path选项),安装完成后在cmd检测是否安装成功; 阅读详情

相关推荐

基于Ceedling的嵌入式软件单元测试

如果你使用 Ceedling(一个针对 C 代码单元测试的构建管理器),可以更方便地管理测试。Ceedling 会自动处理 Unity 和 CMock 的集成,无需手动编写Makefile。

xb565517830的博客 1312

嵌入式单元测试框架之Ceedling

Ceedling Ceedling 是一个用 Ruby 语言编写的自动化测试框架,一个 C 项目构建系统,是对 Ruby Rake 的一个延申。Ceedling 主要目标是以测试为驱动的 C 语言开发,集成CMock、Unity、CException三个开源项目。 1.环境搭建 1.1 Ruby环境 Windows下,我们使用官方的RubyInstaller安装Ruby环境。RubyInstaller Archives Link <-----,选择合适的Ruby版本。 PS C:\Users\z0

weixin_44128977的博客 3697

Tessy — 嵌入式软件单元测试/ 集成测试工具

Tessy源自戴姆勒- 奔驰公司的软件技术实验室,由德国Hitex 公司负责全球销售及技术支持服务,是一款专门针对嵌入式软件进行单元/ 集成测试的工具。它可以对C/C++ 代码进行单元、集成测试,可以自动化搭建测试环境、执行测试、评估测试结果并生成测试报告,其多样化的测试用例导入生成方式和与测试需求关联的特色,使Tessy 在测试组织和测试管理上也发挥了良好的作用。目前Tessy广泛应用在汽车电子...

黑马程序员广州中心的专栏 6491

ceedling安装以及简单的使用(上)

使用ceedling框架测试代码,介绍了ceedling的安装以及简单的测试

zichuanning520的博客 4100

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

摘要:论述软件测试工具winAMS、CasePlayer2在嵌入软件单元测试中的应用。介绍了软件测试工具的功能、代码插装原理、测试环境搭建、覆盖率测试、测试数据取得等相关技术研究及经验总结。 关键词:winAMS、CasePlayer2、嵌入式软件、单元测试、代码插装、测试环境、覆盖率 覆盖率专家winAMS源自日本gaio公司,gaio公司创始于1980年,公司早期开发编译器,随后开发了基于源代码分析和模拟技术的嵌入式软件测试工具。公司还有工程服务业务,为主要汽车制造商、大型汽车零部件供应商提供基于模

fzm5298的博客 2432

Tessy — 嵌入式软件单元测试/ 集成测试工具学习

集成测试则在单元测试的基础上验证单元之间接口的正确性。基于越早发现bug 开发成本越低的原则,在进行代码功能验证的过程中,按照V 流程右半部分先完成单元测试再进行集成测试的测试顺序更为有效。另外,Tessy 也可以满足各类标准( 如ISO26262、IEC61508、EN 50128/50129 等)对测试的需求,比如Tessy 可以满足ISO26262 中各等级对单元/ 集成测试的要求,当然Tessy 本身也通过了TUV 的认证,证明该软件是安全可靠的,可以在安全相关的软件研发过程中使用。

2301_76922922的博客 1745

嵌入式--->ceeding(UT嵌入式自动化测试工具),使用过程详解(保姆级)

文章目录搭建环境1.安装Ruby2.安装Ceeding3.安装gcc 搭建环境 1.安装Ruby 在https://rubyinstaller.org/上下载安装Ruby并将其bin路径添加到系统环境变量PATH中,而后开启命令窗口使用 ruby -v #检测是否安装成功 2.安装Ceeding ceedling是在ruby gem镜像源中的一个软件,我们打开命令窗口输入一下指令来在ruby的安装路径中添加ceedling组件。 gem install ceedling 3.安装gcc 为了在windo

qq_42069216的博客 1万+

Ceedling:基于RubyRake的C项目构建和测试系统

吊顶 Ceedling是用于C项目的构建系统,是Ruby的Rake(make-ish)构建系统的扩展。 Ceedling还通过集成 , 和使C语言中的TDD(测试驱动开发)-如果您要用C语言创建的代码,那么您将无法三个的开源项目。 Ceedling还可以通过方便的插件机制进行扩展。 使用说明文件 文档和许可证信息存在 入门 首先,请确保Ruby已安装在您的系统上(如果尚未安装)。 然后,在命令提示符下: > gem install ceedling (为打算成为开发人员的人准备的替代安装) > git clone --recursive https://github.com/throwtheswitch/ceedling.git > cd ceedling > bundle install # Ensures you have all RubyGems needed > git su

[开发工具]基于 Ceedling 的嵌入式软件单元测试

此时编译测试文件,会在 `build/test/mocks` 目录下生成 `mock_apm32f4xx_dal_gpio.h` 头文件,里面包含了所有在 `apm32f4xx_dal_gpio.h` 头文件中的函数的 mock 函数。可以看到 CMock 为每个函数生成了一系列的宏定义,比如 `DAL_GPIO_WritePin_Ignore()`、`DAL_GPIO_WritePin_Expect()`、`DAL_GPIO_WritePin_ReturnThruPtr_GPIOx()` 等。

ic2121的博客 926

使用Ceedling自动化测试C程序 UT_Ceeding.pdf

使用Ceedling自动化测试C程序 UT_Ceeding.pdf

C语言嵌入式测试框架:Ceedling实现硬件模拟驱动测试.pdf

该文档【C语言嵌入式测试框架:Ceedling实现硬件模拟驱动测试】共计 57 页,文档支持目录章节跳转同时还支持阅读器左侧书签大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。C 语言,作为编程界的常青树,凭借高效性能与底层操控能力,成为系统软件、嵌入式开发的核心语言。其简洁语法与强大扩展性,不仅是程序员入门的不二之选,更为操作系统、游戏引擎等奠定技术基石,历经数十年依然在计算机技术领域占据不可撼动的地位。更多精品资源请访问 https://blog.youkuaiyun.com/ashyyyy/article/details/146464041

TESTBEDTBRUN嵌入式软件单元测试工具:确保嵌入式软件质量与稳定性

TESTBEDTBRUN嵌入式软件单元测试工具:确保嵌入式软件质量与稳定性 【下载地址】TESTBEDTBRUN嵌入式软件单元测试工具 TESTBED/TBRUN是一款专为嵌入式软件单元测试设计的强大工具,以其高效性和易用性赢得了开发者的广泛好评。它能够显著提升测试效率,确保软件的质量和稳定性。TESTBED/TBRUN...

gitblog_06735的博客 460

ROS2_IGH方案配置(二)——Ubuntu22.04 实时内核性能验证与调优

本文详细介绍了在Ubuntu22.04系统上配置ROS2_IGH方案时,如何验证和调优PREEMPT_RT实时内核性能。通过使用cyclictest工具进行基准测试和压力测试,分析中断与硬件延迟,并优化内核参数,确保系统满足工业控制领域对硬实时性的苛刻要求。文章还提供了针对ROS2的特殊优化建议和性能监控方案,帮助开发者实现毫秒级延迟的稳定控制。

weixin_30791095的博客 222

嵌入式软件单元测试的必要性、核心方法及工具深度解析

‌,成为高安全嵌入式软件开发的核心工具。其价值不仅在于缺陷检测,更通过可量化的覆盖率数据驱动开发过程优化,实现质量左移(Shift-Left)的工程目标‌。WinAMS 是日本 GAIO TECHNOLOGY 公司专为嵌入式系统开发的自动化测试工具,其核心能力聚焦于 ‌。‌,尤其适用于汽车电子、工业控制等高安全要求领域‌。WinAMS 凭借 ‌。

fzm5298的博客 1736

论文选题难?7种AI加持的万能选题法(全专业通用+工具实测)

AI时代学术选题新范式:7大智能方法破解研究痛点 传统选题方法面临范围失控、资料难寻、创新不足三大痛点,本文提出AI赋能的7种选题方法论: 1.现象+群体法:自动抓取热点与人群特征 2.理论+场景法:经典理论与新兴场景匹配 3.技术+问题法:前沿技术与领域痛点结合 4.对比+变量法:时空维度与变量关系分析 5.热点+理论法:事件传播与理论深挖融合 6.微调+变量法:已有选题变量置换创新 7.AI全流程法:关键要素智能迭代生成 同时警示AI使用的伦理边界,需规避虚构文献、伪造数据等风险,并提供针对本科生、研究

Conan_0728的博客 1879

简单初识 Material Point Method(MPM)

简单初识 Material Point Method(MPM):先介绍了Lagrangian和Eulerian,并简单介绍了MPM Method

qq_45776432的博客 7366

嵌入式软件单元测试资源文件介绍:助力嵌入式软件质量提升

嵌入式软件单元测试资源文件介绍:助力嵌入式软件质量提升 【下载地址】嵌入式软件单元测试资源文件介绍 本资源文件为嵌入式软件开发者提供了全面的单元测试指导,涵盖框架设计、接口使用及实践建议。C语言在嵌入式领域广泛应用,单元测试是确保软件稳定性的关键。通过本手册,开发者可深入理解单元测试框架的架构与工作原理,掌握各类接口的使...

gitblog_06701的博客 424

配置xen上VM混杂模式,使其能捕获物理网络流量

本文目的:配置VM和xen相应的物理网卡(pif)和虚拟网卡(vi

LeoDuo的专栏 3720

嵌入式软件单元测试工程模版化

单元测试工程模版

fanchenxinok的专栏 1922

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

通信算法之334:无人机侦测-DJI 大疆云哨接收机系列

【代码】通信算法之334:DJI 大疆 云哨接收机算法流程。

leegang12的专栏 843

TESTBED/TBRUN嵌入式软件单元测试工具

TESTBED/TBRUN嵌入式软件单元测试工具 【下载地址】TESTBEDTBRUN嵌入式软件单元测试工具 TESTBED/TBRUN是一款专为嵌入式软件单元测试设计的强大工具,以其高效性和易用性赢得了开发者的广泛好评。它能够显著提升测试效率,确保软件的质量和稳定性。TESTBED/TBRUN的设计理念是简化测试流程,...

gitblog_06747的博客 450

Python爬虫:抓取外卖平台餐厅菜单、价格与评价数据

美团外卖:国内领先的外卖平台之一,提供餐饮外卖、超市配送等服务。饿了么:另一大主流外卖平台,覆盖广泛的餐饮品类。等:国际性的外卖平台。在本文中,我们将以美团外卖为例,展示如何抓取餐厅的菜单、价格和评价等数据。我们会使用Python的爬虫库,如Scrapy和Selenium,来解决抓取任务。本文详细介绍了如何使用Python爬虫抓取外卖平台上的餐厅菜单、价格、评价等信息。我们展示了如何使用Scrapy和Selenium抓取静态与动态网页数据,如何清洗和存储数据,并讨论了如何应对外卖平台的反爬虫机制。

2201_76125261的博客 1498

嵌入式软件单元测试 的必要性和心得

随着科技飞速发展,国内制造发生了翻天覆地的变化。但是中国虽然是制造大国,却还不是制造强国,在汽车制造方面,还是日系德系天下。为什么提到国产汽车,想到的是汽车质量问题?虽然国内汽车发展很快,但是各方面还不成熟,为了节约成本,或者为了赶进度,选择了最新的芯片,却忽略了各种配套的测试。汽车制造是一个系统工程,更是关乎生命安全的国家支柱产业。没有必要为了突出某方面的新奇,而忽略了整体的稳定性...

fzm5298的博客 1253

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文件夹对话框代码/重新生成三维图代码/导出工程图代码)之详细攻略 目录 基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用 1、调用SW的模型,并进行参数修改 1.1、VB按钮之SW的三维零件之间切换思想 1.2、调用SW 2、基础案例经验 2.1、设计SW的拉

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3035

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于winAMS、CasePlayer2嵌入式软件单元测试

摘要:论述软件测试工具winAMS、CasePlayer2在嵌入软件单元测试中的应用。介绍了软件测试工具的功能、代码插装原理、测试环境搭建、覆盖率测试、测试数据取得等相关技术研究及经验总结。 关键词:winAMS、CasePlayer2、嵌入式软件、单元测试、代码插装、测试环境、覆盖率 覆盖率专家winAMS源自日本gaio公司,gaio公司创始于1980年,公司早期开...

fzm5298的博客 738

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: python中如何判断对象是否为空
下一篇: 一个优秀软件应该具备哪些特性
wanglei200708
博客等级 码龄14年 112粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值