天天看點

VisualStudio為C++項目建立單元測試

主要介紹兩種為VisualStudio的C++項目建立單元測試的方法:微軟的本機單元測試、Google Test。

一、VisualStudio自帶的本機單元測試

VisualStudio自帶的有一個C++本機單元測試,其架構主要原理是生成一個動态庫檔案,測試的函數作為DLL的導出函數由架構進行調用測試。

然而實際使用下來體驗并不是很好,不過還是簡單說下怎麼使用。

在解決方案下右鍵菜單-添加-建立項目,搜尋C++項目裡的“本機單元測試項目”

VisualStudio為C++項目建立單元測試

具體可以參考微軟官方介紹:編寫适用于 C/C++ 的單元測試 - Visual Studio | Microsoft Docs

測試發現對于簡單的demo小程式沒有什麼問題,但是對于半路接入單元測試的複雜點的項目就暴露了各種問題(當然最好在項目最初就接入單元測試)。

另外實測發現:測試項目必須引入帶測試項目的lib和.obj,某些部落格說不用連結,實測不行。

為DLL項目建立單元測試

還是參考微軟官方介紹:編寫 C++ DLL 單元測試 - Visual Studio | Microsoft Docs

單元測試必須調用不導出的非成員函數,并且代碼必須生成為動态連結庫 (DLL): 在同一項目中添加單元測試作為産品代碼。轉到過程在同一項目中添加單元測試的具體步驟。

這個看上去挺适合自己目前的項目的,然而接入下來并不理想,問題後面一并總結。

主要問題

  • 配置繁瑣
  • 好不容易配置成功,測試出現問題,其中無法執行測試是最常見的:
Failed to set up the execution context to run the test.
           

參考網上的介紹說是,測試DLL所依賴的項目或三方DLL缺失,使用depends檢視依賴關系 配置完全後仍然無法運作(測試demo可以,複雜點項目不行)。放棄。

二、使用Google Test

使用下來發現Google Test要簡單的多,可以參考微軟官方文檔:

如何使用适用于 C++ 的 Google Test - Visual Studio | Microsoft Docs

VisualStudio為C++項目建立單元測試
VisualStudio為C++項目建立單元測試

這裡說下需要注意的地方,因為C++項目一般使用靜态連結庫的方式,是以在建立Google Test項目的時候,選項需要注意。

  • 将Google Test用作,選擇預設的“靜态庫(.lib)”即可;
  • C++運作時庫選擇:靜态連結(也就是MT/MTd),否則就選擇:動态連結(推薦)(也就是MD/MDd)。
  • 選擇要測試的項目(可選):這個勾選要測試的項目名,也可以不選。
VisualStudio為C++項目建立單元測試

在測試項目的屬性-連結器-輸入-附加依賴項裡,配置:…\temp\XXXX\Win32\Debug*.obj

在測試項目的屬性-連結器-正常-附加庫目錄,配置需要連結的三方lib的目錄,這個是和被測試項目的配置一緻。

編寫測試代碼:

#include "pch.h"
#include "../XXXX/XXX.h"    // 被測試項目的代碼


TEST(TestCaseName, TestName) {
	EXPECT_EQ(1, 1);
	EXPECT_TRUE(true);

	// 使用被測試項目的代碼
	ASSERT_STREQ(_T("xxx.xxx"), _T("xxx.xxx"));
}

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

更多使用方法可以參考:googletest/primer.md at master · google/googletest

總結

  • 兩種方法都需要引入被測試項目的lib和obj,其中obj可用相對路徑加*.obj的方式引入;
  • 微軟自帶本機測試項目生成的是dll形式,不友善;而Google Test生成的是exe形式,友善。
  • 微軟自帶本機測試項目問題較多,特别是Failed to set up the execution context to run the test難以解決。
  • Google Test總體配置更簡單,問題更少,可以根據項目屬性自由選擇:靜态連結或動态連結;
  • Google Test測試項目生成的是exe類型的可執行檔案,添加上述的main函數還可以單步調試跟蹤,一旦測試出問題可以很友善調試解決。

參考:

  • 編寫适用于 C/C++ 的單元測試 - Visual Studio | Microsoft Docs
  • 編寫 C++ DLL 單元測試 - Visual Studio | Microsoft Docs
  • 如何使用适用于 C++ 的 Google Test - Visual Studio | Microsoft Docs
  • googletest/primer.md at master · google/googletest

繼續閱讀