2016-01-22 78 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中保持单元测试是最好的方法,但是总是在调试模式下运行测试只会导致一些细微的错误漏洞。考虑不时在发布模式下构建单元测试,并运行它们以确保安全。 –