2016-01-22 83 views
2

我有幾個基於MFC的項目(DLL)。我想在裏面添加一些GTest/GMock測試。動態DLL負載和谷歌測試

我需要用最少的efford做這樣馬的計劃是:

  1. 附加測試文件到每個庫,並將其鏈接對gmock.lib
  2. 準備一份動態加載所需的一個可執行文件以最小的主DLL()是這樣的:

    int main(int argc, char** argv) 
    { 
        LoadLibrary(argv[1]); 
        testing::InitGoogleMock(&argc, argv); 
    
        const int status = RUN_ALL_TESTS(); 
    
        return status; 
    } 
    

的問題是,從裝載的庫測試是不可見的米y exe文件(dll被加載並確認初始化)。輸出是:

[==========] Running 0 tests from 0 test cases. 
[==========] 0 tests from 0 test cases ran. (0 ms total) 
[ PASSED ] 0 tests. 

這似乎我應該以某種方式從dll文件引入測試到exe但我找不到任何信息。 我的方法好嗎?或者也許還有其他簡單的方法?

回答

2

將在編譯時確定將執行的測試。你所做的只是在運行時使用顯式DLL加載(函數LoadLibrary)將DLL加載到進程地址空間中。

首先,我建議您不要將測試添加到您的DLL項目中。單元測試代碼不需要在將被部署給最終用戶的DLL內。另一個問題是,當你使用顯式加載DLL,你必須明確地檢索DLL中的函數的地址,並用它來調用該函數:

https://msdn.microsoft.com/en-us/library/784bt7z7.aspx

這是不適合你,你想要什麼。你應該做的是以下幾點:

  1. 添加測試(它使用所有所需的DLL的函數),項目將構建將運行所有DLL的單元測試的可執行文件。
  2. 爲函數和類(來自所有所需的DLL)添加頭文件路徑作爲構建此可執行文件的項目的附加包含目錄。
  3. 鏈接這個可執行文件使用dllimport存儲類屬性,所以您不必編寫的代碼,明確收購的函數的地址,從將在單元測試中使用的DLL gmock.lib
  4. 設置隱性加載DLL。

有關隱DLL加載的詳細信息,請參閱:

https://msdn.microsoft.com/en-us/library/d14wsce5.aspx

編輯:

自從改用隱式鏈接是不是一種選擇適合你,修改你的方法是這樣的:

首先,爲每個DLL添加一個額外的導出函數,用於運行單元測試:

void runTests(int argc, char *argv[]) 
{ 
    testing::InitGoogleMock(&argc, argv); 
    const int status = RUN_ALL_TESTS(); 
} 

然後,在你的可執行文件的主要功能,遍歷所有DLL文件並執行此導出函數爲他們每個人使用下列內容:

HMODULE hDLL = LoadLibraryA("MyDLL"); 
if(hDLL != NULL) 
{ 
    fpRunTests runTestsFun = (fpRunTests)GetProcAddress(hDLL, "runTests"); 
    if(!runTestsFun) 
    { 
     // Handle the error 
     FreeLibrary(hDLL); 
    } 
    else 
    { 
     // Call the function which runs tests 
     runTestsFun(argc, argv); 
    } 
} 
+0

感謝您的回答。你的解決方案有一些缺點:1.Dll由數千個類和函數組成,我不能使它們全部可見,所以在exe文件中的測試可以使用它們全部。 2.爲每個DLL在Visual Studio中製作單獨的exe項目可能不是正確的方法。在dll中進行測試對我來說很好,因爲測試在發佈版本中根本不會編譯。 –

+1

@MichałWalenciak1.我確實知道這是這種情況,我已經編輯了我的答案,以便單元測試在DLL內部。 2.我不打算建議你爲每個DLL分別製作一個exe文件。但是,這從我的回答中並不清楚,所以我明白你爲什麼認爲我在暗示它。我還編輯了答案的這一部分以清楚地說明問題。 –

+1

@MichałWalenciak請注意一件事。我明白在DLL中保持單元測試是最好的方法,但是總是在調試模式下運行測試只會導致一些細微的錯誤漏洞。考慮不時在發佈模式下構建單元測試,並運行它們以確保安全。 –