C++ 测试设置错误:测试树为空

C++ 测试设置错误:测试树为空,c++,boost,boost-test,C++,Boost,Boost Test,注意,在把问题简化为一个最小的例子之后,我已经完全修改了这个问题。和往常一样,我在第一版中提到了一些原因,这些原因会浮现在我的脑海中,并因此得到更好的教育 在我开始之前,线程在这里没有帮助;在这种情况下,Boost.Test文档非常清楚 然而,在重构testsuite中的代码后,我遇到了一个奇怪的错误: $ bin/utf_dataset_loader_issue Test setup error: test tree is empty 但是: 请注意,没有尾星,其他工作测试也

注意,在把问题简化为一个最小的例子之后,我已经完全修改了这个问题。和往常一样,我在第一版中提到了一些原因,这些原因会浮现在我的脑海中,并因此得到更好的教育

在我开始之前,线程在这里没有帮助;在这种情况下,Boost.Test文档非常清楚

然而,在重构testsuite中的代码后,我遇到了一个奇怪的错误:

    $ bin/utf_dataset_loader_issue
    Test setup error: test tree is empty
但是:

请注意,没有尾星,其他工作测试也有一个

甚至:

未显示正确的信息,但其他测试给出:

    $ bin/testrunner --build_info=true
    Running 20 test cases...
    Platform: linux
    Compiler: GNU C++ version 10.2.1 20201125 (Red Hat 10.2.1-9)
    STL     : GNU libstdc++ version 20201125
    Boost   : 1.73.0

    *** No errors detected
    
无论如何,我已经把这个问题简化为下面的一个小项目——它可能是 和继承有关,但我还是不明白为什么

这里我尝试编写一个数据集读取器。这应该可以通过CLI参数进行参数化(此处未显示)。如果没有给出任何参数,我希望使用编译时内置默认值(此处未显示),这些默认值由CMake generate_file()生成并单独编译(此处也未显示)。在其基本功能中,该基类可以从文件系统读取数据(省略)

因为我有不同的用例,所以具体的数据集继承自这个基类。也就是说,默认值和 其他一些小细节只会改变。对我来说,这是一个明显的问题 通过继承实现专门化。但是现在我陷入了这样一个问题:Boost UTF没有注册任何测试

建议使用全局fixture来收集CLI参数。这不适用于在运行时解析数据参数的延迟数据集。在构造期间,没有CLI参数可用

dataset_loader.hpp:

未获得预期结果-活动测试。另外(由于减少而丢失)添加
BOOST\u检查(true)不会改变它

如果相关的话,我正在Linux/Fedora上使用Clang-11和GNU C++-10

附录2:

为了方便起见,我在上添加了项目-即使没有继承,结果也一样!另外(此处未显示)我
向后推
将单个“pair”条目插入成员
输入
/
预期
以排除dataset::size()为零的情况,但未成功

所以,这一定是一个微妙的错误,我找不到,甚至找不到。测试无法检测

    $ bin/utf_dataset_loader_issue --build_info=true
    Test setup error: test tree is empty
    $ bin/testrunner --build_info=true
    Running 20 test cases...
    Platform: linux
    Compiler: GNU C++ version 10.2.1 20201125 (Red Hat 10.2.1-9)
    STL     : GNU libstdc++ version 20201125
    Boost   : 1.73.0

    *** No errors detected
    
    #pragma once

    #include <boost/test/data/size.hpp>

    #include <string>
    #include <tuple>
    #include <vector>

    namespace utf_data = boost::unit_test::data;

    class dataset_loader {
    public:
      explicit dataset_loader(std::string_view testcase_group) {}
      virtual ~dataset_loader() = default;

    public:
      enum { arity = 2 };

      struct iterator {
        using iterator_type = std::vector<std::string>::const_iterator;
        iterator(iterator_type input_iter_, iterator_type expected_iter_)
            : input_iter{input_iter_}, expected_iter{expected_iter_} {}

        std::tuple<std::string, std::string> operator*() const {
          return {*input_iter, *expected_iter};
        }

        void operator++() {
          ++input_iter;
          ++expected_iter;
        }

      private:
        iterator_type input_iter;
        iterator_type expected_iter;
      };

      utf_data::size_t size() const { return dataset.input.size(); }

      iterator begin() const {
        // in real, read data from filesystem into datasets depend on
        // testcase_group and argc/argv
        return iterator(dataset.input.begin(), dataset.expected.begin());
      }

    private:
      struct test_dataset {
        std::vector<std::string> input;
        std::vector<std::string> expected;
      };
      test_dataset mutable dataset;
    };
    #pragma once

    #include <dataset_loader.hpp>

    #include <boost/test/data/monomorphic.hpp>

    #include <string_view>

    class dataset : public dataset_loader {
    public:
      explicit dataset(std::string_view testcase_group)
          : dataset_loader(testcase_group) {}
      ~dataset() = default;
    };

    namespace boost::unit_test::data::monomorphic {
    template <> struct is_dataset<dataset> : boost::mpl::true_ {};
    } // namespace boost::unit_test::data::monomorphic
    #define BOOST_TEST_MODULE Dataset Loader Test Suite
    #include <boost/test/unit_test.hpp>
    #include <dataset.hpp>

    #include <boost/test/data/test_case.hpp>
    #include <boost/test/unit_test.hpp>

    #include <iostream>

    BOOST_AUTO_TEST_SUITE(utf_dataset_loader_issue)

    BOOST_DATA_TEST_CASE( // --
        abstract_literal, // --
        utf_data::make_delayed<dataset>("abstract_literal"),
        input, expected)
    {}

    BOOST_AUTO_TEST_SUITE_END()
    project(utf_dataset_loader_issue)

    find_package(Boost 1.73.0
        REQUIRED COMPONENTS
            unit_test_framework
    )

    add_executable(${PROJECT_NAME})

    target_link_libraries(${PROJECT_NAME} PRIVATE
        Boost::unit_test_framework
    )

    target_sources(${PROJECT_NAME} PRIVATE
        src/test_main.cpp
        src/literal_test.cpp
    )

    set_source_files_properties(src/test_main.cpp APPEND PROPERTIES
        COMPILE_DEFINITIONS "$<$<NOT:$<PLATFORM_ID:Windows>>:BOOST_TEST_DYN_LINK>"
    )

    target_include_directories(${PROJECT_NAME} PRIVATE
        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    )
...
namespace utf = boost::unit_test;

BOOST_AUTO_TEST_SUITE(utf_dataset_loader_issue, * utf::enabled())
....