- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
首先,我是 googletest 框架的新手,请多关照。
我有一个函数
void setID(const int id)
{
ID = id;
}
其中 ID 是全局 unsigned int
。 (是的,全局变量不好,我只是想弄清楚我在做什么。)
我的单元测试是这样的
TEST_F(TempTests, SetId)
{
// Arrange
int id = -99;
// Act
setId(id);
// Assert
EXPECT_EQ(id, ID);
}
问题是我的单元测试总是通过,而我需要它失败,因为 ID 应该是有符号整数而不是无符号整数。如果我没有在视觉上发现错误,单元测试就会通过,并且可能会在以后导致错误。
为确保将来不会发生这种情况,最好在这种情况下单元测试比较失败。
我已经尝试以各种方式将 id
和 ID
静态转换为有符号和无符号整数。我尝试过 EXPECT_TRUE(id == ID)
以各种方式将变量静态转换为有符号和无符号整数。但在所有这些情况下,结果都是通过测试。
那么我怎样才能让 gtest 比较 id
的有符号值和 ID
的无符号值,这样测试就会失败,因为 id
将是 -99 而 ID
将是 4294967197?
最佳答案
编译器需要将类型转换为相等。我推荐阅读 this related answer .
您可以创建自定义 googletest 比较器。即使没有,您至少可以使用类似这样的东西:
#include <iostream>
#include <cstdint>
#include <limits>
#include <type_traits>
#include <typeinfo>
template <class T>
class SignedUnsignedIntCompare final /* final for non-virtual dtor, remember to make dtor virtual if you need to inherit */ {
public:
const T & v;
SignedUnsignedIntCompare(const T & v) : v(v) {}
SignedUnsignedIntCompare(SignedUnsignedIntCompare && move_ctor) = default;
SignedUnsignedIntCompare(const SignedUnsignedIntCompare & copy_ctor) = default;
SignedUnsignedIntCompare & operator=(SignedUnsignedIntCompare && move_assign) = default;
SignedUnsignedIntCompare & operator=(const SignedUnsignedIntCompare & copy_assign) = default;
~SignedUnsignedIntCompare() = default;
template <class TT>
bool operator==(const TT & i) const {
if ( std::numeric_limits<T>::is_signed != std::numeric_limits<TT>::is_signed ) {
return ((v == i) && (T(v) <= std::numeric_limits<TT>::max()) && (TT(i) <= std::numeric_limits<T>::max()));
}
return (v == i);
}
};
typedef SignedUnsignedIntCompare<int> SignedIntCompare;
typedef SignedUnsignedIntCompare<unsigned> UnsignedIntCompare;
int main() {
int i = -99;
unsigned int u = i;
std::cout << (i == u) << " vs " << (SignedIntCompare(i) == u) << std::endl;
return 0;
}
此时,您可以使用 EXPECT_TRUE
或类似的 bool 检查,如下所示:
TEST(foo, bar) {
int id = -99;
setId(id);
EXPECT_TRUE(SignedUnsignedIntCompare<decltype(ID)>(ID) == id);
}
关于c++ - 强制 googletest 签名与未签名比较失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598552/
gtest 有没有办法让内联/测试用例甚至测试超时。 例如,我想做类似的事情: EXPECT_TIMEOUT(5 秒,myFunction()); 我从 2010 年 12 月 9 日发现这个问题 g
我正在尝试googletest。 以前,我一直在使用Boost测试,并且一直在使用宏BOOST_AUTO_TEST_SUITE将测试分组到Testsuite中。 这使junit报告更具可读性。 我在g
我的 googletest 具有以下结构: void check(Arg a1, Arg a2) { EXPECT_TRUE(a1 == a2); } TEST(s, t) { a1 =
我有 2 种方法的类(class) class A { void Fun() { if(FunRet()>0){///} else {///} } int FunRet()
我正在使用 gtest 编写一个类型参数化的测试装置,我看到了 not declared in this scope当我尝试使用夹具类的成员时出现编译器错误。 当我不使用类型参数化装置时,我可以很好地
我在gtest中使用值参数化测试。例如,如果我写 INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest,
我有一个用C ++编写的程序,其中一些子文件夹包含链接的库。有一个顶级SConscript,它在子文件夹/库中调用SConscript文件。 在库cpp中,有一个GTest: TEST(X, just
为了对某些代码进行 BDD 风格的测试,我有一组测试,我想针对多个场景执行这些测试。我已经在 C# 中使用 NUnit & NSubstitute 多次这样做了,但是我正在努力使用 GoogleTes
我正在尝试为向量编写测试。 对于 STL 容器,我尝试过: EXPECT_THAT(float_vec1, ElementsAreArray(float_vec2)); 但是我需要插入一个边距。 有没
使用 Google Test 1.6(Windows 7、Visual Studio C++)。如何关闭给定的测试? (又名如何阻止测试运行)。除了注释掉整个测试之外,我还能做些什么吗? 最佳答案 d
如果一个测试有多个EXPECT_*语句 TEST_F(TestClass, ServerTest) { // Start server server_.start(); usl
当我编写测试夹具来测试一些 C 代码时,我使用相同的设置: https://github.com/google/googletest/blob/master/googletest/docs/prime
给定一个包含数千个测试的大型项目,其中一些测试需要几分钟才能完成。按顺序执行时,整套测试需要一个多小时才能完成。通过并行执行测试可以减少测试时间。 据我所知,没有办法直接从 googletest/mo
我在 googletest 中运行一些单元测试。我期望对模拟函数的某些调用 (EXPECT_CALL(*rtosMock, xQueueGenericSend( arg , _, _, _)).Tim
我刚刚开始学习 googletesting,并且正在使用它。我想使用参数化测试来检查类的函数成员返回的值是否是它应该的值。我已经声明了一个名为“myClass”的类,在其中我使用构造函数设置了一个变量
我有一个抽象基类,它具有处理线程生命周期(启动、停止、加入)的逻辑。线程中执行的工作依赖于实例化的派生类,派生类有几个。 基类如下所示: class Base { public: Base(i
是什么原因,为什么GoogleTest对参数计数使用引用? testing::InitGoogleTest(&argc, argv); (我的意思是:据我了解,这是一个输入参数,没有任何区别是否提
我正在为遗留代码创建测试,想知道是否可以像这样检查类的成员变量的值(我知道我下面的代码非常糟糕,糟糕的例子:/。希望只是请关注关于问题): class Animal { public: RESU
这是我的测试夹具:https://github.com/patrykbajos/ZinotEngine/blob/master/src/tests/core/MapResMgrTest.cpp .此可
我想知道,是否有可能检查失败的 ASSERT 或 EXPECT 语句,这些语句发生在被调用函数内部并且独立于任何其他或先前的失败 ASSERT/EXPECT 语句。基本上: void subcheck
我是一名优秀的程序员,十分优秀!