gpt4 book ai didi

c++ - Visual C++ 测试开箱即用项目中的错误

转载 作者:行者123 更新时间:2023-11-28 20:13:06 26 4
gpt4 key购买 nike

我正在尝试将单元测试添加到 native 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 App(我的真实应用是)

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

3) 按照这些说明操作:https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-microsoft-test-framework-for-cpp?view=vs-2019

4) 添加了包含目录:$(VCInstallDir)Auxiliary\VS\UnitTest\include

5) 添加库目录:$(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 个测试。我运行所有,都失败了。错误似乎在调用 Logger::WriteMessage 的 ModuleInitialize() 中

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

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

9) 如果我进入 Tools > Options > Test > General 并将 Logging Level 更改为 Diagnostic,我将得到以下输出:

[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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\Debug\MSUnitTestTest.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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\TestResults</ResultsDirectory>
<SolutionDirectory>C:\Work\Testing\MSUnitTestTest\MSUnitTestTest\</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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\TestResults</ResultsDirectory>
<SolutionDirectory>C:\Work\Testing\MSUnitTestTest\MSUnitTestTest\</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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\MyTests.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 的所有调用并重试。仍然崩溃,这次是在调用 IsDebuggerAttached 的 TestClassImpl::CrtHandlersSetter 中。日志包含:

[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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\Debug\MSUnitTestTest.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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\TestResults</ResultsDirectory>
<SolutionDirectory>C:\Work\Testing\MSUnitTestTest\MSUnitTestTest\</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:\Work\Testing\MSUnitTestTest\MSUnitTestTest\TestResults</ResultsDirectory>
<SolutionDirectory>C:\Work\Testing\MSUnitTestTest\MSUnitTestTest\</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

我在各种排列中花了很多时间。我真的更愿意将测试代码保留在主项目中,因为这是一个遗留应用程序,我遇到了 include/linker hell 试图在一个单独的测试项目中执行它。如果必须这样做,我会这样做,但微软表示他们支持将测试保留在 exe 的项目中。

我真的不关心使用 MSTest 还是 Google Test,我只想要一些有用的东西,这样我就可以开始实际的测试编写了。

帮助!

最佳答案

Microsoft 建议的解决方法是将项目从 exe 更改为 dll,此时测试有效。作为临时解决方法,这对我来说确实有效。

我已经使用#ifdef _WINDLL 宏来确定我们是在构建 exe 还是 dll,并适本地隐藏测试代码。

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

关于c++ - Visual C++ 测试开箱即用项目中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com