gpt4 book ai didi

c++ - 使用 Catch C++ 进行单元测试会干扰我的 main()

转载 作者:可可西里 更新时间:2023-11-01 18:29:06 28 4
gpt4 key购买 nike

我是单元测试的新手,决定使用 C++ 的 Catch 框架,因为它似乎很容易与其一个头文件集成。但是,我有一个多文件二叉搜索树程序(文件是:main.cpp、Tree.h、Tree.hxx、TreeUnitTests.cpp、catch.hpp)。如果我在 main.cpp 中注释掉我的 int main() 函数,我只能让我的单元测试运行。我知道它与我的 TreeUnitTests.cpp 中的“#define CATCH_CONFIG_MAIN”声明冲突,但如果我不包含该声明,我将无法运行单元测试。每次我想运行单元测试时,如何才能让两者都运行而不必评论我的 main()?

这是我使用的头文件: https://raw.githubusercontent.com/philsquared/Catch/master/single_include/catch.hpp

我在 Catch 教程中找到它并将其用作指南: https://github.com/philsquared/Catch/blob/master/docs/tutorial.md

一些相关文件供引用:ma​​in.cpp:

//******************* ASSN 01 QUESTION 02 **********************

#include "Tree.h"
#include <iostream>

using namespace std;

/*
int main()
{

//creating tree with "5" as root
Tree<int> tree(5);
tree.insert(2);
tree.insert(88);
tree.inorder();
cout << "does tree contain 2?: ";
cout << tree.find(2) << endl;
cout << "does tree contain 3?: ";
cout << tree.find(3) << endl;

Tree<int> copytree(tree);
cout << "copied original tree..." << endl;
copytree.preorder();
cout << "after deletion of 2:\n";
copytree.Delete(2);
copytree.postorder();


return 0;
}
*/

TreeUnitTests.cpp:

#include <iostream>
#include "Tree.h"
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Pass Tests")
{
REQUIRE(1 == 1);
}

TEST_CASE("Fail test")
{
REQUIRE(1 == 0);
}

(我的测试不是真正的测试,只是为了验证 Catch 框架是否正常工作。我想你可以说这是元测试)

最佳答案

由于您使用的是 Visual Studio,正确的方法是使用 Configuration Manager (通过右键单击解决方案资源管理器工具窗口中的解决方案访问)并创建单独的解决方案配置。

在“新解决方案配置”表单中,为配置指定一个有意义的名称(例如 UnitTesting )。还有一个名为“复制自:”的下拉列表,您可以在其中选择设置将从哪个配置复制到新配置。不要把它留在 <Empty> ,而是选择到目前为止您用于构建源的一些源配置(因为它将正确设置包含文件夹和其他设置)。确保您还通过选中“创建新项目配置”复选框为解决方案中的所有项目创建匹配的项目配置。

创建配置后,您可以使用工具栏下拉列表选择它,就像在调试和发布配置之间切换一样:

Click to select your new config单击以选择您的新 UnitTesting配置

现在,当您打开某个项目或该项目中文件的属性页时(右键单击文件或项目,选择 Properties ),您可以选择特定配置(在您的情况下为 UnitTesting),并指定某些选项,这些选项仅对这个单一配置有效。

您还可以选择 All Configurations在属性页中将设置应用于所有配置。这在添加额外的包含目录和公共(public)预处理器设置时很重要。如果不小心将一些包含目录仅添加到 Debug 配置中,编译器将无法在切换到 UnitTesting 后找到头文件。 .

因此,要使此配置的行为有所不同,您可以执行以下操作:

1。排除main.cpp来自 UnitTesting构建配置

例如,您可以右键单击 main.cpp , 打开 Properties ,并仅在此配置中从构建中排除文件:

Excluding a file from build从特定配置的构建中排除文件

2。使用预处理器宏有条件地排除 main()功能

或者,您可以打开项目属性并设置一个特定的预处理器宏,该宏将仅在此配置中定义:

enter image description here创建 UNIT_TESTING UnitTesting 的宏配置,再次使用 MS Paint 为图形添加风格

因此,对于后一种方法,您的实际 main.cpp将更改为:

// remove if UnitTesting configuration is active
#ifndef UNIT_TESTING
int main(void)
{
...
}
#endif

第一种方法很巧妙,因为它根本不需要您更改生产代码,但对于其他在 Visual Studio 中查看您的代码的毫无戒心的人来说,当他们开始怀疑为什么某些代码时,后一种方法可能更明显根本没有被编译。我有时会忘记构建配置中缺少某个文件,然后盯着奇怪的编译错误看了一会儿。

并且,使用第二种方法,您还可以在同一位置轻松提供自定义 Catch 入口点:

#ifdef UNIT_TESTING

// this is the main() used for unit testing

# define CATCH_CONFIG_RUNNER
# include <catch.hpp>

int main(void)
{
// custom unit testing code
}

#else

int main(void)
{
// actual application entry point
}

#endif

关于c++ - 使用 Catch C++ 进行单元测试会干扰我的 main(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989932/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com