CoInitializeEx 用于 boost::test::unit_test

2024-01-10

有一天,我决定需要了解 Windows 平台上的 C++ 测试驱动开发(使用 Visual Studio 2010 Premium)。

在决定尝试 boost 的单元测试框架之前,我环顾四周。我应该说我选择了 boostpro.com 的版本(如果我没记错的话,当前版本是 1.44)。它有一个静态库的构建,所以我在测试中没有使用 DLL。

Boost 的单元测试文档讨论了将代码与测试套件分离,这似乎很合理。但是,您必须处理从现在单独的测试套件项目引用代码的问题。

所以我有一个想要测试的库项目(但我仍然不确定如何编写可以引用 .exe 项目的测试...)

因此,我在解决方案中创建了一个单独的项目,称为单元测试。我添加了以下代码:

#include "stdafx.h"

#define BOOST_TEST_MODULE Crash
#include <boost/test/unit_test.hpp> 
#include "LameEncoder.h"

BOOST_AUTO_TEST_SUITE(CrashTestSuite)

BOOST_AUTO_TEST_CASE(EncoderAvailable)
{
    using namespace Crash::SystemDevices::Audio::Compressors::LameEncoder;

    HRESULT hr = S_OK;
    CComPtr <IBaseFilter> spEncoder;

    hr = spEncoder.CoCreateInstance( CLSID_LAMEDShowFilter );
    if( spEncoder.p )
        spEncoder.Release();

    BOOST_CHECK_EQUAL( hr, S_OK );
}

BOOST_AUTO_TEST_CASE(ProfilesGenerated)
{
    using namespace Crash::SystemDevices::Audio::Compressors::LameEncoder;  
    BOOST_CHECK_EQUAL ( EncoderProfiles.size(), 6 );
}

BOOST_AUTO_TEST_SUITE_END()

我静态链接到“崩溃”库项目输出,然后添加以下构建后事件以获取构建后报告:

"$(TargetDir)\$(TargetName).exe" --result_code=no --report_level=short

构建后输出如下所示:

1>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
1>  UnitTests.cpp
1>  UnitTests.vcxproj -> F:\Projects\Crash\trunk\Debug\UnitTests.exe
1>  Running 2 test cases...
1>  f:/projects/crash/trunk/unittests/unittests.cpp(19): error in "EncoderAvailable": check hr == ((HRESULT)0L) failed [-2147221008 != 0]
1>  
1>  Test suite "Crash" failed with:
1>    1 assertion out of 2 passed
1>    1 assertion out of 2 failed
1>    1 test case out of 2 passed
1>    1 test case out of 2 failed

我预计 EncoderAvailable 测试会失败,因为我还没有为线程初始化 COM 单元。我假设我不能使用自动测试,而是需要用我在主函数中手动定义自己的测试替换自动测试,并在主函数中执行 CoInitializeEx() 调用。

我读了here http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.html您可以定义入口点并注册您自己的函数,所以我尝试了一下:

#include "stdafx.h"

#include <boost/test/unit_test.hpp>
using namespace boost::unit_test;

#include "LameEncoderTests.h"


test_suite*
init_unit_test_suite( int argc, char* argv[] ) 
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    framework::master_test_suite().
        add( BOOST_TEST_CASE( &LameEncoderAvailable ) );

    framework::master_test_suite().
        add( BOOST_TEST_CASE( &LameEncoderProfilesGenerated ) );

    CoUninitialize();

    return 0;
}

这是构建输出:

    1>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
1>  UnitTests.cpp
1>  UnitTests.vcxproj -> F:\Projects\Crash\trunk\Debug\UnitTests.exe
1>  Running 2 test cases...
1>  f:/projects/crash/trunk/unittests/lameencodertests.h(17): error in "LameEncoderAvailable": check hr == ((HRESULT)0L) failed [-2147221008 != 0]
1>  
1>  Test suite "Master Test Suite" failed with:
1>    1 assertion out of 2 passed
1>    1 assertion out of 2 failed
1>    1 test case out of 2 passed
1>    1 test case out of 2 failed
1>  
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

该测试失败在第一个测试 LameEncoderAvailable 上失败,这是以下简单函数:

void LameEncoderAvailable()
{
    using namespace Crash::SystemDevices::Audio::Compressors::LameEncoder;

    HRESULT                 hr              = S_OK;
    CComPtr<IBaseFilter>    spEncoder;

    hr = spEncoder.CoCreateInstance( CLSID_LAMEDShowFilter );
    if( spEncoder.p )
        spEncoder.Release();

    BOOST_CHECK_EQUAL( hr, S_OK );
}

谁能告诉我在哪里进行 CoInitializeEx() 调用的正确位置 - 我认为我不应该每次测试都这样做一次 - 每个线程应该只执行一次......

至于测试 exe 项目,我想您可以指定一个单独的 main.cpp (testmain.cpp 或其他东西)并从构建中排除真正的 main.cpp 以访问您的代码。如果有人知道一个更优雅的解决方案,我很想听听......


Use a 全球赛程 http://www.boost.org/doc/libs/1_46_0/libs/test/doc/html/utf/user-guide/fixture/global.html。夹具是为每个测试设置初始化/关闭代码的好方法。全局夹具允许您为整个测试套件定义初始化/关闭代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoInitializeEx 用于 boost::test::unit_test 的相关文章

  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 为什么某些安装程序需要在运行程序之前重新启动计算机?

    我对部署桌面应用程序相当陌生 所以这是我第一次为我的软件构建安装程序 目前 我安装软件后第一次运行它时 它崩溃了 之后 它运行良好 我仍在调试此问题 但我注意到在安装后和运行软件之前立即重新启动似乎可以修复此崩溃 某些安装程序要求您在运行软
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 使用 Square Connect API 访问客户信息

    是否可以使用 Square Connect API 访问有关商家客户的任何信息 最理想的信息是客户输入的收据电子邮件地址 但某种类型的唯一客户 ID 可以很好地确定回头客 纵观整个Square Connect API 文档 https co
  • 为什么通过提取方法进行重构会触发借用检查器错误?

    我的网络应用程序的架构可以简化为以下内容 use std collections HashMap Represents remote user Usually has fields but we omit them for the sake
  • UIStackview 左对齐

    我试图将 UIStackview 中的项目水平向左对齐 有没有办法以编程方式执行此操作 我尝试通过故事板来做到这一点 但没有成功 由于某种原因 UIStackView 中的项目会自行居中 如果您使用 StackView 将 axis 属性设
  • ASP.Net 应用程序作为 IIS_USR 执行 powershell 脚本

    我正在构建一个 asp net mvc 应用程序 它将作为我们编写的许多 powershell 脚本的包装器来运行 以管理日常任务 最终目标是让非技术人员轻松使用这些脚本 我已经设法让脚本很好地执行 var ctx System Web H
  • 用C++实现二阶低通滤波器,如何计算系数?

    我正在努力寻找合适的算法来生成低通滤波器的系数 我写了以下内容butterworthLowPass代码来自another https stackoverflow com a 20932062 2612235那么问题 class Filter
  • DialogFragment 已触发,但未显示导航架构组件中的布局

    在我的一个应用程序中 我使用 Android 导航架构组件 一切都很顺利 但当我想导航到 DialogFrgment 时 我陷入了困境 虽然触发了DialogFragment 但没有看到布局 只能看到重叠模糊背景 无法弄清楚实际问题 这是我
  • 如何使用 nvm-windows 同时运行两个不同的节点版本?

    问题 我们需要在两个不同的应用程序上同时运行和使用两个不同的节点版本 即 14 12 以支持使用 npm run dev npm install具有相应定义版本的命令 到目前为止我们尝试过的步骤 Created nvmrc每个应用程序上定义
  • 有关从一台设备到另一台设备的 Android 内核移植的指南

    我拥有一台 Samsung Galaxy 3 并且想要移植可用于其他 Android 设备的内核 我已经准备好了所有的建筑环境 我也有C知识 我到底不明白的是移植涉及什么以及如何以及什么 哪些代码应该以什么方式修改 如果有人可以帮助我 这会
  • 对象不继承原型函数

    我有一个构造函数 它充当超类 Bla function a this a a 我将其原型化为包含一个简单的方法 Bla prototype f function console log f 现在新的Bla 1 f 将在控制台中记录 f 但是
  • Pytorch 无法将训练好的模型导出为 ONNX

    我一直在使用多个卷积层 3x3 步长 1 填充相同 在 Pytorch 框架中训练模型 该模型表现良好 我想在 Matlab 中使用它进行推理 为此 框架之间的 NN 交换的 ONNX 格式似乎是 唯一的 解决方案 可以使用以下命令导出模型
  • 使用什么机器实例在 Google Cloud Platform 中运行 GPU 工作负载 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在尝试运行 Elasticsearch BERT 应用程序 并想了解使用 GPU 微调模型的最小配置 我应该使用什么机器配置 参考githu
  • C++ 操作符删除失败,如果不能,为什么?

    在内存解除分配期间 操作符删除是否可以抛出异常或以其他方式发出错误信号 以其他方式是否有可能operator delete失败 在这种情况下它的默认行为是什么 ISO 标准对此有何规定 例如在 Windows 操作系统中 C operato
  • SASS:生成的 CSS 不是最佳的

    我正在努力学习SASS 我让这个代码片段工作了 但在我看来生成的 css 很糟糕 我希望所有这些 css 都放在同一个 container 中 没有三个不同 如下所示 SASS container extend clearfix exten
  • 如何检查 json 中的所有键是否都等于 true

    如何检查 json 对象中的所有键是否都等于 true 我的对象看起来像这样 success first name false middle name false last name false d o b false sex false
  • ansible、命令模块和带管道的 jq

    我正在尝试运行一个返回容器列表及其大小的 docker 命令 命令是docker container ls format name Names size Size all jq slurp 当我尝试在 Ansible 剧本中运行它时 它会爆
  • SSIS 导入 Excel 日期时出错(截断错误)

    我很抱歉发布了一个看似非常简单的问题 但我找不到答案 而且我浪费了几天 此时不仅仅是几个小时 我对 SSIS 还很陌生 它只是让我感到不舒服 背景 非常简单的 SSIS 包 用于将 Excel 工作表导入 SQL Server 中的临时表
  • 使用Python获取视频属性,无需调用外部软件

    更新 是的 有可能 现在大约 20 个月后了 请参阅下面的更新3 更新 这真的不可能吗 我能找到的只是调用 FFmpeg 或其他软件 的变体 我当前的解决方案如下所示 但我真正想要的可移植性是一个仅 Python 的解决方案 不需要用户安装
  • 如何在Python ElementTree中插入子子元素

    我的 XML
  • 单个 MSI 安装正确的 32 或 64 位 C# 应用程序

    我有一个为 x86 32 位 和 x64 64 位 平台构建的 C 应用程序 我的构建系统当前输出 两个 MSI 安装程序 每个平台一个 为了以防万一 我的 C 应用程序包含一个 Windows 任务栏工具栏 这意味着安装的 DLL 必须由
  • CoInitializeEx 用于 boost::test::unit_test

    有一天 我决定需要了解 Windows 平台上的 C 测试驱动开发 使用 Visual Studio 2010 Premium 在决定尝试 boost 的单元测试框架之前 我环顾四周 我应该说我选择了 boostpro com 的版本 如果