将枚举 类 与提升测试一起使用
Use enum classes with Boost Test
我有一个枚举 class 我想在我的单元测试中使用:
enum class MyEnumClass
{
MyEntryA,
MyEntryB
};
我想按如下方式使用:
MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_CHECK_EQUAL(myEnumValue, MyEnumClass::MyEntryB);
但我得到这个错误,显然是因为升压测试试图输出值:
include/boost/test/test_tools.hpp:326:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
ostr << t; // by default print the value
^
加丑static_cast
"solves"问题:
BOOST_CHECK_EQUAL(static_cast<int>(myEnumValue), static_cast<int>(MyEnumClass::MyEntryB));
但我想避免对每个枚举都这样做 class。我还想避免为每个枚举 class.
定义 <<
流运算符
是否有更简单的方法来使用枚举 classes 进行增强测试?
或者其他单元测试框架是否有更好的方法来处理枚举classes?
问题是 Boost.Test 必须打印值以防它们不相等,它在流上使用 operator<<
来做到这一点。
在这种情况下,没有比简单地在 std::ostream
上定义 operator<<
或在 int
上定义 static_cast
更简洁的方法了,我可以看到。
另一方面,像 Catch 这样的库没有这个要求,他们可能使用一些宏魔术来完成它。
您可以使用 BOOST_TEST_DONT_PRINT_LOG_VALUE()
禁用相关类型的打印。来自 Boost docs:
typedef std::pair<int,float> pair_type;
BOOST_TEST_DONT_PRINT_LOG_VALUE( pair_type )
在这种情况下,如果出现不匹配,测试错误消息会告诉您,但不会打印出实际的不同值。
另一个解决方案是使用 BOOST_CHECK(myEnumValue == MyEnumClass::MyEntryB)
,而不是 BOOST_CHECK_EQUAL。这对我有用,我假设对于一个简单的 true/false 检查,boost 不需要打印出枚举 class。
解决方案:
enum class MyEnumClass {
MyEntryA,
MyEntryB
};
MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryA)); // Note extra pair of brackets
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryB)); // Note extra pair of brackets
结果:
info: check (myEnumValue == MyEnumClass::MyEntryA) has passed
error: in "Suite/Test": check (myEnumValue == MyEnumClass::MyEntryB) has failed
详情:
使用BOOST_TEST()作为测试通用宏(Assertion Boost Test Universal Macro):
- BOOST_TEST // 或 BOOST_TEST_CHECK
- BOOST_TEST_REQUIRE
- BOOST_TEST_WARN
似乎应该将作用域枚举(枚举 类)添加到需要一对额外括号的 Limitations and workaround。
这是我的解决方案(非常简单)
将此添加到测试文件的顶部
#define CHECK_ENUM_CLASS_EQUAL(L, R) BOOST_CHECK_EQUAL(static_cast<int>(L), static_cast<int>(R))
示例:
CHECK_ENUM_CLASS_EQUAL(a, MyEnumClass::MyEntryA);
我有一个枚举 class 我想在我的单元测试中使用:
enum class MyEnumClass
{
MyEntryA,
MyEntryB
};
我想按如下方式使用:
MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_CHECK_EQUAL(myEnumValue, MyEnumClass::MyEntryB);
但我得到这个错误,显然是因为升压测试试图输出值:
include/boost/test/test_tools.hpp:326:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
ostr << t; // by default print the value
^
加丑static_cast
"solves"问题:
BOOST_CHECK_EQUAL(static_cast<int>(myEnumValue), static_cast<int>(MyEnumClass::MyEntryB));
但我想避免对每个枚举都这样做 class。我还想避免为每个枚举 class.
定义<<
流运算符
是否有更简单的方法来使用枚举 classes 进行增强测试?
或者其他单元测试框架是否有更好的方法来处理枚举classes?
问题是 Boost.Test 必须打印值以防它们不相等,它在流上使用 operator<<
来做到这一点。
在这种情况下,没有比简单地在 std::ostream
上定义 operator<<
或在 int
上定义 static_cast
更简洁的方法了,我可以看到。
另一方面,像 Catch 这样的库没有这个要求,他们可能使用一些宏魔术来完成它。
您可以使用 BOOST_TEST_DONT_PRINT_LOG_VALUE()
禁用相关类型的打印。来自 Boost docs:
typedef std::pair<int,float> pair_type;
BOOST_TEST_DONT_PRINT_LOG_VALUE( pair_type )
在这种情况下,如果出现不匹配,测试错误消息会告诉您,但不会打印出实际的不同值。
另一个解决方案是使用 BOOST_CHECK(myEnumValue == MyEnumClass::MyEntryB)
,而不是 BOOST_CHECK_EQUAL。这对我有用,我假设对于一个简单的 true/false 检查,boost 不需要打印出枚举 class。
解决方案:
enum class MyEnumClass {
MyEntryA,
MyEntryB
};
MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryA)); // Note extra pair of brackets
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryB)); // Note extra pair of brackets
结果:
info: check (myEnumValue == MyEnumClass::MyEntryA) has passed
error: in "Suite/Test": check (myEnumValue == MyEnumClass::MyEntryB) has failed
详情:
使用BOOST_TEST()作为测试通用宏(Assertion Boost Test Universal Macro):
- BOOST_TEST // 或 BOOST_TEST_CHECK
- BOOST_TEST_REQUIRE
- BOOST_TEST_WARN
似乎应该将作用域枚举(枚举 类)添加到需要一对额外括号的 Limitations and workaround。
这是我的解决方案(非常简单)
将此添加到测试文件的顶部
#define CHECK_ENUM_CLASS_EQUAL(L, R) BOOST_CHECK_EQUAL(static_cast<int>(L), static_cast<int>(R))
示例:
CHECK_ENUM_CLASS_EQUAL(a, MyEnumClass::MyEntryA);