在 Visual Studio 中使用 Catch2 进行单元测试的最佳实践

7
我刚开始学习C++单元测试,想要得到一些关于此方面的建议。 我使用Visual Studio 2019进行开发,并选择了Catch2作为我的测试库,同时也安装了Catch2的测试适配器。
我在GitHub上阅读了Catch2和Test Adapter for 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进行单元测试。

1
回复:“尽管我已经正确设置了头文件的相对路径”,这解决了“未定义…”类型的错误;你有“LINK”问题。请查看Catch2文档 - 是否应该将你的cpp文件编译到测试项目中? - Vlad Feinstein
1个回答

9

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

  1. 在被测项目(PuT)的解决方案中创建一个新项目。这将成为我们的测试项目。
  2. 从测试项目中添加对PuT的引用
  3. 在测试项目中创建一个源文件,并将以下行放入其中
#define CATCH_CONFIG_MAIN
#include "path_to_catch2/catch.hpp"
  1. 编写一些测试。你可以有许多带有测试的源文件,但请记住只有其中一个必须具有#define CATCH_CONFIG_MAIN声明。
  2. 在测试项目配置属性中,设置以下设置
  • 连接器->常规->附加库目录 - 在这里添加 PuT 的对象文件目录的路径。
  • 连接器->输入->附加依赖项 - 在这里放置 PuT 的对象文件名称(不是路径,只是 .OBJ 文件的名称!),用分号分隔,在测试中使用。例如,如果要测试在 MyCode.h 中声明的某些代码,请在此处放置 MyCode.obj 文件名。当您引用来自 PuT 的更多头文件时,请不要忘记更新此设置。
  1. 打开测试资源管理器
  2. 向解决方案根目录添加一个 .runsettings 文件。最小配置看起来像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <RunSettings>
        <Catch2Adapter>
            <FilenameFilter>^Test_</FilenameFilter>
        </Catch2Adapter>
    </RunSettings>

<FilenameFilter> 控制测试项目文件名的过滤器。在这个特定的例子中,只有以 "Test_" 开头命名的项目中才能发现测试。

  1. Test -> 配置运行设置 -> 选择解决方案级别的运行设置文件 中选择此 .runsettings 文件。您可以拥有多个不同配置的 .runsettings 文件,并在任何时候进行切换。
  2. 重新构建解决方案,以便发现测试。

现在您应该在测试资源管理器中看到您的测试。


一些有用的链接:

https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-microsoft-test-framework-for-cpp?view=vs-2019

https://github.com/JohnnyHendriks/TestAdapter_Catch2/blob/master/Docs/Walkthrough.md


1
我目前正在寻找一个解释,为什么所有这些都是必要的,而不仅仅是如何让它工作。我的问题可以在这里找到:https://dev59.com/xb3pa4cB1Zd3GeqPl9AI - mana
你好,我尝试了你描述的所有方法,但我的测试资源管理器仍然没有显示任何内容。 我下载了 https://github.com/JohnnyHendriks/TestAdapter_Catch2/tree/main/ReferenceTests 并执行了测试,测试浏览器确实显示了正确的结果。 但是我的项目却无法显示任何内容。 可能的原因是什么? - Kargath
嗨,我可以确认一下你是如何"在测试项目中添加对 PuT 的引用"吗? - snigcode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接