将Doctest与代码一起使用时,将实现放在何处

时间:2019-03-18 08:01:32

标签: c++ cmake doctest

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

我想将测试代码放在实现的旁边,因为该库说的是可能的,但是我似乎无法弄清楚该如何处理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可执行文件。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

图书馆的作者对此issue给予了很好的答复:

  

DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN实现了测试运行程序,并且还定义了main()函数。

     

DOCTEST_CONFIG_IMPLEMENT仅实现测试运行器。

     

如果定义自己的main(),则应使用DOCTEST_CONFIG_IMPLEMENT-请查看the relevant docs

     

由于将测试与生产代码一起编写,因此您需要在主可执行文件(即doctest.cpp)中实现测试运行程序。

     

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

     

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

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