Unit testing Visual Studio中使用Catch2进行单元测试的最佳实践 我对C++中的单元测试是新的,希望能对此有所帮助。 我使用VisualStudio2019进行开发,选择Catch2作为测试库,还安装了Catch2的测试适配器

Unit testing Visual Studio中使用Catch2进行单元测试的最佳实践 我对C++中的单元测试是新的,希望能对此有所帮助。 我使用VisualStudio2019进行开发,选择Catch2作为测试库,还安装了Catch2的测试适配器,unit-testing,visual-c++,catch-unit-test,catch2,Unit Testing,Visual C++,Catch Unit Test,Catch2,我在GitHub上阅读了Catch2和Catch2测试适配器的文档,但仍然无法找到在VisualStudio中使用单元测试的正确方法 假设我已经有一个项目,其中包含一些类,我想测试这些类。 我应该将带有测试代码的文件放在同一个项目中,还是应该在解决方案中创建新的测试项目 当我尝试第一种方法时,除非注释掉项目的main()函数,否则测试资源管理器不会发现测试。 使用第二种方法,虽然我设置了头文件的正确相对路径,并引用了测试项目中的主项目,但我的类的方法仍然存在大量未解决的外部符号错误: LNK20

我在GitHub上阅读了Catch2和Catch2测试适配器的文档,但仍然无法找到在VisualStudio中使用单元测试的正确方法

假设我已经有一个项目,其中包含一些类,我想测试这些类。 我应该将带有测试代码的文件放在同一个项目中,还是应该在解决方案中创建新的测试项目

当我尝试第一种方法时,除非注释掉项目的main()函数,否则测试资源管理器不会发现测试。 使用第二种方法,虽然我设置了头文件的正确相对路径,并引用了测试项目中的主项目,但我的类的方法仍然存在大量未解决的外部符号错误:

LNK2019 unresolved external symbol "public: bool __thiscall MyClass::Check(int,int)" (?Check@MyClass@@QAE_NHH@Z) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____0(void)" (?____C_A_T_C_H____T_E_S_T____0@@YAXXZ)

如果有人告诉我在VS中使用Catch2进行单元测试的正确方法,我将不胜感激。

好的,我想我找到了一个合适的工作流,可以让Catch2在Visual Studio 2019中进行测试:

  • 使用被测项目(PuT)的解决方案创建一个新项目。。这将是我们的测试项目
  • 添加要从测试项目放入的引用
  • 在测试项目中,创建一个源文件并将以下行放入其中
  • 编写一些测试。您可以有任意多个带有测试的源文件,但请记住,其中只有一个必须具有
    \define CATCH\u CONFIG\u MAIN
    声明
  • 在测试项目配置属性中,设置以下设置
    • 链接器->常规->附加库目录-在此处添加指向PuT的对象文件目录的路径
    • Linker->Input->Additional Dependencies-在这里,用分号分隔put的对象文件名称(不是路径,只是.OBJ文件的名称!),这些名称在测试中使用。例如,如果您想测试MyCode.h中声明的一些代码,请将MyCode.obj文件名放在这里。从PuT引用更多头文件时,不要忘记更新此设置
  • 打开测试资源管理器
  • 将带有的.runsettings文件添加到解决方案根文件夹中。最小配置如下所示:
  • 
    ^试验_
    
    其中
    控制测试项目文件名的过滤器。在这个特定的示例中,测试只会在名称以“Test\”开头的项目中发现

  • 在测试->配置运行设置->选择解决方案范围的运行设置文件中选择此.runsettings文件。您可以有多个配置不同的.runsettings文件,在这里您可以随时切换它们
  • 重建解决方案以发现测试
  • 现在,您应该可以在测试资源管理器中看到您的测试


    一些有用的链接:


    Re:
    尽管我设置了头文件的正确相对路径
    -这解决了
    未定义的…
    类错误;您有
    链接
    问题。查看Catch2上的文档-您是否也应该将您的cpp文件编译到该测试项目中?我目前正在寻找一个解释,说明为什么所有这些都是必要的,而不仅仅是如何使其工作。我的问题可以在这里找到:
    #define CATCH_CONFIG_MAIN
    #include "path_to_catch2/catch.hpp"
    
    
        <?xml version="1.0" encoding="utf-8"?>
        <RunSettings>
            <Catch2Adapter>
                <FilenameFilter>^Test_</FilenameFilter>
            </Catch2Adapter>
        </RunSettings>