我正在使用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文档中找不到与此有关的任何信息。
您打算如何解决这个问题?
答案 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()
函数的第一个选择。