c++ 当使用GoogleTest运行测试时,会发生SEH异常,并带有简单的变量定义

yh2wf1be  于 2023-08-09  发布在  Go
关注(0)|答案(1)|浏览(173)

当我使用下面的过程运行单元测试时,一个简单的声明(如“CStringa;“。环境是Visual Studio 2019,语言是C++。

  • Boot VisualStudio 2019
  • 单击“创建新项目”
  • 选择“MFC应用程序”,单击“下一步”
  • 为“位置”项设置一个任意文件夹,然后使用其他默认值单击“创建”。
  • 将所有设置保留为默认设置,然后单击“完成”。
  • 将创建一个默认名称为“MFCApplication 1”的项目。
  • 在“解决方案资源管理器”中右键单击“MFCApplication 1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,在“ C++ 标准”项中设置“ISO C17标准(/std:c17)”。
  • 在“解决方案资源管理器”中右键单击“MFCApplication 1”项目,然后单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“使用MFC”项中设置“在共享DLL中使用MFC”,并在“字符集”项中设置“使用多字节字符集”。增加。
  • 将“SampleClass.cpp”和“SampleClass.h”添加到项目中。

SampleClass.h

#pragma once

class _DllExport SampleClass
{
public:
    SampleClass(void);
    virtual ~SampleClass(void);
    char*   sampleMethod();
protected:
private:
};

字符串
SampleClass.cpp

#include "pch.h"
#include <string.h>

#include "SampleClass.h"

SampleClass::SampleClass(void) {
}

SampleClass::~SampleClass(void) {
}

char*   SampleClass::sampleMethod() {
    CString a;
    return "test";
}

  • 将代码添加到pch. h
#define _DllExport   __declspec( dllexport )

  • 生成项目并确保它完成时没有错误。
  • 在“解决方案资源管理器”中右键单击解决方案,然后单击添加>新建项目...
  • 选择“Google Test”,然后单击“Next”。
  • 保留“Configure your new project”中的所有默认值,然后单击“Create”。
  • 在“测试项目配置”中的“选择要测试的项目”处选择“MFCApplication 1”,然后单击“确定”,其他项目为默认值。
  • 添加了一个名为“Sample-Test1”的新测试项目。
  • 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,在“ C++ 标准”项中设置“ISO C17标准(/std:c17)”。
  • 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“使用MFC”项中设置“在共享DLL中使用MFC”,并在“字符集”项中设置“使用多字节字符集”。增加。
  • 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。将“$(ProjectDir)..\MFCApplication1\Debug\MFCApplication1.lib”添加到“Configuration Properties”>“Linker”>“Input”的“Additional Dependencies”项。
  • 将以下代码添加到“Sample-Test1”项目。

test.cpp

#include "pch.h"
#include "..\MFCApplication1\SampleClass.h"

TEST(TestCaseName, TestSampleMethod) {
    SampleClass sampleClass;
    char* value = sampleClass.sampleMethod();
    EXPECT_TRUE(strcmp(value, "test") == 0);
}

  • 将代码添加到“Sample-Test1”项目的pch. h
#define _DllExport   __declspec( dllimport )

  • 运行生成并确保它完成而没有错误。
  • 右键单击“测试资源管理器”中显示的“TestName”项,然后单击“调试”以调试测试方法。
  • 然后,在一个没有描述性的代码(如“CStringa;“。此外,在定义“std::vector“等变量和处理“memset”和“printf”等时,会在运行时发生异常。
Exception thrown at 0x80000142 in Sample-Test1.exe: 0xC0000005: Access violation executing location 0x80000142.

unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.


在几乎使用默认设置创建的项目中,简单的测试无法通过。我还需要配置其他东西吗?最后,我想用下面的代码完成测试而不出现任何问题。所有这些都在运行单元测试时引发异常。

  • 向成员变量添加“CString”或“std::vector”等变量
  • 使用局部变量作为“CString”或“std::vector“等变量
  • 使用标准库函数,如“memset”和“vsprintf_s”
  • 我尝试了以下版本。VS 2019专业版(v16.11、v16.7)和VS 2022。但是,没有一个版本解决了这个问题。我希望它能在VS 2019专业环境中工作。
  • 我不仅尝试了Google Test,还尝试了一个原生单元测试项目,但它没有解决。
1cosmwyk

1cosmwyk1#

来自doc:链接到对象或库文件
将输出的.obj或.lib文件添加到测试项目的依赖项中。
当你使用非库项目时,你应该链接到obj文件。然后删除_DllExport。对于MFC项目,您应该链接->input:GTest项目中的SampleClass.obj和PCH.obj。obj文件位于以下文件夹中:MFCApplication1\x64\Debug

相关问题