c++ - 如何避免 C++ 未定义行为欺骗 GoogleTest
问题描述
我正在为我的容器类编写测试,其中许多测试检查查询方法,这些方法返回true
或false
. 例子:
myContainer.add(obj);
EXPECT_TRUE(myContainer.contains(obj));
问题是即使没有实现,许多测试也通过了MyContainer
。
我认为我已经找到了造成这种情况的原因,并在下面进行了演示(问题是RealityTest.Sneaky
通过了):
TEST(RealityTest, True) {
bool b = true;
EXPECT_TRUE(b);
EXPECT_FALSE(b);
}
TEST(RealityTest, False) {
bool b = false;
EXPECT_TRUE(b);
EXPECT_FALSE(b);
}
TEST(RealityTest, RandomBool) {
bool b = random_bool();
EXPECT_TRUE(b);
EXPECT_FALSE(b);
}
TEST(RealityTest, Sneaky) {
bool b = sneaky();
EXPECT_TRUE(b);
EXPECT_FALSE(b);
}
TEST(RealityTest, NoBool) {
bool b = no_bool();
EXPECT_TRUE(b);
EXPECT_FALSE(b);
}
测试中使用的函数定义如下:
bool random_bool() {
static std::random_device dev;
static std::uniform_int_distribution dist(0, 1);
return dist(dev);
};
bool sneaky() { cout << "brought to you by GCC (C++17)" << endl; }
bool no_bool() {}
我应该如何编写测试以使这种“偷偷摸摸”的机制无法欺骗他们,因为到目前为止,如果我只实现类似MyContainer::add
,MyContainer::get
然后MyContainer::remove
我的所有测试都会通过,尽管所有这些查询方法都不起作用.
注意:我在没有任何编译器优化的情况下构建所有内容(测试和MyContainer
)(Qt Creator 中的调试模式)。
注意 2:我使用 Qt Creator,但没有使用任何 Qt 模块/库。只是简单的 C++17googletest
和pthread
(我在 Linux 上)。
解决方案
您的编译器应该警告您,您的函数中有不返回值的路径。如果没有,请提高您的警告级别(例如-Wall
和/或-Wextra
)并确保这些警告没有被抑制。
如果您(或您的同事)倾向于忽略这些警告,请使用-Werror
将它们(好吧,所有警告)转换为编译错误 - 这样,如果有一些东西会触发这些警告,您的项目将不会编译,例如有路径不返回值。
也就是说,GoogleTest无法帮助您找到这些错误 - 它仅适用于编译的对象,因此它无法告诉您的bool sneaky()
函数没有正确的返回值......请记住:未定义的行为可能导致时间旅行。 . 或允许b 同时为 TRUE 和 FALSE
推荐阅读
- c# - 使用 Oid/ASNEncodeData 创建 PublicKey 会引发 CryptographyException
- javascript - 如何通过使用反应或javascript动态计算顶部和左侧位置来相对于两个元素放置一个元素?
- python - 如何使用 .maketrans() 和 .unicodedata() 从 Python 3.x 中删除标点符号和特殊字符?
- javascript - 数据结构和算法
- vb.net - vb.net 表单处理来自另一个表单的事件
- arrays - 查找仅包含二进制数组的最大非连续子集
- multilabel-classification - 使用 multilabel_binarizer 后如何从列号获取类名?
- python-2.7 - openstackclient:引发异常:无法导入名称 redirect_stdout
- python - 如何绘制串行数据
- c++ - OpenSSL:使用 ECC 公钥加密对称密钥