最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ gtest單元測試的實現(xiàn)示例

 更新時間:2025年07月14日 09:48:57   作者:龍灣開發(fā)  
單元測試是軟件開發(fā)過程中的一種測試方法,本文主要介紹了C++ gtest單元測試的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

1. 單元測試

單元測試是軟件開發(fā)過程中的一種測試方法,用于驗證程序中的最小可測單元,通常是方法、類和模塊等。它的目的是確保每個單元都能正確執(zhí)行其預定義的功能,并且其他功能單元之間的交互符合預期。

1.1. 單元測試介紹

1.1.1. 為什么需要單元測試

  • 早期發(fā)現(xiàn)問題:在軟件開發(fā)的早期階段發(fā)現(xiàn)潛在的問題和錯誤,避免后續(xù)開發(fā)過程中的不必要的麻煩。
  • 提高代碼質(zhì)量:有助于提高代碼質(zhì)量,減少bug,增強代碼可維護性。
  • 提高開發(fā)效率:支持重構(gòu)和修改,提高開發(fā)效率。

1.1.2. 單元測試的類型

  • 靜態(tài)測試:在不執(zhí)行程序的情況下對代碼進行分析和檢查的方法,包括代碼審查、代碼走查和靜態(tài)分析工具的使用。
  • 動態(tài)測試:通過執(zhí)行程序并觀察其行為來測試軟件的過程,包括白盒測試和黑盒測試。

1.1.3. 常用的C++單元測試框架

  • Google Test:由Google開發(fā),支持多種測試模式,如測試夾具、參數(shù)化測試等,并且具有良好的跨平臺特性。
  • Catch2:一個輕量級的測試框架,支持行為驅(qū)動開發(fā)(BDD)風格的測試。
  • Boost.Test:Boost庫的一部分,功能強大且靈活,適合大型項目的測試。
  • CppUnit:類似于JUnit的框架,適用于C++。

1.1.4. 單元測試的實施步驟

  1. 編寫測試用例:根據(jù)需求編寫測試用例,模擬各種輸入情況,驗證函數(shù)的輸出是否符合預期。
  2. 運行測試:使用測試框架提供的工具運行測試用例,觀察測試結(jié)果。
  3. 分析結(jié)果:如果測試通過,說明代碼在這些情況下工作正常;如果失敗,則需要調(diào)試和修復。

1.1.5. 單元測試的最佳實踐

  • 早期介入:在軟件開發(fā)的早期階段就開始編寫測試用例。
  • 持續(xù)集成:結(jié)合持續(xù)集成工具,在每次代碼提交后自動執(zhí)行測試。
  • 編寫清晰的測試用例:測試用例應該盡量簡單明了,避免復雜的邏輯。

本文將介紹Google Test框架的基本使用方法,包括安裝、配置、編寫測試用例和運行測試等步驟。

1.2. 安裝Google Test

vcpkg install gtest

1.3. 編寫代碼

我們的代碼目錄結(jié)構(gòu)如下:

C:.
|   CMakeLists.txt
|   output.txt
|   run.ps1
|   tests_output.txt
|
+---.vscode
|       c_cpp_properties.json
|       settings.json
|
+---include
|       CMath.h
|       common.h
|
+---lib
|       bay.lib
|
+---src
|       CMath.cpp
|       main.cpp
|
\---test
        main.cpp

1.3.1. CMath

我們寫一個最簡單的加法函數(shù):

int CMath::add(int a, int b)
{
    return a + b;
}

1.3.2. src/main.cpp

這是咱們正常軟件的入口函數(shù),我們在這里調(diào)用CMath的add函數(shù):

#include <iostream>
#include "CMath.h"

int main() {
    CMath math;
    std::cout << math.add(1,2) << std::endl;
    return 0;
}

1.3.3. test/main.cpp

這是我們的單元測試代碼,我們在這里調(diào)用CMath的add函數(shù),并且使用Google Test提供的斷言來驗證結(jié)果:

#include <gtest/gtest.h>
#include "common.h"
#include "CMath.h"

// 測試用例
TEST(AdditionTest, PositiveNumbers) {
    CMath math;
    EXPECT_EQ(math.add(1, 2), 3);
}

TEST(AdditionTest, NegativeNumbers) {
    CMath math;
    EXPECT_EQ(math.add(-1, -2), -4); //單元測試結(jié)果會報錯
}


int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

1.4. CMakeLists.txt

我們使用CMake來構(gòu)建我們的項目,將生成可執(zhí)行文件demo.exe和單元測試可執(zhí)行文件runUnitTests.exe。
特別注意:

  1. 在生成runUnitTests.exe時,需要包含test/.cpp 和 src/.cpp ,同時排除掉src/main.cpp,否則會報錯。
  2. 建議在test/main.cpp 中使用main(),這樣鏈接時用GTest::gtest,而不要用GTest::gtest_main,否則會報錯。

CMakeLists.txt如下:

# 指定CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)

# 設(shè)置項目名稱和語言
project(demo LANGUAGES CXX)

# 設(shè)置C++標準為C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 強制要求使用指定的C++標準

# 查找外部依賴包 fmt 和 spdlog
find_package(fmt CONFIG REQUIRED)
find_package(spdlog CONFIG REQUIRED)

# 遞歸查找src目錄下所有的cpp源文件,作為主程序源文件
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

#創(chuàng)建主程序可執(zhí)行文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 啟用測試功能
enable_testing()

# 遞歸查找test目錄下所有的cpp文件,作為單元測試源文件
file(GLOB_RECURSE UNIT_TEST_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/test/*.cpp")
# 查找src目錄下除main.cpp外的所有cpp文件,供測試用例復用
file(GLOB_RECURSE UNIT_TEST_SRC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
list(FILTER UNIT_TEST_SRC_SOURCES EXCLUDE REGEX "src/main.cpp")
# 創(chuàng)建測試可執(zhí)行文件 runUnitTests
add_executable(runUnitTests ${UNIT_TEST_SOURCES} ${UNIT_TEST_SRC_SOURCES})

# 查找GTest庫
find_package(GTest CONFIG REQUIRED)
# 鏈接GTest和GMock庫到測試可執(zhí)行文件
# 注意:這里只需鏈接gtest和gmock,不要鏈接gtest_main/gmock_main,否則main函數(shù)會沖突
target_link_libraries(runUnitTests PRIVATE GTest::gtest  GTest::gmock )

# 添加CTest測試
add_test(AllTestsInMain runUnitTests)

# 包含 GoogleTest 模塊,自動發(fā)現(xiàn)并添加測試
include(GoogleTest)
gtest_discover_tests(runUnitTests)

# 設(shè)置主程序包含目錄
# PRIVATE表示這些包含目錄僅在當前目標內(nèi)部可見
# include/bay目錄如不存在可去除
# 下面兩處都可根據(jù)實際情況調(diào)整

# 主程序包含目錄
target_include_directories(${PROJECT_NAME} PRIVATE 
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
        )
# 測試程序包含目錄
target_include_directories(runUnitTests PRIVATE 
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
        )

# 鏈接外部依賴庫到主程序
# PRIVATE表示依賴不會傳遞給鏈接此目標的其他目標
# 如lib/bay.lib不存在可去除
# fmt和spdlog為必需

target_link_libraries(${PROJECT_NAME} PRIVATE 
    fmt::fmt            # 格式化庫
    spdlog::spdlog      # 日志庫
)

target_link_libraries(runUnitTests PRIVATE 
    fmt::fmt            # 格式化庫
    spdlog::spdlog      # 日志庫
)

1.5. 編譯

# 生成構(gòu)建目錄并配置CMake工程
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOTDIR}/scripts/buildsystems/vcpkg.cmake" 

# 編譯工程,若成功則運行生成的可執(zhí)行文件
cmake --build build ; 

1.6. 運行單元測試

有以下方式可以進行單元測試

1.6.1. 直接運行 runUnitTests.exe

輸出結(jié)果如下:

3
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from AdditionTest
[ RUN      ] AdditionTest.PositiveNumbers
[       OK ] AdditionTest.PositiveNumbers (0 ms)
[ RUN      ] AdditionTest.NegativeNumbers
C:\Users\Admin\05.gtest\test\main.cpp(13): error: Expected equality of these values:
  math.add(-1, -2)
    Which is: -3
  -4

[  FAILED  ] AdditionTest.NegativeNumbers (0 ms)
[----------] 2 tests from AdditionTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (1 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] AdditionTest.NegativeNumbers

 1 FAILED TEST

有一條測試用例失敗,是因為為我們特意在test/main.cpp中將輸出結(jié)果設(shè)置錯誤。

1.6.2. 運行 CTest

cd build
ctest
# 也可采用 ctest -V  ,這樣輸出的結(jié)果會包含詳細信息

輸出結(jié)果如下:

Test project C:/Users/Admin/05.gtest/build
    Start 1: AdditionTest.PositiveNumbers
1/3 Test #1: AdditionTest.PositiveNumbers .....   Passed    0.09 sec
    Start 2: AdditionTest.NegativeNumbers
2/3 Test #2: AdditionTest.NegativeNumbers .....***Failed    0.01 sec
    Start 3: AllTestsInMain
3/3 Test #3: AllTestsInMain ...................***Failed    0.01 sec

33% tests passed, 2 tests failed out of 3

Total Test time (real) =   0.13 sec

The following tests FAILED:
          2 - AdditionTest.NegativeNumbers (Failed)
          3 - AllTestsInMain (Failed)
Errors while running CTest

1.6.3. visual studio code 中用插件進行單元測試

先安裝插件

然后點擊插件中的單元測試,點擊相關(guān)測試用例,運行即可。

到此這篇關(guān)于C++ gtest單元測試的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++ gtest單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語言內(nèi)存泄露很嚴重的解決方案

    C語言內(nèi)存泄露很嚴重的解決方案

    這篇文章主要介紹了C語言內(nèi)存泄露很嚴重的解決方案,預防內(nèi)存泄漏問題有多種方法,比如加強代碼檢視、工具檢測和內(nèi)存測試等,下面文章總結(jié)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • C++位操作實戰(zhàn)掩碼、提取與組裝

    C++位操作實戰(zhàn)掩碼、提取與組裝

    在C++編程中,位操作是基礎(chǔ)而強大的技術(shù),允許在二進制級別上操作數(shù)據(jù),對性能優(yōu)化、內(nèi)存節(jié)省和底層硬件控制至關(guān)重要,文章探討了掩碼操作、字節(jié)提取與組裝等技術(shù),并介紹了bitset類模板的使用,幫助處理二進制數(shù)據(jù),通過實例解析如何設(shè)置、清除、檢查特定位
    2024-10-10
  • C++之多態(tài)(內(nèi)容不錯)

    C++之多態(tài)(內(nèi)容不錯)

    什么是多態(tài)?顧名思義就是同一個事物在不同場景下的多種形態(tài),需要的朋友可以參考下
    2020-01-01
  • C語言圣誕樹的實現(xiàn)示例

    C語言圣誕樹的實現(xiàn)示例

    本篇主要介紹了C語言圣誕樹的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • opencv實現(xiàn)棋盤格檢測

    opencv實現(xiàn)棋盤格檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)棋盤格檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 深入剖析Android中init進程實現(xiàn)的C語言源碼

    深入剖析Android中init進程實現(xiàn)的C語言源碼

    這篇文章主要介紹了Android中init進程實現(xiàn)的C語言源碼,init屬性服務在安卓中屬于系統(tǒng)的底層Linux服務,需要的朋友可以參考下
    2015-07-07
  • C++宏函數(shù)和內(nèi)聯(lián)函數(shù)的使用

    C++宏函數(shù)和內(nèi)聯(lián)函數(shù)的使用

    本文主要介紹了C++宏函數(shù)和內(nèi)聯(lián)函數(shù)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C++通過TerminateProess結(jié)束進程實例

    C++通過TerminateProess結(jié)束進程實例

    這篇文章主要介紹了C++通過TerminateProess結(jié)束進程實例,是Windows應用程序設(shè)計中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • c++中深淺拷貝以及寫時拷貝的實現(xiàn)示例代碼

    c++中深淺拷貝以及寫時拷貝的實現(xiàn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c++中深淺拷貝以及寫時拷貝實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • C/C++使用過程中的溢出問題詳解

    C/C++使用過程中的溢出問題詳解

    在C/C++程序里有一類非常典型的問題,那就是:溢出問題,現(xiàn)在分別來分析一下常見的數(shù)組溢出,整數(shù)溢出,緩沖區(qū)溢出,棧溢出和指針溢出等,需要的朋友可以參考下
    2024-01-01

最新評論

宝坻区| 登封市| 南康市| 开阳县| 平阴县| 应城市| 北安市| 桃源县| 延津县| 宁安市| 资溪县| 谷城县| 石门县| 锡林浩特市| 孟州市| 虎林市| 宽甸| 攀枝花市| 宜宾县| 晋城| 砚山县| 万盛区| 沐川县| 汪清县| 周至县| 蚌埠市| 通山县| 崇义县| 长寿区| 夹江县| 和田市| 怀集县| 安平县| 乌拉特前旗| 上林县| 盘锦市| 讷河市| 崇仁县| 武夷山市| 景洪市| 区。|