1、測試概述
測試並不只是測試工程師的責任,對於開發工程師,爲了保證發佈給測試環節的代碼具有足夠好的質量( Quality ),爲所編寫的功能代碼編寫適量的單元測試是十分必要的。
2、測試之間的關係
白盒測試:全面瞭解程序內部邏輯結構,對所有邏輯路徑進行測試。
單元測試:對軟件基本組成單元進行的測試,這裏的單元是軟件設計的最小單位,單元測試屬於白盒測試範疇。
打樁:在做單元測試或者集成測試時,如果某個程序單元的某條語句需要調用的一個外部函數還沒有完成的話,可以簡單讓它返回幾個支持測試用例的值,這種狀態的外部函數就是“打樁”。
3、單元測試概述
單元測試( Unit Test ,模塊測試)是開發者編寫的一小段代碼,用於檢驗被測代碼的一個很小的、很明確的功能是否正確,通過編寫單元測試可以在編碼階段發現程序編碼錯誤,甚至是程序設計錯誤。
單元測試不但可以增加開發者對於所完成代碼的自信,同時,好的單元測試用例往往可以在迴歸測試的過程中,很好地保證之前所發生的修改沒有破壞已有的程序邏輯。因此,單元測試不但不會成爲開發者的負擔,反而可以在保證開發質量的情況下,加速迭代開發的過程。
4、創建動態庫
4.1 創建
將自己編寫的代碼創建生成一個動態庫,並準備一個導出函數。如何創建一個動態庫?可按照如下操作:
1)新建立一個空項目
2)解決方案管理器中爲項目添加一個頭文件,選擇新建項
3)在新建的頭文件中聲明要導出的API,我添加一個簡單的加和函數:
4)添加一個源文件,實現申明的API函數
#include "DLL.h"
int ADD(int a, int b)
{
return a + b;
}
5)修改項目-》項目屬性-》常規-》配置類型爲動態庫(.DLL)
6)生成解決方案
生成解決方案,可以看到工程目錄的debug目錄或者release目錄下(這取決你生成的是debug版本還是release版本)生成了動態鏈接庫的相關文件。第三方調用時關鍵的文件爲.lib文件和.dll文件以及工程目錄下的.h頭文件。
4.2 調用
1)新建一個C/C++項目(test)
2)將第三方庫的.h文件、.lib文件、.dll文件複製進工程項目中,.dll文件是程序運行需要載入的動態鏈接庫,VS中調試時可以通過 項目->屬性->調試->環境 欄目添加.dll文件的path而成功調試,但在獨立運行.exe程序是須將.dll文件放到同一目錄下,因此建議直接將.dll文件放入debug目錄下或release目錄下。.h頭文件和.lib庫文件可以隨意放置,只要是能夠通過路徑找到即可,爲了方便管理,建議建立文件夾,放置在項目目錄下。
3)在項目中調用第三方庫
有三種方法可以調用第三方庫。
(1)直接在代碼前添加引用
#include "../DLL/DLL.h" //通過相對路徑或絕對路徑添加頭文件
#pragma comment (lib,"../DLL/DLL1.lib") //添加庫文件
void main()
{
std::cout << ADD(3, 4) << std::endl;
}
(2)在解決方案管理面板中添加頭文件和資源文件
添加一個現有項頭文件,在文件夾中找到第三方庫的頭文件(DLL.h),添加進新建立的項目。
添加一個現有項資源文件,在文件夾中找到第三方庫的庫文件(DLL1.lib),添加進新建立的項目。
(3)在項目屬性設置中添加頭文件和庫文件
項目->屬性->VC++目錄->包含目錄 中添加第三方庫的頭文件;庫目錄下添加第三方庫的庫文件(.lib文件)。
項目->屬性->鏈接器->輸入->附加依賴項中輸入庫文件名稱。
4.在函數中調用第三方庫中的函數
void main()
{
std::cout << ADD(3, 4) << std::endl;
}
編譯運行,結果符合預期。
5、創建單元測試工程
在Solution中單擊右鍵,創建新的單元測試工程。這裏我們選擇Native Unit Test Project.
工程名字可以隨便寫,暫時用默認的就可以。
工程創建完成夠,整個solution的結構應該如下圖所示:
其中在unittest1.cpp中是自動生成的單元測試模板。
6、配置單元測試工程
爲了能夠讓單元測試工程和我們創建的動態鏈接庫工程關聯上,我們需要做如下配置。
首先,讓單元測試工程引用動態鏈接庫工程。
然後再將動態鏈接庫的代碼路徑加入到單元測試的Include Directories。
7、 編寫單元測試代碼
我們先簡單看一下unittest1.cpp這部分代碼。
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: Your test code here
}
};
}
namespace UnitTest1 :
這個命名空間名字可以改,但是建議和文件名一致,這樣方便以後看代碼
TEST_CLASS(UnitTest1) :
這個宏設定單元測試的類的名稱,單元測試的名字也儘量要可讀。需要注意的是這是class的名字,需要符合class的命名規範
TEST_METHOD(TestMethod1) :
要測試的方法,名字也可以隨便起,但是最好要和要測試的方法保持一致。比如要測試的方法叫做method,那麼測試方法就叫TestMethod。
在編寫測試代碼時和正常編碼並沒有什麼不同。單元測試的主要思想是通過給定輸入以及預期的輸出,來判斷方法實現是否有問題。比如要測試一個求和函數,輸入爲1和2,那麼預期輸出是3。如果調用方法之後得到的結果不是3,那麼這個測試用例就會失敗,單元測試結果則爲失敗。
具體到我們這個測試,參照如下代碼,輸入參數是10,那麼我們應該得到的結果是5,因爲1到10之間共有5個奇數。(注意,不要忘記在unittest1.cpp中include動態鏈接庫的頭文件)
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(getOddCount(10), 5);
}
在單元測試中,需要使用Assert這個類中的方法對結果進行判斷,這樣測試結果纔會正確的反饋到IDE中。上面的代碼中用到的是AreEqual方法,用於判斷預期結果與方法調用後的結果是否相同。Assert類中有很多用於測試的方法,除了相等還有不等,真假等等,也有讓測試強制失敗的方法,可以根據具體的情況是使用。測試代碼寫完後,我們編譯整個solution或者編譯單元測試project,如果編譯沒有問題的話,就可以開始測試了。
8、 運行單元測試
在上一步中,如果沒有編譯問題的話,我們就可以在Test Explorer中看到現在所有的單元測試。注意,如果更新了單元測試代碼,需要對project重新進行編譯。通過菜單中的Test->Windows->Test Explorer可以打開Test Explorer。
在Test Explorer中點擊Run All就會開始運行所有的單元測試。稍等一會,如果測試通過,就會有如下圖顯示:
這綠色看着真舒服(?)。如果測試未通過
讓我們再修改一下我們的代碼,讓我們的getOddCount函數產生一點小小的錯誤…
int getOddCount(int number)
{
int nCount = 0;
for (int i = 2 i <= number; i++)
{
if (i % 2 != 0)
{
nCount++;
}
}
return nCount;
}
重新編譯整個solution之後,再次重新運行所有的單元測試…
雙擊失敗的單元測試,我們可以快速定位到出錯的地方。
9、可能遇到的錯誤
如果使用的時x64平臺,可以會因爲單元測試工程和目標工程的平臺(x86和x64)不一致導致運行時錯誤,錯誤提示如下:
Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again.
這個時候只要通過菜單Test -> Test Settings -> Default Processor Architecture調整單元測試使用的CPU架構即可。
10、拓展Google Mock
Google Mock是google推出的一個開源的白盒測試工具,可以配合Google Test來做C++的單元測試打樁。一個項目可能需要多個人來協作完成,在進行單元測試的時候,你可能並不關心你所調用的接口是如何實現的,只需要測試你的代碼邏輯、接口是否調用以及傳入的參數是否正確,這種情況下使用Google Mock進行單元測試非常合適。
10.1 Google Mock原理
10.2 Google Mock如何在vs中使用
10.2.1 C
10.2.2 C++
https://www.cnblogs.com/zhanglixina/p/9592761.html
https://blog.csdn.net/russell_tao/article/details/7333226
https://blog.csdn.net/weixin_42670653/article/details/81741814