【问题标题】:Where to put implementation when using Doctest alongside code将 Doctest 与代码一起使用时将实现放在哪里
【发布时间】:2019-03-18 08:01:32
【问题描述】:

我在我的 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 文档中找不到任何相关信息。

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

【问题讨论】:

    标签: c++ cmake doctest


    【解决方案1】:

    库的作者在这个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() 函数的第一个选项。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-21
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多