Visual C++ 测试现成项目中的错误

Errors in Visual C++ testing in-out-of-the-box project

本文关键字:错误 项目 C++ 测试 Visual      更新时间:2023-10-16

我正在尝试将单元测试添加到本机C++ MFC 应用程序中,但除了问题之外什么都没有。 我想将我的测试添加到我的主应用程序所在的同一项目(这是一个 EXE)。

为了弄清楚我的问题,我尽量干净:

我的项目,如果你想一起玩:https://drive.google.com/open?id=1ru6VU8_dBwiDHUdH_838QxHH4-oQyneG

1)全新安装Visual Studio 2019。 我为带有MFC支持的C++桌面开发进行了设置。 我没有安装 Google Test 或 Boost Test 适配器。

2)创建一个新项目,选择MFC应用程序(我真正的应用程序是)

一切都在调试/x86(32位)中完成

3) 遵循以下说明: https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-microsoft-test-framework-for-cpp?view=vs-2019

4) 新增包含目录: $(VCInstallDir)辅助\VS\UnitTest\include

5) 添加了 lib dir: $(VCInstallDir)Auxiliary\VS\UnitTest\lib

6)在项目中添加了新的C++文件,使用了以下示例:https://learn.microsoft.com/en-us/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference?view=vs-2019#Initialize_and_cleanup

#include "pch.h"
#include <CppUnitTest.h>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
BEGIN_TEST_MODULE_ATTRIBUTE()
TEST_MODULE_ATTRIBUTE(L"Date", L"2010/6/12")
END_TEST_MODULE_ATTRIBUTE()
TEST_MODULE_INITIALIZE(ModuleInitialize)
{
Logger::WriteMessage(L"In Module Initialize");
}
TEST_MODULE_CLEANUP(ModuleCleanup)
{
Logger::WriteMessage(L"In Module Cleanup");
}
TEST_CLASS(Class1)
{
public:
Class1()
{
Logger::WriteMessage(L"In Class1");
}
~Class1()
{
Logger::WriteMessage(L"In ~Class1");
}
TEST_CLASS_INITIALIZE(ClassInitialize)
{
Logger::WriteMessage(L"In Class Initialize");
}
TEST_CLASS_CLEANUP(ClassCleanup)
{
Logger::WriteMessage(L"In Class Cleanup");
}
BEGIN_TEST_METHOD_ATTRIBUTE(Method1)
TEST_OWNER(L"OwnerName")
TEST_PRIORITY(1)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Method1)
{
Logger::WriteMessage(L"In Method1");
Assert::AreEqual(0, 0);
}
TEST_METHOD(Method2)
{
Assert::Fail(L"Fail");
}
};

7)解决方案成功构建。

8) 测试资源管理器显示 2 个测试。 我全部运行,都失败了。 错误似乎在调用记录器::写入消息的模块初始化()中

[7/23/2019 1:27:39 PM Error] Exception Code: C0000005
at ModuleCleanup() in C:WorkTestingMSUnitTestTestMSUnitTestTestMyTests.cpp:line 17

有趣的是,这表示它在ModuleCleanup中,但是单击红色圆圈/白色X的错误消息显示ModuleInitialize。 此外,如果我调试测试,调用堆栈位于模块初始化下。

9) 如果我进入"工具">"选项">"测试">"常规"并将"日志记录级别"更改为"诊断",则得到以下输出:

[7/23/2019 1:28:37 PM Diagnostic] About to Enqueue operation 'RunAllOperation', hashcode:9936281 
[7/23/2019 1:28:37 PM Diagnostic] Enqueue operation 'RunAllOperation', hashcode:9936281 
[7/23/2019 1:28:37 PM Diagnostic] Operation left in the the queue: 1
[7/23/2019 1:28:37 PM Diagnostic]   'RunAllOperation', hashcode:9936281
[7/23/2019 1:28:37 PM Diagnostic] 
[7/23/2019 1:28:37 PM Diagnostic] Processing Queue .....
[7/23/2019 1:28:37 PM Diagnostic] Operation Dequeue : 'RunAllOperation'
[7/23/2019 1:28:37 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=OperationSetStarted, operationInProgress=False
[7/23/2019 1:28:37 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=OperationSetStarted, InProgress=False
[7/23/2019 1:28:37 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=ChangeDetectionStarting, operationInProgress=False
[7/23/2019 1:28:37 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=ChangeDetectionStarting, InProgress=False
[7/23/2019 1:28:37 PM Diagnostic] We programmatically start the build in TestWindowHost.UpdateContainer... 
[7/23/2019 1:28:38 PM Diagnostic] After we await the build that programmatically started in TestWindowHost.UpdateContainer... 
[7/23/2019 1:28:38 PM Diagnostic] TestContainer update (build) complete : 860 ms
[7/23/2019 1:28:38 PM Diagnostic] Adding the Project in Project Map for Guid 09306e37-d569-49e3-8c6f-55ba222f9bba
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://vsprojectoutputcontainerdiscoverer/v1, discovered 1 containers
[7/23/2019 1:28:38 PM Diagnostic] Containers from 'Microsoft.VisualStudio.TestWindow.VsAdapters.VsProjectOutputContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic]   C:WorkTestingMSUnitTestTestMSUnitTestTestDebugMSUnitTestTest.exe:executor://vsprojectoutputcontainerdiscoverer/v1
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://testexplorerservicecontainerdiscoverer/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.TestWindow.Extensibility.TestExplorerServiceContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://353e8aa3-86c4-43e8-a442-164c08626369/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.BoostTestContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://7573647c-28a2-4d17-9cc0-6eb757caba76/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.BoostVsTestContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://ebftest/1.0, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.ExternalBuildProjectContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://c2caea1d-e816-46db-9e64-94c922fcd024/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleVsContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://f225ba42-55fd-4056-b9fa-302522225610/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleVsInBoxContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://5fa831ee-f41c-4604-8b8d-bf32d5606ca1/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleGitHubContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://orderedtestadapter/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.OrderedTestContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://generictestadapter/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.GenericTestContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] test container discoverer executor://webtestadapter/v1, discovered 0 containers
[7/23/2019 1:28:38 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.WebTestContainerDiscoverer' :
[7/23/2019 1:28:38 PM Diagnostic] DiscoveryOperation<RunAllOperation> FinishedChangedCotainers, changed container count is 0
[7/23/2019 1:28:38 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=ChangeDetectionFinished, operationInProgress=False
[7/23/2019 1:28:38 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=ChangeDetectionFinished, InProgress=False
[7/23/2019 1:28:38 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionStarting, operationInProgress=False
[7/23/2019 1:28:38 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionStarting, InProgress=False
[7/23/2019 1:28:38 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionStarted, operationInProgress=False
[7/23/2019 1:28:38 PM Informational] ------ Run test started ------
[7/23/2019 1:28:38 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionStarted, InProgress=False
[7/23/2019 1:28:38 PM Diagnostic] RunSettings Content:
<RunSettings>
<RunConfiguration>
<ResultsDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTestTestResults</ResultsDirectory>
<SolutionDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTest</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<TargetFrameworkVersion>Framework45</TargetFrameworkVersion>
</RunConfiguration>
</RunSettings>
[7/23/2019 1:28:38 PM Diagnostic] Value of UseSpecifiedAdapterLocations as specified in Tools -> Options: True
[7/23/2019 1:28:38 PM Diagnostic] Adapter location settings being used after evaluation: UseSpecifiedAdapterLocations = False, SkipDefaultAdapters = False, AreAllTestContainersCSharpOrVBProjectsOnly = False
[7/23/2019 1:28:38 PM Diagnostic] Final RunSettings for the current TestRunCriteria:
<RunSettings>
<RunConfiguration>
<ResultsDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTestTestResults</ResultsDirectory>
<SolutionDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTest</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<TargetFrameworkVersion>Framework40</TargetFrameworkVersion>
<CollectSourceInformation>True</CollectSourceInformation>
</RunConfiguration>
</RunSettings>
[7/23/2019 1:28:40 PM Error] Exception Code: C0000005
at ModuleCleanup() in C:WorkTestingMSUnitTestTestMSUnitTestTestMyTests.cpp:line 17
[7/23/2019 1:28:40 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=OperationSetFinished, operationInProgress=False
[7/23/2019 1:28:40 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=OperationSetFinished, InProgress=False
[7/23/2019 1:28:40 PM Diagnostic] ***    Run finished using 'InMemoryUnitTestWriter' ***
[7/23/2019 1:28:40 PM Informational] ========== Run test finished: 2 run (0:00:01.9539482) ==========
[7/23/2019 1:28:40 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionFinished, operationInProgress=False
[7/23/2019 1:28:40 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionFinished, InProgress=False

10)由于崩溃似乎在Logger::WriteMessage中,我注释掉了对Logger::WriteMessage的所有调用,然后重试。 仍然崩溃,这次在TestClassImpl::CrtHandlersSetter调用IsDebuggerAttached。 日志包含:

[7/23/2019 2:16:28 PM Diagnostic] About to Enqueue operation 'RunAllOperation', hashcode:66314243 
[7/23/2019 2:16:28 PM Diagnostic] Enqueue operation 'RunAllOperation', hashcode:66314243 
[7/23/2019 2:16:28 PM Diagnostic] Operation left in the the queue: 1
[7/23/2019 2:16:28 PM Diagnostic]   'RunAllOperation', hashcode:66314243
[7/23/2019 2:16:28 PM Diagnostic] 
[7/23/2019 2:16:28 PM Diagnostic] Processing Queue .....
[7/23/2019 2:16:28 PM Diagnostic] Operation Dequeue : 'RunAllOperation'
[7/23/2019 2:16:28 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=OperationSetStarted, operationInProgress=False
[7/23/2019 2:16:28 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=OperationSetStarted, InProgress=False
[7/23/2019 2:16:28 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=ChangeDetectionStarting, operationInProgress=False
[7/23/2019 2:16:28 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=ChangeDetectionStarting, InProgress=False
[7/23/2019 2:16:28 PM Diagnostic] We programmatically start the build in TestWindowHost.UpdateContainer... 
[7/23/2019 2:16:28 PM Diagnostic] After we await the build that programmatically started in TestWindowHost.UpdateContainer... 
[7/23/2019 2:16:28 PM Diagnostic] TestContainer update (build) complete : 542 ms
[7/23/2019 2:16:28 PM Diagnostic] Adding the Project in Project Map for Guid 09306e37-d569-49e3-8c6f-55ba222f9bba
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://vsprojectoutputcontainerdiscoverer/v1, discovered 1 containers
[7/23/2019 2:16:28 PM Diagnostic] Containers from 'Microsoft.VisualStudio.TestWindow.VsAdapters.VsProjectOutputContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic]   C:WorkTestingMSUnitTestTestMSUnitTestTestDebugMSUnitTestTest.exe:executor://vsprojectoutputcontainerdiscoverer/v1
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://testexplorerservicecontainerdiscoverer/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.TestWindow.Extensibility.TestExplorerServiceContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://66783bf0-ccb1-4169-8acc-0ab56235af80/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.BoostTestContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://fdfb8d12-5f69-4cba-a2f3-e104d80b7f94/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.BoostVsTestContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://ebftest/1.0, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.ExternalBuildProjectContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://7ebc7e50-a310-497b-a268-0a992b204497/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleVsContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://9bb99e40-f237-4b21-b326-205ddf200b69/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleVsInBoxContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://0fbbb65f-8d69-4bdd-9617-417d847e3a88/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.Workspace.ExternalBuildFramework.Impl.TestExplorer.GoogleGitHubContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://orderedtestadapter/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.OrderedTestContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://generictestadapter/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.GenericTestContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] test container discoverer executor://webtestadapter/v1, discovered 0 containers
[7/23/2019 2:16:28 PM Diagnostic] No containers found from 'Microsoft.VisualStudio.MSTest.TestWindow.WebTestContainerDiscoverer' :
[7/23/2019 2:16:28 PM Diagnostic] DiscoveryOperation<RunAllOperation> FinishedChangedCotainers, changed container count is 0
[7/23/2019 2:16:28 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=ChangeDetectionFinished, operationInProgress=False
[7/23/2019 2:16:28 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=ChangeDetectionFinished, InProgress=False
[7/23/2019 2:16:28 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionStarting, operationInProgress=False
[7/23/2019 2:16:28 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionStarting, InProgress=False
[7/23/2019 2:16:28 PM Informational] ------ Run test started ------
[7/23/2019 2:16:28 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionStarted, operationInProgress=False
[7/23/2019 2:16:28 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionStarted, InProgress=False
[7/23/2019 2:16:28 PM Diagnostic] RunSettings Content:
<RunSettings>
<RunConfiguration>
<ResultsDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTestTestResults</ResultsDirectory>
<SolutionDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTest</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<TargetFrameworkVersion>Framework45</TargetFrameworkVersion>
</RunConfiguration>
</RunSettings>
[7/23/2019 2:16:28 PM Diagnostic] Value of UseSpecifiedAdapterLocations as specified in Tools -> Options: True
[7/23/2019 2:16:28 PM Diagnostic] Adapter location settings being used after evaluation: UseSpecifiedAdapterLocations = False, SkipDefaultAdapters = False, AreAllTestContainersCSharpOrVBProjectsOnly = False
[7/23/2019 2:16:29 PM Diagnostic] Final RunSettings for the current TestRunCriteria:
<RunSettings>
<RunConfiguration>
<ResultsDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTestTestResults</ResultsDirectory>
<SolutionDirectory>C:WorkTestingMSUnitTestTestMSUnitTestTest</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<TargetFrameworkVersion>Framework40</TargetFrameworkVersion>
<CollectSourceInformation>True</CollectSourceInformation>
</RunConfiguration>
</RunSettings>
[7/23/2019 2:16:34 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=OperationSetFinished, operationInProgress=False
[7/23/2019 2:16:34 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=OperationSetFinished, InProgress=False
[7/23/2019 2:16:34 PM Error] The active test run was aborted. Reason: Test host process crashed : Process is terminated due to StackOverflowException.
[7/23/2019 2:16:34 PM Diagnostic] Cancel requested, actions left in queue 2, exiting...
[7/23/2019 2:16:34 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionCanceling, operationInProgress=False
[7/23/2019 2:16:34 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionCanceling, InProgress=False
[7/23/2019 2:16:34 PM Diagnostic] ***    Run finished using 'InMemoryUnitTestWriter' ***
[7/23/2019 2:16:34 PM Informational] ========== Run test finished: 0 run (0:00:05.9716557) ==========
[7/23/2019 2:16:34 PM Diagnostic] VirtualReadOnlyTestDataStore.OperationStateChanged State=TestExecutionCancelAndFinished, operationInProgress=False
[7/23/2019 2:16:34 PM Diagnostic] TestDiscoveryStats.OperationStateChanged State=TestExecutionCancelAndFinished, InProgress=False

我花了很多时间在各种排列中。 我真的更愿意将测试代码保留在主项目中,因为这是一个遗留应用程序,并且我遇到了包含/链接器地狱,试图在单独的测试项目中执行此操作。 如果我必须这样做,我会的,但Microsoft说他们支持将测试保留在exe的项目中。

我真的不在乎使用 MSTest 与 Google 测试,我只想要一些有效的东西,这样我就可以进行实际的测试编写。

帮助!

>Microsoft建议的解决方法是将项目从exe更改为DLL,此时测试就可以了。 这确实适用于我作为临时解决方法。

我使用 #ifdef _WINDLL 宏来确定我们是在构建 exe 还是 dll,并根据需要隐藏测试代码。

希望他们能在未来的Visual Studio更新中为exe修复此问题。

相关文章: