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

Where to put implementation when using Doctest alongside code

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

我想将测试代码与我的实现放在一起,正如库所说的那样,但我似乎无法弄清楚如何处理 doctest 实现代码。

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

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"

一个看起来像这样的 main.cpp:

#include "thing.h"

int main(int argc, const char *argv[]) {
    do_thing();
}

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

do_thing() {}

TEST_CASE("Test thing") {
    CHECK(1 == 1);
}

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

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

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

我在 doctest 文档中找不到任何关于此的信息。

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

我遇到了同样的问题,一种解决方法是在编译 Main 时将 -DDOCTEST_CONFIG_DISABLE 添加到编译器标志。

图书馆的作者在这个issue中给出了很好的回应:

DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN implements the test runner and also defines a main() function.

DOCTEST_CONFIG_IMPLEMENT implements ONLY the test runner.

If you define your own main() then you should use DOCTEST_CONFIG_IMPLEMENT - have a look at the relevant docs.

You will need the test runner implemented in your main executable (that means doctest.cpp) since you are writing your tests alongside your production code.

You can also define DOCTEST_CONFIG_DISABLE when building the main executable so tests are written in the production code but aren't compiled (you will still need doctest.cpp so it all links). This way you won't need to #ifdef the tests.

You could also entirely remove the test executable and use the main executable for running the tests - docs.

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