国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個簡單好用的C語言單元測試框架-Unity

這篇具有很好參考價值的文章主要介紹了一個簡單好用的C語言單元測試框架-Unity。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity簡介:

Unity是一個用于C語言的輕量級單元測試框架。它由Throw The Switch團隊開發(fā),旨在簡化嵌入式系統(tǒng)的單元測試。單元測試中單元的含義,單元就是人為規(guī)定的最小的被測功能模塊,如C語言中單元指一個函數(shù),Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。在實際項目中,單元測試往往由開發(fā)人員完成。
Unity的設(shè)計目標是易于使用、輕便、可移植,并能夠在各種嵌入式和非嵌入式系統(tǒng)中運行。核心項目是一個 C 文件和一對頭文件,允許將其添加到現(xiàn)有的構(gòu)建設(shè)置中,而不會太麻煩。 可以使用任何想用的編譯器,并且可以使用大多數(shù)現(xiàn)有的構(gòu)建系統(tǒng),包括 Make、CMake 等。

Unity簡單使用方法:

1、下載unity框架

去GitHub下載,或者gti clone到本地,鏈接地址:unity。

Unity 本身非常小。 其他剩下的只是可選附加組件。 可以忽略它或在方便時使用它。 以下是項目中所有內(nèi)容的概述。

  • src- 這是你關(guān)心的代碼!此文件夾包含一個 C 文件和兩個頭文件。 這三個文件是 Unity。
  • docs- 在這里可以找到所有方便的文檔。
  • examples- 這包含一些使用 Unity 的示例。
  • extras- 這些是 Unity 的可選附加組件,不屬于核心項目。
  • test- 這就是 Unity 及其腳本的測試方式。 如果你只是使用Unity,你可能永遠不需要進入這里。
  • auto- 在這里,你將找到有用的 Ruby 腳本,以簡化你的測試工作流程。 它們完全是可選的,不需要使用 Unity。

2、使用unity框架

測試文件是 C 文件。 大多數(shù)情況下,將為每個要測試的 C 模塊創(chuàng)建一個測試文件。 測試文件應(yīng)包含 unity.h 和要測試的 C 模塊的標頭。

例如測試下面兩個函數(shù):

ProductionCode.c

#include "ProductionCode.h"

int Counter = 0;
int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */

/* This function is supposed to search through NumbersToFind and find a particular number.
 * If it finds it, the index is returned.  Otherwise 0 is returned which sorta makes sense since
 * NumbersToFind is indexed from 1.  Unfortunately it's broken
 * (and should therefore be caught by our tests) */
int FindFunction_WhichIsBroken(int NumberToFind)
{
    int i = 0;
    while (i < 8) /* Notice I should have been in braces */
        i++;
        if (NumbersToFind[i] == NumberToFind) /* Yikes!  I'm getting run after the loop finishes instead of during it! */
            return i;
    return 0;
}

int FunctionWhichReturnsLocalVariable(void)
{
    return Counter;
}

ProductionCode.h

#ifndef  _PRODICTIONCODE_H_
#define  _PRODICTIONCODE_H_

extern int Counter;

int FindFunction_WhichIsBroken(int NumberToFind);
int FunctionWhichReturnsLocalVariable(void);

#endif

接下來,測試文件將包含測試例程函數(shù)。 setUp 函數(shù)可以包含你希望在每次測試之前運行的任何內(nèi)容。 tearDown 函數(shù)可以包含你希望在每次測試后運行的任何內(nèi)容。 這兩個函數(shù)都不接受任何參數(shù),也不返回任何內(nèi)容。 如果不需要它們,將其設(shè)置為空。setUp() tearDown()

TestProductionCode.h


#include "ProductionCode.h"
#include "unity.h"

/* sometimes you may want to get at local data in a module.
 * for example: If you plan to pass by reference, this could be useful
 * however, it should often be avoided */
extern int Counter;

void setUp(void)
{
  /* This is run before EACH TEST */
  Counter = 0x5a5a;
}

void tearDown(void)
{
}

void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void)
{
  /* All of these should pass */
  TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78));
  TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(2));
  TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33));
  TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999));
  TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1));
}

void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void)
{
  /* You should see this line fail in your test summary */
  TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34));

  /* Notice the rest of these didn't get a chance to run because the line above failed.
   * Unit tests abort each test function on the first sign of trouble.
   * Then NEXT test function runs as normal. */
  TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888));
}

void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void)
{
    /* This should be true because setUp set this up for us before this test */
    TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable());

    /* This should be true because we can still change our answer */
    Counter = 0x1234;
    TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable());
}

void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void)
{
    /* This should be true again because setup was rerun before this test (and after we changed it to 0x1234) */
    TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable());
}

void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void)
{
    /* Sometimes you get the test wrong.  When that happens, you get a failure too... and a quick look should tell
     * you what actually happened...which in this case was a failure to setup the initial condition. */
    TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable());
}

最后,在編寫main函數(shù),然后調(diào)用每個測試例程函數(shù)。 這實際上會觸發(fā)每個測試例程函數(shù)運行,因此每個函數(shù)都有自己的調(diào)用非常重要。

/* AUTOGENERATED FILE. DO NOT EDIT. */
/*=======Automagically Detected Files To Include=====*/
#include "unity.h"
#include <setjmp.h>
#include <stdio.h>
#include "ProductionCode.h"

/*=======External Functions This Runner Calls=====*/
extern void setUp(void);
extern void tearDown(void);
extern void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void);
extern void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void);
extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void);
extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void);
extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void);


/*=======MAIN=====*/
int main(void)
{
  UnityBegin("test/TestProductionCode.c");
  RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode);
  RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken);
  RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue);
  RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain);
  RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed);

  return (UnityEnd());
}

3、構(gòu)建運行環(huán)境

創(chuàng)建一個目錄 TDDUnityExample,在TDDUnityExample 目錄下創(chuàng)建 CMakeLists.txt 文件。

# 最低CMake版本要求
cmake_minimum_required(VERSION 3.15)

#將Unity/src工作目錄的源文件賦給UNITY_SRC_LIST
#將Tests工作目錄的源文件賦給APP_SRC_DIR
aux_source_directory (Unity/src UNITY_SRC_LIST)
aux_source_directory (Tests APP_SRC_DIR)

# 項目名稱
project(TDD_test)

# 頭文件路徑
include_directories(Unity/src)

#將所有源文件生成一個可執(zhí)行文件
add_executable(TDD_test  ${APP_SRC_DIR} ${UNITY_SRC_LIST})
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

在 TDDUnityExample 下創(chuàng)建 Unity 目錄,然后將Unity 框架源碼中的 src 目錄拷貝到 Unity目錄中。

在 TDDUnityExample 下創(chuàng)建 Tests 目錄,然后將第二點中舉例的測試文件都放在 Tests 目錄中。

在 TDDUnityExample 下創(chuàng)建 build 目錄,然后在 build 目錄下也創(chuàng)建一個 CMakeLists.txt 文件。

cmake_minimum_required (VERSION 2.8)

project (TDD_test)

add_subdirectory (Tests)

最后整體文件結(jié)構(gòu)如下:

├── build
│   └── CMakeLists.txt
├── CMakeLists.txt
├── Tests
│   ├── ProductionCode.c
│   ├── ProductionCode.h
│   ├── TestProductionCode.c
│   └── TestProductionCode_Runner.c
└── Unity
    └── src
        ├── meson.build
        ├── unity.c
        ├── unity.h
        └── unity_internals.h

4、運行測試程序

在 build 目錄下輸入 cmake ..命令,會自動生成 Makefile 文件,然后輸入make,就會自動編譯生成可執(zhí)行文件 TDD_test 在 TDDUnityExample /bin 下。

進入 TDDUnityExample /bin 下,輸入./TDD_test。

輸出結(jié)果為:

test/TestProductionCode.c:0:test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode:PASS
test/TestProductionCode.c:33:test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken:FAIL: Expected 1 Was 0
test/TestProductionCode.c:0:test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue:PASS
test/TestProductionCode.c:0:test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain:PASS
test/TestProductionCode.c:61:test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed:FAIL: Expected 0x00001234 Was 0x00005A5A

-----------------------
5 Tests 2 Failures 0 Ignored 
FAIL

從結(jié)果來看第二個和第五個測試例程出現(xiàn)錯誤,錯誤原因也標記出來了。

5、常用斷言

TEST_PASS(); /* 中止測試的其余部分, 但將測試計為通過 */
TEST_PASS_MESSAGE("message")

TEST_IGNORE(); /* 將測試用例標記為忽略, 但將測試計為通過 */
TEST_PASS_MESSAGE("message")
    
TEST_FAIL(); /* 中止測試的其余部分, 但將測試計為失敗 */
TEST_FAIL_MESSAGE("message")
    
TEST_MESSAGE(""); /* 將消息輸出 */

以上斷言宏都是放在編寫的測試函數(shù)中,TEST_IGNORE 一般放在函數(shù)的頂部,用來表示將測試用例忽略,其他宏可以放在函數(shù)的任意位置。

總結(jié):

unity單元測試框架核心是一個 C 文件和一對頭文件,特點是簡潔易用輕量級、可移植性、支持測試斷言等。其中有許多測試斷言需要多了解多使用。

好了以上就是Unity單元測試框架的簡易使用方法,有什么疑問和建議歡迎在評論區(qū)中提出,想要了解更多的Unity知識可以去官網(wǎng)上查看,官網(wǎng)上也有詳細的教程和實例。文章來源地址http://www.zghlxwxcb.cn/news/detail-813036.html

到了這里,關(guān)于一個簡單好用的C語言單元測試框架-Unity的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng)

    Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng)

    在游戲開發(fā)過程中,我們會大量使用事件系統(tǒng)。很多時候,比起直接調(diào)用對象組件的方法,使用事件觸發(fā)將很大程度上降低系統(tǒng)的耦合度,從而實現(xiàn)更為優(yōu)雅的系統(tǒng)設(shè)計。 封裝一個好用的事件系統(tǒng)將對我們的開發(fā)起到很大的幫助。 本文將基于Unity提供的ScriptableObject和UnityEv

    2024年02月02日
    瀏覽(20)
  • unity 單元測試

    unity 單元測試

    Created: February 23, 2023 11:11 PM Tags: C語言, stm32, 單元測試 為了方便在stm32上進行單元測試,需要在項目中導(dǎo)入unity框架以便于對項目的單元測試。本章節(jié)將簡單介紹如何使用Unity進行單元測試,更加詳細的內(nèi)容可以移步Unity的GitHub。 沒有安裝git的同學(xué)可以直接上github下載源代碼,

    2024年02月06日
    瀏覽(7)
  • Unity單元測試

    Unity單元測試是一個專門用于嵌入式單元測試的庫, 現(xiàn)在簡單講下移植以及代碼結(jié)構(gòu). 源碼地址:?GitHub - ThrowTheSwitch/Unity: Simple Unit Testing for C 1.我們只需要移植三個文件即可: unity.c, unity.h, unity_internals.h 2.然后添加需要測試的函數(shù). 3.在main.c中添加兩個空函數(shù)以及一個宏 廢話就不

    2024年02月22日
    瀏覽(10)
  • linux環(huán)境編程(1): 實現(xiàn)一個單元測試框架-2

    在之前的文章中, 介紹了如何實現(xiàn)一個類似gtest的單元測試框架, 完整的項目代碼可以參考這里: https://github.com/kfggww/cutest . 近期對cutest的實現(xiàn)做了一些修改, 包括: Test Suite的聲明宏, 修改為TEST_SUITE 增加Test Suite的聲明宏TEST_SUITE_WITH. 可傳遞Suite的init和cleanup函數(shù), 在Suite中每個Cas

    2024年02月12日
    瀏覽(45)
  • Java開發(fā)手冊之單元測試,軟件測試端簡單易用的SPI框架

    Java開發(fā)手冊之單元測試,軟件測試端簡單易用的SPI框架

    【推薦】編寫單元測試代碼遵守 BCDE 原則,以保證被測試模塊的交付質(zhì)量。 B:Border,邊界值測試,包括循環(huán)邊界、特殊取值、特殊時間點、數(shù)據(jù)順序等。 C:Correct,正確的輸入,并得到預(yù)期的結(jié)果。 D:Design,與設(shè)計文檔相結(jié)合,來編寫單元測試。 E:Error,強制錯誤信息輸

    2024年04月25日
    瀏覽(39)
  • 如何使用PHPUnit編寫一個PHP單元測試-簡單的代碼示例

    在軟件開發(fā)過程中,單元測試是一種重要的測試方法,可以確保代碼的質(zhì)量和可靠性。在PHP開發(fā)中,也可以通過編寫單元測試來驗證代碼的正確性。下面將介紹一些編寫PHP單元測試的基本步驟和常用工具。 首先,你需要一個PHP單元測試框架,比如PHPUnit。PHPUnit是PHP社區(qū)最流行

    2024年02月04日
    瀏覽(39)
  • ?基于多種語言,使用Selenium實現(xiàn)自動化的常用單元測試框架

    ?基于多種語言,使用Selenium實現(xiàn)自動化的常用單元測試框架

    Selenium是自動化網(wǎng)絡(luò)應(yīng)用程序的首選工具。Selenium支持基于Java、C#、PHP、Ruby、Perl、JavaScript和Python等多種編程語言的各種單元測試框架。這些框架用于在 Windows、MacOS 和 Linux 等不同平臺的網(wǎng)絡(luò)應(yīng)用程序上執(zhí)行測試腳本。任何成功的自動化流程都有賴于強大的測試框架,這些框架

    2024年01月21日
    瀏覽(27)
  • 【C C++開源庫】適合單片機 嵌入式的C語言單元測試庫_單片機 單元測試框架

    【C C++開源庫】適合單片機 嵌入式的C語言單元測試庫_單片機 單元測試框架

    #define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((thres

    2024年04月25日
    瀏覽(30)
  • C語言單元測試框架——CUnit 安裝(windows和Linux)及使用

    C語言單元測試框架——CUnit 安裝(windows和Linux)及使用

    昨天把軟件測試基礎(chǔ)基本上看完了,因為我最近工作問題,需要著重研究下Cunit這個單元測試框架,上午把之前學(xué)的基礎(chǔ)整理出來了。 剛剛研究了下Cunit除了基本 (Basic)接口,還有三個接口沒使用過,我也會經(jīng)量都嘗試下。 下個星期我的任務(wù)是寫一個墨水屏的驅(qū)動,測試的學(xué)

    2024年02月09日
    瀏覽(16)
  • 【Unity】教你如何使用Unity制作一個簡單的跑酷游戲

    【Unity】教你如何使用Unity制作一個簡單的跑酷游戲

    其實用Unity制作游戲并不難,如果你想學(xué)習(xí),那我就建議你想從制作一個簡單的跑酷游戲來找到興趣,因為如果你一開始就一直學(xué)習(xí)一些沒什么必要的語法,這樣就會讓你一開始就失去了信心,失去了學(xué)習(xí)Unity的動力,所以如果你先學(xué)習(xí)如何制作一個簡單的跑酷地圖,然后你就

    2024年02月21日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包