将 Doctest 与代码一起使用时将实现放在哪里

Ome*_*ick 7 c++ doctest cmake

我在我的 C++ 项目中使用doctest进行测试。

我想将测试代码与我的实现放在一起,正如库所说是可能的,但我似乎不知道如何处理 doctest 实现代码。

我有一个doctest.cpp如下所示的文件:

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"
Run Code Online (Sandbox Code Playgroud)

Amain.cpp看起来像这样:

#include "thing.h"

int main(int argc, const char *argv[]) {
    do_thing();
}
Run Code Online (Sandbox Code Playgroud)

thing.h是不言自明的,但thing.cpp看起来像这样:

do_thing() {}

TEST_CASE("Test thing") {
    CHECK(1 == 1);
}
Run Code Online (Sandbox Code Playgroud)

CMake 用于创建两个可执行文件,一个Tests可执行文件和一个Main可执行文件。

如果我不包含doctest.cpp在我的项目源中Main,我会收到未定义的引用错误,因为它无法在 doctest.txt 中找到所有测试内容的定义。

但是,如果我确实包含它,我会收到错误,因为一个目标中有多个main()函数。

我在 doctest 文档中找不到任何相关信息。

你打算如何解决这个问题?

Ome*_*ick 6

库的作者在这个问题上给出了很好的回应:

DOCTEST_CONFIG_IMPLMENT_WITH_MAIN 实现测试运行器,并定义 main() 函数。

DOCTEST_CONFIG_IMPLMENT 仅实现测试运行程序。

如果您定义自己的 main() 那么您应该使用 DOCTEST_CONFIG_IMPLMENT - 查看相关文档

您将需要在主可执行文件(即 doctest.cpp)中实现测试运行器,因为您是与生产代码一起编写测试的。

您还可以在构建主可执行文件时定义DOCTEST_CONFIG_DISABLE,以便在生产代码中编写测试但不进行编译(您仍然需要 doctest.cpp,以便它全部链接)。这样您就不需要 #ifdef 测试。

您还可以完全删除测试可执行文件并使用主可执行文件来运行测试文档

我选择了编写自己的函数的第一个选项main()