将执行的测试是在编译时确定的。您所做的只是使用显式 DLL 加载(函数LoadLibrary
)在运行时。
首先,我建议您根本不要向 DLL 项目添加测试。单元测试代码无需位于将部署给最终用户的 DLL 内。另一个问题是,当您使用显式 DLL 加载时,您必须显式地从 DLL 中检索函数的地址并使用它来调用该函数:
https://msdn.microsoft.com/en-us/library/784bt7z7.aspx https://msdn.microsoft.com/en-us/library/784bt7z7.aspx
这不适合您想要的。您应该执行以下操作:
- 将测试(使用所有所需 DLL 中的函数)添加到项目,该项目将构建将从所有 DLL 运行单元测试的可执行文件。
- 添加函数和类的头文件路径(来自所有所需的 DLL),作为构建此可执行文件的项目的附加包含目录。
- 将此可执行文件链接到
gmock.lib
- 使用设置隐式 DLL 加载
dllimport
存储类属性,因此您不必编写从 DLL 中显式获取将在单元测试中使用的函数地址的代码。
有关隐式 DLL 加载的更多信息,请参阅:
https://msdn.microsoft.com/en-us/library/d14wsce5.aspx https://msdn.microsoft.com/en-us/library/d14wsce5.aspx
EDIT:
由于切换到隐式链接不适合您,因此请按以下方式修改您的方法:
首先,向每个 DLL 添加一个额外的导出函数,该函数运行单元测试:
void runTests(int argc, char *argv[])
{
testing::InitGoogleMock(&argc, argv);
const int status = RUN_ALL_TESTS();
}
然后,在可执行文件的主函数中,循环遍历所有 DLL,并使用以下命令为每个 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);
}
}