我是 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 的引用 https://learn.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2019#create-references-to-other-projects-in-the-solution.
-
在测试项目中,创建一个源文件并将以下行放入其中:
#define CATCH_CONFIG_MAIN
#include "path_to_catch2/catch.hpp"
-
写一些测试。您可以根据需要拥有任意数量的带有测试的源文件,但请记住,只有其中一个必须具有
#define CATCH_CONFIG_MAIN
宣言。
-
在测试项目配置属性中,设置以下设置:
-
链接器 -> 常规 -> 其他库目录- 在此处添加 PuT 的对象文件目录的路径。
-
链接器 -> 输入 -> 附加依赖项- 在这里,放置 PuT 的目标文件名称(不是路径,只是 .OBJ 文件的名称!),用分号分隔,这些名称在测试中使用。例如,如果您想测试中声明的某些代码MyCode.h, put 我的代码.obj此处的文件名。当您从 PuT 引用更多头文件时,请不要忘记更新此设置。
-
打开测试资源管理器.
-
将 .runsettings 文件添加到解决方案根文件夹。最小配置如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<Catch2Adapter>
<FilenameFilter>^Test_</FilenameFilter>
</Catch2Adapter>
</RunSettings>
where <FilenameFilter>
控制测试项目文件名的过滤器。在此特定示例中,仅在名称以“Test_”开头的项目中才会发现测试。
-
选择此 .runsettings 文件测试 -> 配置运行设置 -> 选择解决方案范围运行设置文件。您可以拥有多个具有不同配置的 .runsettings 文件,在这里您可以随时切换它们。
-
重建解决方案发现测试。
现在您应该在测试资源管理器中看到您的测试。
一些有用的链接:
https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-microsoft-test-framework-for-cpp?view=vs-2019 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 https://github.com/JohnnyHendriks/TestAdapter_Catch2/blob/master/Docs/Walkthrough.md
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)