在 macOS 上使用 CLion 進行 Google Test 單元測試

介紹

Google Test(GTest)是 Google 開源的 C++ 單元測試框架,它提供了簡單易用的斷言、測試夾具(Fixtures)和測試運行機制,使 C++ 開發者能夠編寫高效的單元測試。

本博客將介紹如何在 macOS 上使用 CLion 配置 Google Test 進行 C++ 單元測試,包括安裝 Google Test、配置 CMakeLists.txt、編寫和運行測試代碼,以及如何測試類和使用測試夾具。


1. 安裝 Google Test

Google Test 在 macOS 上可以使用 Homebrew 安裝:

brew install googletest

安裝完成后,庫文件通常會存放在 /usr/local/Cellar/googletest/ 目錄下(具體路徑可通過 brew info googletest 查看)。


2. 創建 CLion 項目

  1. 打開 CLion,選擇 New Project
  2. 選擇 C++ Executable,然后點擊 Create 創建一個項目。

3. 配置 CMakeLists.txt

方式 1:使用 Homebrew 安裝的 Google Test

如果通過 brew install googletest 安裝了 Google Test,可以這樣配置 CMakeLists.txt:

配置 CMakeLists

cmake_minimum_required(VERSION 3.30)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 20)# 查找 Google Test
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})# 添加測試文件
add_executable(MyGoogleTestProject main.cpp)# 鏈接 Google Test 庫
target_link_libraries(MyGoogleTestProject GTest::GTest GTest::Main pthread)# 啟用測試
enable_testing()
add_test(NAME MyGoogleTestProject COMMAND MyGoogleTestProject)

方式 2:使用 Git 方式引入 Google Test

如果希望將 Google Test 作為項目的一部分,可以在 CMakeLists.txt 中手動拉取 Google Test:

cmake_minimum_required(VERSION 3.10)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 17)# 下載 Google Test(如果未安裝)
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)# 添加測試源碼文件
add_executable(my_test test.cpp)# 鏈接 Google Test
target_link_libraries(my_test gtest gtest_main)# 啟用測試
enable_testing()

4. 編寫測試代碼

在項目根目錄下創建 main.cpp 文件,并編寫測試代碼,例如:

測試代碼

#include <gtest/gtest.h>// 測試函數
int Add(int nA, int nB) {return nA + nB;
}// 測試用例
TEST(AddTest, HandlesPositiveNumbers) {EXPECT_EQ(Add(2, 3), 5);
}TEST(AddTest, HandlesNegativeNumbers) {EXPECT_EQ(Add(-2, -3), -5);
}// 主函數
int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

如果需要測試類的成員函數如下:

  • 創建 Calculator 類,該類提供加法和減法功能。
  • 編寫 Google Test 測試。

Calculator 類的頭文件:

#ifndef CALCULATOR_H
#define CALCULATOR_Hclass Calculator {
public:int Add(int nA, int nB);int Subtract(int nA, int nB);
};#endif // CALCULATOR_H

Calculator 類的源文件:

#include "Calculator.h"int Calculator::Add(int nA, int nB) {return nA + nB;
}int Calculator::Subtract(int nA, int nB) {return nA - nB;
}

為 Calculator 編寫測試,創建 calculator_test.cpp 文件:

#include <gtest/gtest.h>
#include "Calculator.h"// 測試 Add 方法
TEST(CalculatorTest, HandlesAddition) {Calculator calculator;EXPECT_EQ(calculator.Add(3, 4), 7);EXPECT_EQ(calculator.Add(-2, -5), -7);EXPECT_EQ(calculator.Add(10, -5), 5);
}// 測試 Subtract 方法
TEST(CalculatorTest, HandlesSubtraction) {Calculator calculator;EXPECT_EQ(calculator.Subtract(10, 3), 7);EXPECT_EQ(calculator.Subtract(5, 8), -3);EXPECT_EQ(calculator.Subtract(-5, -10), 5);
}

測試類的成員函數的結果:

測試類的結果


5. 運行 Google Test

方法 1:手動運行

在 CLion 終端中執行:

cmake --build .
./MyGoogleTestProject

你應該會看到 Google Test 的輸出結果。

方法 2:CLion 直接運行

  1. 在 CLion 運行
    選擇模塊運行

  2. 使用 Google Test 配置

    • 點擊 CLion 頂部菜單 “Run” > “Edit Configurations…”
    • 點擊 “+” 號,選擇 Google Test
    • 選擇 Target,然后應用并運行
  3. 查看測試結果
    在 CLion 底部的 “Test Runner” 窗口,你可以看到測試是否通過。

測試結果


6. 添加更多測試

如果你有多個測試文件,比如 math_test.cppstring_test.cpp,可以這樣修改 CMakeLists.txt

add_executable(math_test math_test.cpp)
add_executable(string_test string_test.cpp)target_link_libraries(math_test GTest::GTest GTest::Main)
target_link_libraries(string_test GTest::GTest GTest::Main)add_test(NAME MathTest COMMAND math_test)
add_test(NAME StringTest COMMAND string_test)

然后在終端運行:

ctest

這樣可以一次性運行所有測試。


7. 處理 Google Test 斷言

Google Test 斷言分為 ASSERT_EXPECT_

  • EXPECT_EQ(a, b): 繼續運行,報告錯誤
  • ASSERT_EQ(a, b): 立即終止當前測試

例如:

TEST(SampleTest, Example) {ASSERT_EQ(1, 1); // 通過EXPECT_EQ(1, 2); // 失敗,但繼續執行ASSERT_EQ(1, 2); // 失敗,測試終止
}

8. 使用 Google Test Fixtures

Google Test 提供 Fixture(測試夾具),用于在多個測試用例間共享資源:

class MyTestFixture : public ::testing::Test {
protected:void SetUp() override { nValue = 5; } // 每個測試前執行void TearDown() override { }          // 每個測試后執行int nValue;
};TEST_F(MyTestFixture, TestAddition) {EXPECT_EQ(nValue + 5, 10);
}

總結

  1. 安裝 Google Test (brew install googletest 或 CMake FetchContent)
  2. 配置 CMakeLists.txt
  3. 編寫 Google Test 代碼
  4. 運行 Google Test
  5. 在 CLion 進行 Google Test 配置
  6. 使用 CTest 運行所有測試
  7. 使用斷言 EXPECT_ / ASSERT_
  8. 使用 Test Fixture 進行高級測試

這樣,你就能在 macOS + CLion 環境下使用 Google Test 進行 C++ 單元測試了!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897109.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle SQL優化實戰要點解析(11)——索引、相關子查詢及NL操作(1)

11.1. 充分利用索引有序特性,避免發生大表上的FTS,以及對中間大數據集的排序。 11.1.1. 適用場景 從一個或多個大表(例如:億行級或TB級數據量)中過濾出全列大數據集(例如:數百萬或千萬行數據),對該大數據集按其中某列進行排序,最終,只取最前面的少部分數據(例如:…

軟考架構師筆記-計算機網絡

1.9 計算機網絡 OSI/RM 七層模型 物理層 二進制傳輸(中繼器、集線器) (typedef) 數據鏈路層 傳送以幀為單位的信息(網橋、交換機、網卡) 網絡層 分組傳輸和路由選擇(三層交換機、路由器)ARP/RARP/IGMP/ICMP/IP 傳輸層 端到端的連接(TCP/UDP)在前向糾錯系統中&#xff0c;當接…

STM32MP157A單片機移植Linux系統使用python鏈接云服務器

思維導圖 需求分析 stm32mp157a單片機上移植Linux操作系統&#xff0c;包括LCD驅動、觸摸驅動、Ethernet/WiFi支持&#xff0c;設備樹信息包括ADC、GPIO、LCD&#xff0c;使用QT上位機在PC端顯示&#xff0c;通過TCP與stm32交互&#xff0c;將ad數據傳輸到PC端和云服務器&…

【MySQL】Can‘t connect to server in ‘localhost‘

【問題】連接MySQL數據庫時報錯&#xff1a; 【原因】沒有啟動MySQL服務 【解決方法】&#x1f447;&#x1f447;&#x1f447; 1.以管理員身份運行PowerShell 2.執行命令&#xff1a;net start MySQL 提示 “MySQL服務已經啟動成功” 就說明成功了&#xff0c;這時再連…

OceanBase-obcp-v3考試資料梳理

集群架構 基本概念 集群: 集群由一個或多個Region組成,Region 由一個或多個Zone組成,Zone由一個或多個OBServer組成,每個OBServer里有若干個partition的Replica。 Region: 對應物理上的一個城市或地域,當OB集群由多個Region組成時, 數據庫的數據和服務能力就具備地域…

Vue 系列之:組件通訊

子組件調用父組件方法 1、直接在子組件中通過 this.$parent.event 來調用父組件的方法 父組件&#xff1a; <template><p><child></child></p> </template> <script>import child from ./child;export default {components: {chi…

ComfyUI簡介

一、ComfyUI 是什么&#xff1f; ComfyUI 是一款基于節點的圖形用戶界面&#xff08;GUI&#xff09;&#xff0c;專為 Stable Diffusion 設計。它通過模塊化節點連接的方式構建復雜的圖像生成工作流&#xff0c;用戶可自由組合加載模型、輸入提示詞、調整采樣器等操作模塊&am…

我的兩個醫學數據分析技術思路

我的兩個醫學數據分析技術思路 從臨床上獲得的或者公共數據庫數據這種屬于觀察性研究&#xff0c;是對臨床診療過程中自然產生的數據進行分析而獲得疾病發生發展的規律等研究成果。再細分&#xff0c;可以分為獨立危險因素鑒定和預測模型構建兩種。 獨立危險因素鑒定是一直以…

【YOLOv12改進trick】StarBlock引入YOLOv12,創新漲點優化,含創新點Python代碼,方便發論文

??改進模塊??:StarBlock ??解決問題??:采用StarBlock將輸入數據映射到一個極高維的非線性特征空間,生成豐富的特征表示,使得模型在處理復雜數據時更加有效。 ??改進優勢??:簡單粗暴的星型乘法漲點卻很明顯 ??適用場景??:目標檢測、語義分割、自然語言處理…

pyside6學習專欄(九):在PySide6中使用PySide6.QtCharts繪制6種不同的圖表的示例代碼

PySide6的QtCharts類支持繪制各種型狀的圖表&#xff0c;如面積區域圖、餅狀圖、折線圖、直方圖、線條曲線圖、離散點圖等&#xff0c;下面的代碼是采用示例數據繪制這6種圖表的示例代碼,并可實現動畫顯示效果&#xff0c;實際使用時參照代碼中示例數據的格式將實際數據替換即可…

《今日AI-人工智能-編程日報》

1. 字節跳動發布AI編程工具Trae國內版 發布背景&#xff1a;字節跳動于2025年3月3日正式推出國內版AI編程工具Trae&#xff0c;這是國內首個AI原生集成開發環境&#xff08;AI IDE&#xff09;&#xff0c;旨在提升開發者的編程效率與智能化體驗。 核心功能&#xff1a; 搭載d…

doris: MySQL

Doris JDBC Catalog 支持通過標準 JDBC 接口連接 MySQL 數據庫。本文檔介紹如何配置 MySQL 數據庫連接。 使用須知? 要連接到 MySQL 數據庫&#xff0c;您需要 MySQL 5.7, 8.0 或更高版本 MySQL 數據庫的 JDBC 驅動程序&#xff0c;您可以從 Maven 倉庫下載最新或指定版本的…

【LangChain】存儲與管理對話歷史

0. 代碼演示 from langchain_community.chat_message_histories import SQLChatMessageHistorydef get_session_history(session_id):# 通過 session_id 區分對話歷史&#xff0c;并存儲在 sqlite 數據庫中return SQLChatMessageHistory(session_id, "sqlite:///memory.d…

從0開始的操作系統手搓教程21:進程子系統的一個核心功能——簡單的進程切換

目錄 具體說說我們的簡單RR調度 處理時鐘中斷處理函數 調度器 schedule switch_to 我們下面&#xff0c;就要開始真正的進程切換了。在那之前&#xff0c;筆者想要說的是——我們實現的進程切換簡單的無法再簡單了——也就是實現一個超級簡單的輪詢調度器。 每一個進程按照…

mysql新手常見問題解決方法總結

1. 安裝與配置問題 1.1 無法安裝MySQL Server MySQL Server安裝失敗是新手常見的問題之一&#xff0c;以下是具體原因及解決方案&#xff1a; 系統要求不滿足&#xff1a;MySQL對操作系統有最低版本要求&#xff0c;如Windows 7 SP1及以上、macOS 10.13及以上。若系統版本過…

數字組合(信息學奧賽一本通-1291)

【題目描述】 有n個正整數&#xff0c;找出其中和為t(t也是正整數)的可能的組合方式。如&#xff1a;n5,5個數分別為1,2,3,4,5&#xff0c;t5&#xff1b;那么可能的組合有514和523和55三種組合方式。 【輸入】 輸入的第一行是兩個正整數n和t&#xff0c;用空格隔開&#xff0c…

搜索引擎(基于java在線文檔)

背景&#xff1a; 基于java文檔的搜索引擎&#xff0c;可以輸入搜索詞&#xff0c;然后就可以查詢出與搜索詞相關的文檔。該項目的最主要的工作是要構建索引&#xff0c;就是正排和倒排索引。正排索引&#xff1a;根據文檔id獲取到文檔&#xff1b;倒排索引&#xff1a;根據搜…

【每日學點HarmonyOS Next知識】web滾動、事件回調、selectable屬性、監聽H5內部router、Grid嵌套時高度設置

【每日學點HarmonyOS Next知識】web滾動、事件回調、selectable屬性、監聽H5內部router、Grid嵌套時高度設置 1、HarmonyOS WebView加載url無法滾動&#xff1f; scroll 里面嵌套webView&#xff0c;demo參考&#xff1a; // xxx.ets import web_webview from ohos.web.webv…

Flink性能指標詳解MetricsAnalysis

文章目錄 Flink 組成1.JobManager2.TaskManager3.ResourceManager4.Dispatcher5.Client6. Env JobManager MetricsTaskManager Metrics Flink 組成 1.JobManager 管理任務 作業調度&#xff1a;負責接收和調度作業&#xff0c;分配任務到 TaskManager。資源管理&#xff1a;…

Flutter底層實現

1. Dart 語言 Dart 是 Flutter 的主要編程語言。Dart 設計之初就是為了與 JavaScript 兼容&#xff0c;并且可以編譯為機器代碼運行。Dart 提供了一些特性&#xff0c;如異步支持&#xff08;通過 async 和 await&#xff09;&#xff0c;這使得編寫高效的網絡請求和復雜動畫變…