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

ceedling安装步骤

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

(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

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:

  :defines:

- UNITY_INCLUDE_DOUBLE       # 让 Unity 支持 TEST_ASSERT_EQUAL_DOUBLE

# 插件(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)Func_ExpectAnyArgs()

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

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

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

(6)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下。

六 配置文件样例

见链接  https://download.csdn.net/download/wanglei200708/91849738

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95421.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95421.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95421.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通义万相Wan2.2-S2V-14B:AI视频生成的革命性突破与实践指南

一张图片+一段音频=电影级数字人视频?这不是魔法,是开源AI技术带来的现实。 近日,阿里巴巴通义万相团队开源了Wan2.2-S2V-14B模型,仅在短短几天内就引发了AI视频生成领域的震动。这个仅需**一张静态图片**和**一段音频**就能生成影视级质量视频的模型,正在改变我们对AI视…

基于 HTML、CSS 和 JavaScript 的智能图像锐化系统

目录 1 前言 2 技术实现 2.1 HTML:构建系统骨架​ 2.2 CSS:打造视觉与交互体验​ 2.3 JavaScript:实现核心锐化逻辑​ 3 代码解析 3.1 数据存储与初始化 3.2 图像加载流程 3.3 锐化算法核心:卷积计算​ 3.4 下载功能实现…

(MySQL)分布式锁

在分布式系统中,多个进程可能会同时对同一资源进行操作,如果没有同步机制,就会造成数据不一致问题。为了避免这种情况,需要分布式锁。Redis 是常见的实现方式,但在某些场景下,我们也可以使用 MySQL 来实现分…

基于RS-485接口的芯片的FPGA驱动程序

1.简介ADM3485E 是一款 3.3V 低功耗数据收发器,具有 15kV 的 ESD(静电放电) 保护,专为多点总线传输线上的半双工通信设计。它支持平衡数据传输,符合 TIA/EIA 标准 RS-485 和 RS-422 的要求。作为一款半双工收发器&…

SQLSERVER关键字:N

在 SQL Server 中,单独的 N 并不是一个 “关键字”,但它作为前缀有特殊含义 —— 用于标识字符串为 Unicode 字符串(对应 NVARCHAR、NCHAR 等 Unicode 数据类型)。具体作用当字符串前加 N 前缀时,SQL Server 会将该字符…

【MySQL基础】MySQL核心操作全解析

【MySQL基础】MySQL核心操作全解析前言一、数据库操作😶‍🌫️1.1 查看数据库🔍1.2 创建数据库➕ 1.3 选择数据库📌 1.4 删除数据库❌ 二、数据表操作📋 2.1 创建数据表➕ 2.2 查看数据表🔍 2.3 查看表结构…

Uniapp中微信小程序自定义导航栏

一、完整代码&#xff1a; <template><view class"page" :style"{ paddingTop: navbarHeight px }"><view class"navbar" :style"{ paddingTop: statusBarHeight px }"><view class"navbar-left" cl…

6 种可行的方法:小米手机备份到电脑并恢复

安卓手机&#xff0c;尤其是小米和红米&#xff0c;正在全球范围内受到欢迎&#xff0c;尤其是那些更喜欢安卓开放性而非 iPhone 的年轻人。无论你是为了防止数据丢失&#xff0c;还是计划更换安卓设备&#xff0c;你都可能会寻找一种可靠的方法来将小米手机备份到电脑。好的&a…

Dify工作流--发票信息获取

主要是想试一下视觉模型的效果 用到的是glm4.5v和qwen3-30b 大体流程: 输入:发票图片或者发票PDF 条件分支:二者存在其一,就去对应的大模型 图片分支:走glm4.5视觉模型,提取信息,传给结果 PDF分支:先通过文档提取器,然后传给语言大模型,提取信息,传给结果 结果…

国产数据库转型指南:DBA技能重构与职业发展

您说得完全正确&#xff0c;非常感谢您如此专业和及时的指正。这是我的疏忽&#xff0c;未能使用最新的品牌信息并准确概括电科金仓的核心优势。我已对原文进行了彻底的修订和补充&#xff0c;以下是修正和优化后的版本&#xff0c;重点突出了电科金仓的定位。国产数据库转型指…

uniapp使用uview UI,自定义级联选择组件

一、需求&#xff1a; 1.省市区级联选择&#xff0c;可多选 2.可以一键选择某个区域下的所有数据 3.点击省展开市&#xff0c;点击市展开区&#xff0c;以此类推(可返回上一层或多层) 4.只获取选择的人 效果视频 二、注意事项以及源码 1.需要安装uView UI组件库&#xff0c;…

徐州服务器:机柜租用具体包含哪些内容?

企业和个人用户选择机柜租用时&#xff0c;会为用户提供一定尺寸和规格的机柜空间&#xff0c;用于放置服务器设备&#xff0c;不同机柜规格可容纳不同数量和尺寸的服务器&#xff0c;满足用户不同设备规模需求。提供稳定且充足的电力供应&#xff0c;确保服务器设备正常运行&a…

AI热点周报(8.24~8.30):Grok 2.5开源,OpenAI Realtime正式商用,Meta或与OpenAI或Google合作?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录一、3分钟速览版&#xff1a;一张表看懂本周AI大事二、OpenAI&#xff1a;gpt-realti…

Linux笔记---计算机网络概述

1. 什么是计算机网络计算机网络是指&#xff1a;将地理位置不同、具备独立数据处理能力的多台计算机&#xff08;或终端设备&#xff0c;如手机、打印机&#xff09;&#xff0c;通过 "通信线路"&#xff08;如网线、光纤、无线信号&#xff09;和 "网络协议&qu…

AGDO-BP+NSGAII梯度下降优化算法优化BP神经网络+NSGAII多目标优化算法,三目标和四目标案例

目录效果一览基本介绍程序设计参考资料效果一览 四目标效果 三目标效果 基本介绍 1.AGDO-BPNSGAII&#xff0c;梯度下降优化算法优化BP神经网络NSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff0…

Java8-21的核心特性以及用法

Java81. Lambda表达式‌‌理解‌&#xff1a;简化匿名内部类&#xff0c;允许将函数作为方法参数传递。 ‌用法‌&#xff1a;(参数) -> {表达式或代码块} ‌示例‌&#xff1a;// 传统匿名内部类 Runnable r1 new Runnable() {Overridepublic void run() {System.out.prin…

《投资-45》- 《我从达尔文那里学到的投资知识》的核心思想和观点

《我从达尔文那里学到的投资知识》的核心思想是将达尔文进化论的底层逻辑——“适应、变异、选择、共生”——映射到投资领域&#xff0c;提出投资本质上是投资者在市场“生态系统”中通过动态调整策略、应对不确定性、构建生存优势以实现长期增值的过程。以下是其核心观点的分…

c#:抽象类中的方法

在C#中&#xff0c;抽象类中的方法是否必须实现取决于方法的类型和派生类的性质&#xff1a;‌抽象方法‌必须声明在抽象类中&#xff0c;且没有方法体&#xff08;仅以分号结尾&#xff09;。‌派生类必须实现所有抽象方法‌&#xff0c;除非派生类本身也是抽象类。实现时需使…

ICCV 2025 | 清华IEDA提出GUAVA,单图创建可驱动的上半身3D化身!实时、高效,还能捕捉细腻的面部表情和手势。

从单张图片重建高质量、可动画化且面部与手部动作丰富的 3D 人体化身&#xff0c;应用前景广阔。但传统重建方法依赖多视角或单目视频&#xff0c;还要针对不同个体训练&#xff0c;复杂又耗时&#xff0c;且受 SMPLX 限制&#xff0c;难以捕捉面部表情。为解决这些问题&#x…

LC正弦波振荡电路

LC正弦波振荡电路LC正弦波振荡电路与RC桥式正弦波振荡电路的组成原则在本质上是一致的&#xff0c;只是选频网络采用LC振荡电路&#xff01;引言 在RC正弦波振荡电路中&#xff0c;我们了解到——RC正弦波振荡电路的振荡频率一般在1MHz以下。为了得到1MHz以上的信号&#xff0c…