- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
前几天,我决定需要了解 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您可以定义入口点并注册您自己的函数,所以我试了一下:
#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 以访问你的代码。如果有人知道更优雅的解决方案,我很想听听...
最佳答案
使用 Global Fixture .夹具是为每个测试设置初始化/关闭代码的好方法。全局夹具让您可以为整个测试套件定义初始化/关闭代码。
关于c++ - CoInitializeEx 用于 boost::test::unit_test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5219993/
我有一个调用 C++ 方法的 C# 方法。C++ 方法使用 WMI,因此它先调用 CoInitializeEx(0, COINIT_MULTITHREADED),然后调用 CoInitializeSe
我正在通过 C++ 学习 COM。来自 MSDN : Applications are required to use CoInitializeEx before they make any othe
我正在为 DSLR 相机开发一个 SDK,其中包含以下说明: Notes on Developing Windows Applications When creating applications t
尝试使用 hres = CoInitializeEx(0, COINIT_MULTITHREADED); 时出现以下错误 error C2065: 'CoInitializeEx' : undecla
我正在使用 WinAPI 函数 ShellExecuteEx() 在 Windows 资源管理器中打开一个文件夹。 根据 MSDN,我应该总是在使用 ShellExecuteEx() 之前调用 CoI
前几天,我决定需要了解 Windows 平台上 C++ 的测试驱动开发(使用 Visual Studio 2010 Premium)。 在决定试用 boost 的单元测试框架之前,我环顾四周。我应该说
我正在尝试使用此处的 Microsoft 教程为 WMI 编程设置 COM 连接。我稍微修改了示例代码以适合我的风格。到目前为止,我的代码如下: #include #include #includ
我们有一个用 Go 编写的监控代理,它使用许多 goroutines 从 WMI 收集系统指标。我们最近发现当 go 二进制文件在 Server 2016 或 Windows 10(也可能在其他使用
前段时间,我不得不修改一个旧的 COM DLL(Visual C++ 2010,ATL),将它从“Apartment”线程模型迁移到“Both”,即现在可以从 STA 和 MTA 线程调用它而无需序列
在一个线程中,如果我使用 有什么区别吗 Coinitialize(nil) 而不是 CoInitializeEx(0, COINIT_MULTITHREADED); 我使用 Delphi 7,但我认为
我正在尝试将一些 OpenCV 功能集成到我的应用程序中。目前,我已使用 DirectShow 设置代码以从我的相机获取视频源,然后将其显示在 MFC 窗口中。此代码无法更改或删除。 代码运行完全正常
我是一名优秀的程序员,十分优秀!