RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式C單元測(cè)試框架unity-初體驗(yàn)

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-06-08 10:42 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注

嵌入式C單元測(cè)試框架unity-初體驗(yàn) (qq.com)

前言

嵌入式領(lǐng)域,尤其是MCU領(lǐng)域,一般很少有使用單元測(cè)試框架,一般就是開發(fā)階段開發(fā)人員按照自己的習(xí)慣和經(jīng)驗(yàn)進(jìn)行自測(cè),然后就是系統(tǒng)集成測(cè)試,所以一般在單元測(cè)試這一環(huán)做的不是很規(guī)范。實(shí)際上我們?cè)陂_發(fā)中應(yīng)該要改善這種現(xiàn)狀,加強(qiáng)單元測(cè)試的管理,避免單元測(cè)試純憑開發(fā)人員是否有時(shí)間做,做到什么程度也是隨緣。應(yīng)該由測(cè)試來保證開發(fā)質(zhì)量,避免依賴于個(gè)人,并且積累測(cè)試用例庫(kù),這樣有助于產(chǎn)品迭代穩(wěn)定,尤其是在BSP等領(lǐng)域,有一個(gè)好的測(cè)試框架和測(cè)試用例集能很好的完成芯片的驗(yàn)證,和生產(chǎn)測(cè)試等工作。

恰好有這樣一個(gè)框架,專為嵌入式領(lǐng)域純粹的C測(cè)試而生-unity,使用ANSI C編寫,移植性好,資源占用少,就一個(gè)C文件和h文件,可以通過h進(jìn)行一些配置,特別適合MCU開發(fā)等領(lǐng)域。

官網(wǎng)

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

這個(gè)頁面可以看到基本的介紹,瀏覽一下就知道個(gè)大概了,

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

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

先不管細(xì)節(jié),不需要了解很多,不管三七二十一先用了再說。

這里使用某個(gè)MCU的開發(fā)板,MDK環(huán)境進(jìn)行測(cè)試。

我們這里使用源碼中的example_1進(jìn)行測(cè)試。

添加代碼

將下載的源碼Unity\\src下的unity.c,unity.h,unity_internals.h

Unity\\examples下的unity_config.h

放到自己工程的unity目錄下,這一部分是unity源碼

Unity\\examples\\example_1\\src下的所有文件放置到自己工程的src目錄下,這一部分是用戶代碼需要測(cè)試的

Unity\\examples\\example_1\\test下的所有文件放置到自己工程的test目錄下,這一部分是測(cè)試代碼

圖片

配置頭文件包含路徑

添加上述幾個(gè)文件夾到頭文件包含路徑

圖片

依賴

默認(rèn)依賴打印輸出函數(shù)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

我們要根據(jù)自己的情況進(jìn)行移植,

unity_config.h中配置以下宏,其中RS232_putc在我們自己的代碼中實(shí)現(xiàn)

圖片

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

或者在工程配置中定義宏UNITY_INCLUDE_CONFIG_H,才會(huì)使用unity_config.h

比如MDK工程中設(shè)置

圖片

如果已經(jīng)實(shí)現(xiàn)了標(biāo)準(zhǔn)輸入輸出重定向,有putchar則不需要使能這些宏,直接使用putchar。

測(cè)試1

example_1中有兩個(gè)測(cè)試,一個(gè)是源碼帶2的一個(gè)是不帶2的。

代碼中

先將帶2的相關(guān)代碼不進(jìn)行編譯

圖片

將TestProductionCode_Runner.c中的main函數(shù)名改為testrunner_main

在自己工程的main函數(shù)中調(diào)用該函數(shù)(先 extern int testrunner_main(void);申明下函數(shù))

運(yùn)行程序打印如下

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

圖片

測(cè)試2

使用帶2的代碼

圖片

TestProductionCode2_Runner.c中main函數(shù)名改為testrunner2_main

在自己的代碼中調(diào)用

testrunner2_main

先 extern int testrunner2_main(void);申明該函數(shù)

運(yùn)行看到輸出如下

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

圖片

總結(jié)

以上可以看到,unnity進(jìn)行單元測(cè)試十分方便,移植也很簡(jiǎn)單,先進(jìn)行一個(gè)初體驗(yàn),后面再詳細(xì)介紹其使用和設(shè)計(jì)原理。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17123

    瀏覽量

    350975
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304791
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    639

    瀏覽量

    29185
  • Unity
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    21806
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    適合于嵌入式系統(tǒng)的C語言單元測(cè)試框架是什么

    適合于嵌入式系統(tǒng)的C語言測(cè)試框架CUNIT本文博客鏈接:http://blog.csdn.net/jdh99,作者:jdh,轉(zhuǎn)載請(qǐng)注明.說明主流語言都有
    發(fā)表于 12-15 08:10

    如何搭建嵌入式C語言單元測(cè)試自動(dòng)化框架

    關(guān)于嵌入式C語言單元測(cè)試自動(dòng)化框架的搭建思路
    發(fā)表于 12-15 07:35

    Tessy嵌入式軟件單元測(cè)試/ 集成測(cè)試工具的相關(guān)資料分享

    Tessy — 嵌入式軟件單元測(cè)試/ 集成測(cè)試工具本文章向大家介紹Tessy — 嵌入式軟件單元測(cè)試/ 集成
    發(fā)表于 12-21 07:11

    嵌入式需不需要單元測(cè)試

    前言嵌入式行業(yè)摸爬滾打這幾年,遇見有規(guī)范單元測(cè)試的項(xiàng)目寥寥無幾。歸根到底,無非是公司希望快速迭代出產(chǎn)品,有問題等客戶反饋再說。當(dāng)然,也有人認(rèn)為是嵌入式行業(yè)都是小而美的產(chǎn)品居多,沒有到一定...
    發(fā)表于 12-21 08:16

    單元測(cè)試/集成測(cè)試自動(dòng)化工具--WinAMS

    CoverageMasterwinAMS : 適用于嵌入式目標(biāo)機(jī)代碼的單元測(cè)試/集成測(cè)試工具全面支持嵌入式微機(jī)!驗(yàn)證嵌入式
    發(fā)表于 06-17 18:26

    如何提高嵌入式軟件單元測(cè)試效率

    在本指南中,您將學(xué)習(xí)如何通過在更短的時(shí)間內(nèi)運(yùn)行更多的測(cè)試來增加您的單元測(cè)試吞吐量。 這種效率的提高來自于使用虛擬平臺(tái)而不是物理硬件作為開發(fā)平臺(tái)。 本指南對(duì)任何開發(fā)或運(yùn)行嵌入式軟件單元測(cè)試
    發(fā)表于 08-28 06:31

    嵌入式需要單元測(cè)試嗎?

    前言 嵌入式行業(yè)摸爬滾打這幾年,遇見有規(guī)范單元測(cè)試的項(xiàng)目寥寥無幾。歸根到底,無非是公司希望快速迭代出產(chǎn)品,有問題等客戶反饋再說。當(dāng)然,也有人認(rèn)為是嵌入式行業(yè)都是小而美的產(chǎn)品居多,沒有到一定量級(jí)之前
    的頭像 發(fā)表于 10-23 16:08 ?2314次閱讀

    慕課嵌入式系統(tǒng)(第六章.單元測(cè)試5)

    慕課電子科技大學(xué).嵌入式系統(tǒng).第六章.嵌入式軟件系統(tǒng).單元測(cè)試50 目錄6 嵌入式軟件系統(tǒng)6.4 單元測(cè)試56.4.1課堂重點(diǎn)6.4.2
    發(fā)表于 10-20 19:21 ?4次下載
    慕課<b class='flag-5'>嵌入式</b>系統(tǒng)(第六章.<b class='flag-5'>單元測(cè)試</b>5)

    慕課嵌入式系統(tǒng)(第二章.單元測(cè)試2)

    慕課電子科技大學(xué).嵌入式系統(tǒng).第二章.嵌入式硬件系統(tǒng)(第一部分.單元測(cè)試20 目錄2 嵌入式硬件系統(tǒng)(第一部分)2.6 單元測(cè)試22.6.1
    發(fā)表于 10-20 22:06 ?3次下載
    慕課<b class='flag-5'>嵌入式</b>系統(tǒng)(第二章.<b class='flag-5'>單元測(cè)試</b>2)

    慕課嵌入式開發(fā)及應(yīng)用(第二章.單元測(cè)試)

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第二章.入門與軟件框架.單元測(cè)試0 目錄2 入門與軟件框架2.10 單元測(cè)試2.10.1 課堂重點(diǎn)2.10.
    發(fā)表于 11-02 19:21 ?15次下載
    慕課<b class='flag-5'>嵌入式</b>開發(fā)及應(yīng)用(第二章.<b class='flag-5'>單元測(cè)試</b>)

    慕課嵌入式開發(fā)及應(yīng)用(第一章.單元測(cè)試)

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第一章.基礎(chǔ)與硬件.單元測(cè)試0 目錄1 基礎(chǔ)與硬件1.1 單元測(cè)試1.1.1課堂重點(diǎn)1.1.2測(cè)試與作業(yè)2 下一章0 目錄1 基礎(chǔ)與硬件1.1
    發(fā)表于 11-02 21:06 ?17次下載
    慕課<b class='flag-5'>嵌入式</b>開發(fā)及應(yīng)用(第一章.<b class='flag-5'>單元測(cè)試</b>)

    慕課嵌入式開發(fā)及應(yīng)用(第三章.單元測(cè)試)

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第三章.基本模塊.單元測(cè)試0 目錄3 基本模塊3.11 單元測(cè)試3.11.1 課堂重點(diǎn)3.11.2 測(cè)試與作業(yè)4 下一章0 目錄3 基本模塊3.11
    發(fā)表于 11-03 12:36 ?15次下載
    慕課<b class='flag-5'>嵌入式</b>開發(fā)及應(yīng)用(第三章.<b class='flag-5'>單元測(cè)試</b>)

    用在嵌入式開發(fā)中的單元測(cè)試框架

    在更受限制的環(huán)境(例如用 C 編寫的嵌入式系統(tǒng))中進(jìn)行單元測(cè)試的人來說,這組豐富的功能可能會(huì)令人生畏。 但是單元測(cè)試的重要之處在于測(cè)試
    的頭像 發(fā)表于 03-27 10:08 ?1057次閱讀

    嵌入軟件單元測(cè)試/集成測(cè)試自動(dòng)化工具

    CoverageMaster winAMS :?適用于嵌入式目標(biāo)機(jī)代碼的單元測(cè)試/集成測(cè)試工具 全面支持嵌入式微機(jī)!驗(yàn)證嵌入式
    的頭像 發(fā)表于 07-11 17:11 ?823次閱讀
    <b class='flag-5'>嵌入</b>軟件<b class='flag-5'>單元測(cè)試</b>/集成<b class='flag-5'>測(cè)試</b>自動(dòng)化工具

    單元測(cè)試、集成測(cè)試自動(dòng)化工具

    CoverageMaster winAMS :?適用于嵌入式目標(biāo)機(jī)代碼的單元測(cè)試/集成測(cè)試工具 全面支持嵌入式微機(jī)!驗(yàn)證嵌入式
    的頭像 發(fā)表于 06-26 13:41 ?438次閱讀
    <b class='flag-5'>單元測(cè)試</b>、集成<b class='flag-5'>測(cè)試</b>自動(dòng)化工具
    RM新时代网站-首页