C ++ Google test (gtest):如何创建自定义断言和期望?
c++ Google test (gtest): how to create custom asserts and expects?
我正在使用gtest为我的c ++程序创建单元测试。在我的测试中,我必须编写很多这样的检查:
ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);
我必须编写两个检查,因为如果我省略ASSERT_TRUE
并且myObject
恰好无效,那么myObject.GetSomeAttributre()
呼叫就会崩溃。即使在测试中也不好。
我想要的是写这样的东西:
EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);
这行代码应该与原来的两行大致相同(可选奖励,如果myObject
无效,这将被报告,GetSomeAttribute()
不会被调用,但测试将继续运行(。
如何编写这样的自定义断言/期望?
从高级指南中,我们可以看到有几种方法可以做到这一点。
最简单的方法是在子例程中使用断言:
template<typename T>
void AssertAttributeEquals(MyObject const& obj, T value) {
ASSERT_TRUE(obj.IsValid());
// googletest has the assumption that you put the
// expected value first
EXPECT_EQ(value, obj.GetAttribute());
}
你可以这样称呼它:
AssertAttributeEquals(myObject, expectedValue);
尽管您可能希望使用SCOPED_TRACE
在失败时获得更好的消息:
{
SCOPED_TRACE("whatever message you want");
AssertAttributeEquals(myObject, expectedValue);
}
或者,您可以使用返回AssertionResult
的函数:
template<typename T>
::testing::AssertionResult AttributeEquals(MyObject const& obj, T value) {
if (!obj.IsValid()) {
// If MyObject is streamable, then we probably want to include it
// in the error message.
return ::testing::AssertionFailure() << obj << " is not valid";
}
auto attr = obj.GetAttribute();
if (attr == value) {
return ::testing::AssertionSuccess();
} else {
return ::testing::AssertionFailure() << attr << " not equal to " << value;
}
}
这可以像这样使用:
EXPECT_TRUE(AttributeEquals(myObject, expectedValue));
第二种技术的好处是即使您不使用SCOPED_TRACE
也能生成漂亮的错误消息
我可以消除使用宏复制所有对SCOPED_TRACE("...")
调用的需要。现在,您可以在 void 函数中使用正常的 GTEST 断言,并在测试中使用该宏:
test_common.h:
inline void AssertTokenTypesEqual__(const std::string& code, std::vector<TokenType> expectedTokens)
{
auto tokens = Tokenize(code);
ASSERT_EQ(tokens.size(), expectedTokens.size());
for (int i = 0; i < tokens.size(); ++i) {
ASSERT_EQ(expectedTokens[i], tokens[i].type);
}
}
#define ASSERT_TOKEN_TYPES_EQUAL(code__, expectedTokens__)
SCOPED_TRACE("Tokenization didn't match expectations");
AssertTokenTypesEqual__(code__, expectedTokens__)
我的测试.cpp:
TEST(TokenizerTest, Works) {
auto code = "void func();";
auto expectedTokens = {...}; // <- you might need to create variables of your values outside the assertion.
ASSERT_TOKEN_TYPES_EQUAL(code, expectedTokens);
}
相关文章:
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 自定义创建QFuture
- 从具有自定义排序的向量创建集合
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 创建包装升压适配器的自定义范围类
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 创建具有验证和语法突出显示的自定义 printf
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 如何创建可重新创建的自定义要求
- 如何为自定义模板对象创建专门的函数模板
- 在自定义构造函数中的堆上创建指针
- 从函数为 std::vector 创建自定义扩展
- Qt5自定义QDialog,不使用qt创建器
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 创建自定义向量类错误
- 我什么时候用cocos2d-x中的参数初始化自定义创建函数中的变量?