动态 dll 加载和 googletest

2024-03-19

我有几个基于 MFC 的项目 (DLL)。我想在里面添加一些 GTest/GMock 测试。

我需要以最小的努力做到这一点,所以我的计划是:

  1. 将测试文件添加到每个库并将其链接到 gmock.lib
  2. 准备一个可执行文件,它将使用最少的 main() 动态加载所需的 dll,如下所示:

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

问题是加载的库中的测试对我的 exe 文件不可见(dll 肯定已加载并初始化)。输出是:

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

看来我应该以某种方式将 dll 文件中的测试引入到 exe 中,但我找不到任何信息。 我的做法可以吗?或者也许还有其他简单的方法?


将执行的测试是在编译时确定的。您所做的只是使用显式 DLL 加载(函数LoadLibrary)在运行时。

首先,我建议您根本不要向 DLL 项目添加测试。单元测试代码无需位于将部署给最终用户的 DLL 内。另一个问题是,当您使用显式 DLL 加载时,您必须显式地从 DLL 中检索函数的地址并使用它来调用该函数:

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

这不适合您想要的。您应该执行以下操作:

  1. 将测试(使用所有所需 DLL 中的函数)添加到项目,该项目将构建将从所有 DLL 运行单元测试的可执行文件。
  2. 添加函数和类的头文件路径(来自所有所需的 DLL),作为构建此可执行文件的项目的附加包含目录。
  3. 将此可执行文件链接到gmock.lib
  4. 使用设置隐式 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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态 dll 加载和 googletest 的相关文章

  • 取消任务

    我尝试运行一个关于取消任务的简单示例 如下所示 CancellationTokenSource tokenSource2 new CancellationTokenSource CancellationToken token2 tokenS
  • 如何根据给定的点生成热图

    我想生成 Windows 形式的热图 我有一组点作为输入 如何以最简单的方式做到这一点 谢谢 基于此处已有的答案 此方法允许您指定Colors您希望用作最大和最小颜色 private Color HeatMapColor double va
  • 如何在asp.net中的Lucene.net中进行模糊搜索?

    我们已经创建了 lucene net 索引并基于此 URL 进行搜索http sonyblogpost blogspot in http sonyblogpost blogspot in 但我们想要如下的输出 示例 如果我搜索 精选 我想显
  • 视图中的 XamlParseException

    我有一个仅显示标签的视图 视图模型已正确注入视图中 因为标签的文本已绑定到视图模型属性 现在 如果我尝试在 xaml 中定义 DataGrid 则会出现 XamlParseException System Windows Markup Xa
  • 如何在完成之前从 ReplaySubject 获取最新值

    我需要一种方法来获取添加到 ReplaySubject 中符合特定条件的最新项目 下面的示例代码完成了我需要它做的事情 但感觉不是正确的方法 static void Main string args var o new ReplaySubj
  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • 在 Rcpp 中使用其他包中的 C 函数

    我试图从 C 函数中的 cubature 包调用 C 例程来执行多维积分 我试图重现的基本 R 示例是 library cubature integrand lt function x sin x adaptIntegrate integr
  • C# 将 IntPtr 转换为 int

    我正在动态调用 Windows API 我在网上找到了一些可以做到这一点的代码 并且我对它非常感兴趣 至少可以说 这个想法本身就很出色 但是 我似乎无法让它适用于我的代码 动态调用的参数是类型string string int 我想使用 A
  • 如何在C#背后的代码中动态创建数据模板并绑定TreeView分层数据

    我有一个场景 其中树视图动态更改其数据模板和数据绑定定义 我在 XAML 中创建了一个树视图 如下所示
  • 在编译时查找数组元素位置

    已编辑 大家好 我有一个元素数组 这些元素在程序的所有执行过程中都不会改变 并且其中的项目可以在自己的数组中包含子元素 我必须在处理数组之前准备好它 但是 因为我知道数组不会改变 所以我想将其声明为const 并在编译时准备所有这些 这样我
  • 为什么 GetThreadTimes 返回

    我试图测量线程中花费的时间以用于进度报告目的 但我从 GetThreadTimes 系统调用中得到非常奇怪的结果 给出以下程序 在 VS 2013 中编译 针对 NET 4 5 using System using System Diagn
  • C# 无法将欧元符号打印到文件中(使用 Excel 打开时)

    我在使用 Web api 控制器的 get 方法时遇到问题 此方法返回一个 HttpResponseMessage 对象 该对象具有带有 csv 文件的 HttpContent 其中包含欧元符号 当该方法返回文件时 不会打印欧元符号 该方法
  • 使物体跟随旋转且差异很小

    我正在使我的对象跟随另一个对象的旋转 我希望我的对象以很小的差异旋转 也就是说 从当前的旋转来看 它不应该与另一个对象完全旋转 其旋转应该存在差异 使其旋转主要对象旋转的 10 我该怎么做呢 using System Collections
  • 具有元组类型子集相应参数的模板函数

    我想这样写函数find multi set
  • 输出字段值相同的记录

    该主题可能会重复 我在不同的场景下询问这个话题 https stackoverflow com questions 64150691 select records which the values of the field are the
  • 如何使属性在 POST 请求上必需,但在 PUT 请求上不需要

    假设我有一个用户模型Email and Password用于身份验证目的的属性 如下所示 public class User public long Id get set Required public string FirstName g
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 为什么大多数 STL 实现中的代码如此复杂?

    STL 是 C 世界的重要组成部分 大多数实现都源自 Stepanov 和 Musser 的最初努力 我的问题是考虑到代码的重要性 它是人们出于敬畏和学习目的查看编写良好的 C 示例的主要来源之一 为什么 STL 的各种实现看起来如此令人厌
  • 当从字符串文字初始化 char 数组时会发生什么?

    据我了解 以下代码的工作原理如下 char cptr Hello World Hello World 住在 rodata程序内存的一部分 字符串文字 Hello World 返回一个指向字符串基地址的指针 或者所谓 数组 中第一个元素的地址
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo

随机推荐

  • 如何通过 Spring-Security 在我的控制器上工作?

    我被这个问题困扰了很长时间 我想用 Secure将访问控制添加到我的控制器ArticleController java像这样 RequestMapping headers Accept application json ResponseBo
  • 当 $week mongodb 查询中没有与该周匹配的记录时,如何显示 0 周

    我的收藏如下所示 包含详细信息 1 createdAt 6 13 2018 5 17 07 PM id ObjectId 5b21043b18f3bc7c0be3414c Number 242 State 2 City 3 Website
  • googletrans Translate() 不适用于 Spyder,但适用于 Colab

    我正在本地存储库中的离线数据上使用 googletrans 翻译器 translator Translator translations for element in df myText translations append transl
  • 如何使用 Twig 的 Intl 扩展提高百分比格式的小数精度?

    我有一个 4 位小数 小数位数为 4 最大值为 0 9999 最小值为 0 0000 我正在使用 Twig 及其国际扩展 https twig extensions readthedocs io en latest intl html 当我
  • Scala 警告匹配可能并不详尽

    我对 Scala 有点陌生 以下是我的代码 Option Session get getAttribute player match case None gt val player new Player user getEmail user
  • 是否可以指定选择哪些测试?

    我们有大量的测试 我们希望无限地只在 xml 文件 即 TestNG 套件 中包含的测试之间进行选择 我们不想添加注释groups shouldbetested 在每个测试用例中 而是将 xml 文件中的信息输入到Infinist中 这可能
  • 如何在将在移动设备浏览器上打开的 Highcharts 工具提示中添加链接?

    我正在使用 expo 开发一个 React Native 应用程序 其中一个屏幕包含使用 Highcharts 创建的图形 所有点都有一个关联的tooltip带有一些文本 我想添加一个链接 该链接将在浏览器中 即应用程序外部 打开 URL
  • python错误:数组索引太多

    我的输入是一个 csv 文件 该文件已导入到 postgresqldb 中 后来我使用 keras 构建了一个 cnn 下面的代码给出了以下错误 IndexError 数组索引太多 我对机器学习很陌生 所以我不知道如何解决这个问题 有什么建
  • 将密码存储在私有 Github 存储库中是否被视为良好做法?

    将密码存储在 Github 中是否被认为是好的做法private存储库 相关 但又非常不同 这个问题 https stackoverflow com questions 2397822 what is the best practice f
  • 每个框架内的 module.modulemap 文件中的 export * 是什么?

    我创建了一个名为Communication 在框架的容器内部 有一个module modulemap文件包含以下内容 framework module Communication umbrella header Communication
  • 处理 Windows NotificationIcons 使用的 GUID 的正确方法

    微软文档如下 通过验证是否只有单个应用程序注册使用 GUID 指定的通知图标 可以防止欺骗 第一次调用 Shell NotifyIcon NIM ADD 时执行此注册 并存储调用应用程序的完整路径名 如果您稍后将二进制文件移动到其他位置 系
  • 检查某个键是否被按下?

    我需要检查 VB net 应用程序中是否按下了 SHIFT 或 CTRL 键 有什么想法吗 获取一个布尔值 以下将根据当时是否按下该键返回 True 或 False 从你问题的措辞来看 我认为你是not询问事件处理 这是其他答案已经解决的问
  • 通过 Rails 中的迁移添加自动增量

    如何向名为的列添加自动增量属性user number在我的桌子上users通过 Rails 迁移 我已经有一个 id 字段 它是它的主键 并且它是一个自动增量字段 我正在尝试创建一个新的自动增量字段而不删除此 id 字段 class Cre
  • 十六进制字符串到文本的转换 - swift 3

    我正在尝试将十六进制字符串转换为文本 这就是我所拥有的 Str to Hex func strToHex text String gt String let hexString text data using utf8 map String
  • 渐进式 Web 应用程序和 AngularDart

    我目前正在为我的下一个项目寻找一个网络框架 由于某些原因我对 Angular 感兴趣dart 但同时我希望我的网络应用程序遵循 PWA 指南 我搜索了很多 但没有找到 angulardart 中 PWA 的示例 我看到了一些 JS 对应的例
  • 如何在 Ruby 中迭代内存中的 zip 文件

    我正在编写一个单元测试 其中一个测试返回一个 zip 文件 我想检查该 zip 文件的内容 从中获取一些值 并将这些值传递给下一个测试 我正在使用 Rack Test 所以我知道我的 zip 文件的内容在里面last response bo
  • 未进行任何更改时 Git 合并冲突

    我克隆了一个存储库 然后几个小时后 我创建了 git pull 然而 出现了合并冲突 我不明白为什么 因为我没有对克隆存储库进行任何更改 git status On branch master Your branch is up to da
  • 我可以用PIL全屏显示图像吗?

    如何使用Python图像库全屏显示图像 from PIL import Image img1 Image open colagem3 png img1 show 全屏模式显示 问题的核心 PIL没有全屏打开图像的本机方法 这是有道理的 它不
  • C++ 字符串流跳过一个字符

    我有一个文件 第一行显示为 gt FileName txt 我的目标是读取这一行 并将 FileName txt 保存到名为 name 的变量中 所以我有 ifstream file File opening stuff string li
  • 动态 dll 加载和 googletest

    我有几个基于 MFC 的项目 DLL 我想在里面添加一些 GTest GMock 测试 我需要以最小的努力做到这一点 所以我的计划是 将测试文件添加到每个库并将其链接到 gmock lib 准备一个可执行文件 它将使用最少的 main 动态