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