如何對嵌入式軟件進行單元測試

? ? 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…