带有 CLion 的 Boost.TEST:“测试框架意外退出”

Posted

技术标签:

【中文标题】带有 CLion 的 Boost.TEST:“测试框架意外退出”【英文标题】:Boost.TEST with CLion: "Test framework quit unexpectedly" 【发布时间】:2018-10-22 07:02:33 【问题描述】:

我在 mac os mohave 上使用 CLion。我尝试将 Boost.TEST 添加到我的 c++ 项目中,但 IDE 抛出“测试框架意外退出”。

这是我的 CMakeLists:

cmake_minimum_required(VERSION 3.12)
project(sequences)

find_package(Boost COMPONENTS unit_test_framework REQUIRED)
include_directories($Boost_INCLUDE_DIRS)

set(CMAKE_CXX_STANDARD 11)

add_executable(sequences main.cpp)

target_link_libraries(sequences $Boost_UNIT_TEST_FRAMEWORK_LIBRARY)

enable_testing()

还有一个简单的测试:

#include <iostream>
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(test) 
    BOOST_CHECK_EQUAL(1, 1);


using namespace std;

int main() 
    std::cout << "Hello, World!" << std::endl;
    return 0;

jetbrains 网站上关于使用 Boost.TEST 的说明是虚假的,我在网上找到的所有针对此问题的修复都已过时。

我使用 Boost v.1.67.0 与 homebrew 一起安装。

控制台输出:

测试于 09:48 开始 ... .../sequences --run_test=test --logger=HRF,all --color_output=false --report_format=HRF --show_progress=no 你好世界! 进程以退出代码 0 结束

感谢所有帮助和建议!

感谢您的帮助。我最终为测试创建了一个模板项目。然后我使用实际代码将此项目复制到我的项目中并添加 add_subdirectory(name_of_the_directory_with_boost_test_project) 到 CMakeFile 中。

之后,您将在 CLion 中获得“运行所有测试”功能。

【问题讨论】:

我不明白你在做什么或试图用你的代码实现什么。 Boost_UNIT_TEST_FRAMEWORK 是一个单元测试框架。它不能在你的 main.cpp 中工作 @ThomasSablik 实际上可以。然而,用户提供的入口点应该正确初始化测试框架。见docs。 @VTT:是的,当然测试也需要一个入口点,但它与应用程序的入口点不同。您需要一个用于应用程序的main 函数和至少一个用于测试的main 函数。 @ThomasSablik 不,单元测试在任何方面都不是特别的。应用程序应该只有一个 main 函数初始化和运行测试,手动编写或由 boost 提供。 @VTT:你能提供一个例子作为答案吗?我无法想象这是如何工作的。 【参考方案1】:

您的程序代码和测试代码应该分开。如doc 中所述,该行

#define BOOST_TEST_MODULE My Test

创建主入口点。

我不知道是否可以在main.cpp中编写测试用例。在单元测试中,您检查组件的接口。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(sequences)

find_package(Boost COMPONENTS unit_test_framework REQUIRED)
include_directories($Boost_INCLUDE_DIRS)

set(CMAKE_CXX_STANDARD 11)

add_executable(main src/main.cpp)
add_executable(test1 src/test1.cpp)

target_link_libraries(test_suite1 $Boost_UNIT_TEST_FRAMEWORK_LIBRARY)

enable_testing()
add_test(NAME test_suite1 COMMAND test_suite1)

main.cpp

#include "MyMath.h"

int main() 
    MyMath mm;
    mm.add(1,2);

    return 0;

MyMath.h:

#ifndef MY_MATH_H
#define MY_MATH_H

class MyMath 
public:
    int add(int l, int r)  return l + r; 
;

#endif

test1.cpp:

#define BOOST_TEST_MODULE My Test
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

#include "MyMath.h"
BOOST_AUTO_TEST_CASE(test) 
    MyMath mm;
    BOOST_CHECK_EQUAL(mm.add(1,2), 3);

现在我可以使用 cmake 构建它并使用 ctest 进行测试。

【讨论】:

好的。基本上没有主要功能可以完成这项工作。那么如何将 boost.test 合并到我已经拥有库和入口点的现有项目中呢?再说一遍:我正在使用 CLion。我了解到它有一个集成的 Boost.Test 测试运行器。 BOOST_TEST_MODULE 为您的测试创建主入口点。为每个类创建一个测试文件是一种约定。 @magom001 单元测试项目应该是一个单独的项目。通常它是一个链接(或内联)boost.test 库的常规可执行项目。 @VTT 我无法弄清楚如何在 CLion 中执行此操作。我认为他们的文档中缺少一些东西:jetbrains.com/help/clion/boost-test-support.html @magom001 看来clion对单元测试应用没有任何特殊要求。因此,创建单元测试可执行文件应该类似于在 cmake 中创建任何其他可执行文件。

以上是关于带有 CLion 的 Boost.TEST:“测试框架意外退出”的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Test 的数据测试用例真的需要 C++11 吗?

C++ 单元测试框架 Boost Test BOOST_AUTO_TEST_CASE

如何使用 boost C++ 开始单元测试

如何在 mingw64 上使用 boost.test 构建测试?

实现一个BOOST_TEST test_runner,用于从不同的共享库中运行多个测试。

Boost test vs2013 fatal error C1001