在 Visual Studio 中使用 Catch2 进行单元测试的最佳实践
Best practices for Unit testing with Catch2 in Visual Studio
我是 C++ 单元测试的新手,想就此获得一些建议。
我使用 Visual Studio 2019 进行开发,我选择 Catch2 作为我的测试库,我还安装了 Catch2 的测试适配器。
我在 GitHub 上阅读了 Catch2 和 Catch2 的测试适配器的文档,但我仍然无法找到在 Visual Studio 中使用单元测试的正确方法。
假设我已经有一个包含 类 的项目,我想测试这些 类。
我应该将带有测试代码的文件放在同一个项目中,还是应该在解决方案中创建新的测试项目?
当我尝试第一种方法时,测试资源管理器不会发现测试,除非我注释掉项目的 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) 的解决方案创建一个新项目。这将是我们的测试项目。
- 从测试项目添加对 PuT 的引用。
- 在测试项目中,创建一个源文件并将以下行放入其中:
#define CATCH_CONFIG_MAIN
#include "path_to_catch2/catch.hpp"
- 写一些测试。您可以根据需要拥有任意多个带有测试的源文件,但请记住,其中只有一个必须具有
#define CATCH_CONFIG_MAIN
声明。
- 在测试项目配置属性中,设置以下设置:
- Linker -> General -> Additional Library Directories - 在此处添加 PuT 的目标文件目录的路径。
- Linker -> Input -> Additional Dependencies - 在这里,放置 PuT 的目标文件名称(不是路径,只是 .OBJ 文件的名称!),用分号分隔,用于测试。例如,如果你想测试在 MyCode.h 中声明的一些代码,请在此处输入 MyCode.obj 文件名。当您从 PuT 引用更多头文件时,请不要忘记更新此设置。
- 打开测试资源管理器。
- 将 .runsettings 文件添加到解决方案根文件夹。最小配置如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<Catch2Adapter>
<FilenameFilter>^Test_</FilenameFilter>
</Catch2Adapter>
</RunSettings>
其中 <FilenameFilter>
控制测试项目文件名的过滤器。在此特定示例中,仅在名称以 "Test_".
开头的项目中发现测试
- Select 测试中的此 .runsettings 文件 -> 配置 运行 设置 -> Select 解决方案范围内的 runsettings 文件。您可以有多个具有不同配置的 .runsettings 文件,在这里您可以随时切换它们。
- 重建解决方案 以发现测试。
现在您应该会在测试资源管理器中看到您的测试。
一些有用的链接:
https://github.com/JohnnyHendriks/TestAdapter_Catch2/blob/master/Docs/Walkthrough.md
我是 C++ 单元测试的新手,想就此获得一些建议。 我使用 Visual Studio 2019 进行开发,我选择 Catch2 作为我的测试库,我还安装了 Catch2 的测试适配器。
我在 GitHub 上阅读了 Catch2 和 Catch2 的测试适配器的文档,但我仍然无法找到在 Visual Studio 中使用单元测试的正确方法。
假设我已经有一个包含 类 的项目,我想测试这些 类。 我应该将带有测试代码的文件放在同一个项目中,还是应该在解决方案中创建新的测试项目?
当我尝试第一种方法时,测试资源管理器不会发现测试,除非我注释掉项目的 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) 的解决方案创建一个新项目。这将是我们的测试项目。
- 从测试项目添加对 PuT 的引用。
- 在测试项目中,创建一个源文件并将以下行放入其中:
#define CATCH_CONFIG_MAIN
#include "path_to_catch2/catch.hpp"
- 写一些测试。您可以根据需要拥有任意多个带有测试的源文件,但请记住,其中只有一个必须具有
#define CATCH_CONFIG_MAIN
声明。 - 在测试项目配置属性中,设置以下设置:
- Linker -> General -> Additional Library Directories - 在此处添加 PuT 的目标文件目录的路径。
- Linker -> Input -> Additional Dependencies - 在这里,放置 PuT 的目标文件名称(不是路径,只是 .OBJ 文件的名称!),用分号分隔,用于测试。例如,如果你想测试在 MyCode.h 中声明的一些代码,请在此处输入 MyCode.obj 文件名。当您从 PuT 引用更多头文件时,请不要忘记更新此设置。
- 打开测试资源管理器。
- 将 .runsettings 文件添加到解决方案根文件夹。最小配置如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<Catch2Adapter>
<FilenameFilter>^Test_</FilenameFilter>
</Catch2Adapter>
</RunSettings>
其中 <FilenameFilter>
控制测试项目文件名的过滤器。在此特定示例中,仅在名称以 "Test_".
- Select 测试中的此 .runsettings 文件 -> 配置 运行 设置 -> Select 解决方案范围内的 runsettings 文件。您可以有多个具有不同配置的 .runsettings 文件,在这里您可以随时切换它们。
- 重建解决方案 以发现测试。
现在您应该会在测试资源管理器中看到您的测试。
一些有用的链接:
https://github.com/JohnnyHendriks/TestAdapter_Catch2/blob/master/Docs/Walkthrough.md