玩转Google开源C++单元测试框架Google Test系列(gtest)

本文详细介绍单元测试中各种断言的使用方法,包括显示返回成功或失败、异常检查、浮点型检查等,并通过示例代码说明如何进行类型检查及自定义输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六、显示返回成功或失败

直接返回成功:SUCCEED();

返回失败:

Fatal assertion

Nonfatal assertion

FAIL();

ADD_FAILURE();

 

TEST(ExplicitTest, Demo)
{
    ADD_FAILURE() << 
"Sorry"// None Fatal Asserton,继续往下执行。

    //FAIL(); // Fatal Assertion
,不往下执行该案例。

    SUCCEED();
}

七、异常检查

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_THROW(statement, exception_type);

EXPECT_THROW(statement, exception_type);

statement throws an exception of the given type

ASSERT_ANY_THROW(statement);

EXPECT_ANY_THROW(statement);

statement throws an exception of any type

ASSERT_NO_THROW(statement);

EXPECT_NO_THROW(statement);

statement doesn't throw any exception

 

例如:

int Foo(int a, int b)
{
    
if (a == 0 || b == 0)
    {
        
throw "don't do that";
    }
    
int c = a % b;
    
if (c == 0)
        
return b;
    
return Foo(b, c);
}

TEST(FooTest, HandleZeroInput)
{
    EXPECT_ANY_THROW(Foo(
100));
    EXPECT_THROW(Foo(
05), char*);
}

八、Predicate Assertions

在使用EXPECT_TRUEASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪。因此提供了如下的断言:

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_PRED1(pred1, val1);

EXPECT_PRED1(pred1, val1);

pred1(val1) returns true

ASSERT_PRED2(pred2, val1, val2);

EXPECT_PRED2(pred2, val1, val2);

pred2(val1, val2) returns true

...

...

...

 

Google人说了,他们只提供<=5个参数的,如果需要测试更多的参数,直接告诉他们。下面看看这个东西怎么用。

bool MutuallyPrime(int m, int n)
{
    
return Foo(m , n) > 1;
}

TEST(PredicateAssertionTest, Demo)
{
    
int m = 5, n = 6;
    EXPECT_PRED2(MutuallyPrime, m, n);
}

 

当失败时,返回错误信息:

error: MutuallyPrime(m, n) evaluates to false, where
m evaluates to 5
n evaluates to 6

如果对这样的输出不满意的话,还可以自定义输出格式,通过如下:

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_PRED_FORMAT1(pred_format1, val1);`

EXPECT_PRED_FORMAT1(pred_format1, val1);

pred_format1(val1) is successful

ASSERT_PRED_FORMAT2(pred_format2, val1, val2);

EXPECT_PRED_FORMAT2(pred_format2, val1, val2);

pred_format2(val1, val2) is successful

...

...

 

 

用法示例:

testing::AssertionResult AssertFoo(const char* m_expr, const char* n_expr, const char* k_expr, int m, int n, int k) {
    
if (Foo(m, n) == k)
        
return testing::AssertionSuccess();
    testing::Message msg;
    msg << m_expr << 
 " << n_expr << 的最大公约数应该是:" << Foo(m, n) << 而不是:" << k_expr;
    
return testing::AssertionFailure(msg);
}

TEST(AssertFooTest, HandleFail)
{
    EXPECT_PRED_FORMAT3(AssertFoo, 
362);
}

失败时,输出信息:

error: 3 6 的最大公约数应该是:3 而不是:2

是不是更温馨呢,呵呵。

九、浮点型检查

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_FLOAT_EQ(expected, actual);

EXPECT_FLOAT_EQ(expected, actual);

the two float values are almost equal

ASSERT_DOUBLE_EQ(expected, actual);

EXPECT_DOUBLE_EQ(expected, actual);

the two double values are almost equal

 

对相近的两个数比较:

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_NEAR(val1, val2, abs_error);

EXPECT_NEAR(val1, val2, abs_error);

the difference between val1 and val2 doesn't exceed the given absolute error

 

同时,还可以使用:

EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);
EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);

 

十、Windows HRESULT assertions

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_HRESULT_SUCCEEDED(expression);

EXPECT_HRESULT_SUCCEEDED(expression);

expression is a success HRESULT

ASSERT_HRESULT_FAILED(expression);

EXPECT_HRESULT_FAILED(expression);

expression is a failure HRESULT

 

例如:

CComPtr shell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L
"Shell.Application"));
CComVariant empty;
ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));

 

十一、类型检查

类型检查失败时,直接导致代码编不过,难得用处就在这?看下面的例子:

template <typename T> class FooType {
public:
    
void Bar() { testing::StaticAssertTypeEq<int, T>(); }
};

TEST(TypeAssertionTest, Demo)
{
    FooType<
bool> fooType;
    fooType.Bar();
}

 

十二、总结

 本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。要真的到写案例的时候,也行只是一两种是最常用的,现在时知道有这么多种选择,以后才方便查询。

作者:CoderZhCoderZh的技术博客 - 博客园
出处:http://coderzh.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值