gtest测试框架使用详解_C++ 项目之Googletest单元测试

C++ 项目之Googletest单元测试

1.Clion集成Googletest单元测试

Googletest - Google Testing and Mocking Framework

源码下载地址:

https://github.com/google/googletest/releases

Googletest中包含两个模块,分别是gtest与gmock,需要分别源码编译,编译完后,到指定目录去拷贝includes文件夹与.so文件到下面路径的指定位置.

然后项目中创建ext目录,里面分为两块

  • 第一块:includes

包含gmock与gtest的include文件,对应于gcc -I参数,头文件路径,包含以.h结尾的头文件

  • 第二块:libs

包含gmock与gtest的libs文件,对应gcc -L参数,库文件路径,里面包含的是一些.so或.dll等动态或静态链接库

├── ext│   ├── includes│   │   ├── gmock│   │   └── gtest│   └── libs│       ├── gmock│       └── gtest

上述本地项目路径配置好后,在CmakeLists.txt中进行配置:

# extset(BASE_INCLUDES ext/includes)set(BASE_LIBS ext/libs)# googletestset(GTEST_INCLUDE_DIR ${BASE_INCLUDES}/gtest/include)set(GMOCK_INCLUDE_DIR ${BASE_INCLUDES}/gmock/include)set(GTEST_LINK_DIR ${BASE_LIBS}/gtest/lib/)set(GMOCK_LINK_DIR ${BASE_LIBS}/gmock/lib/)# 去哪里找头文件 相当于gcc/clang 中的-I(i的大写字母)参数include_directories(${GTEST_INCLUDE_DIR})include_directories(${GMOCK_INCLUDE_DIR})# 去哪里找库文件 .so .dll .dylib 相当于gcc 中的-L参数link_directories(${GTEST_LINK_DIR})link_directories(${GMOCK_LINK_DIR})

然后为每个test配上链接库即可.

例如,现在有个测试file,文件名为:了l1.cpp

那么在CmakeLists.txt中配置为:

add_executable(l1 l1.cpp)target_link_libraries(l1 gtest gtest_main)  

2.gtest之Helloworld

int main(int argc, char* argv[]){    // 接收命令行参数    testing::InitGoogleTest(&argc, argv);    vector x={1,2,3,5};    // EXPECT_EQ使用    for (int i = 0; i < x.size(); ++i)    {        EXPECT_EQ(x[i], 1) << "Vectors x and y differ at index " << i;    }    RUN_ALL_TESTS();      return 0;}

例如上述就是个完整的例子,每次运行:

testing::InitGoogleTest(&argc, argv);

然后使用:

RUN_ALL_TESTS();

运行所有的Test,每个Test编写参考后面断言.

我们看看运行效果:

l1.cpp:113: FailureExpected equality of these values:  x[i]    Which is: 2  1Vectors x and y differ at index 1l1.cpp:113: FailureExpected equality of these values:  x[i]    Which is: 3  1Vectors x and y differ at index 2l1.cpp:113: FailureExpected equality of these values:  x[i]    Which is: 5  1Vectors x and y differ at index 3[==========] Running 0 tests from 0 test cases.[==========] 0 tests from 0 test cases ran. (0 ms total)[  PASSED  ] 0 tests.[  FAILED  ] 0 tests, listed below: 0 FAILED TESTS

3.gtest初识之断言

关于断言Google包装了一系列EXPECTASSERT的宏,而EXPECT系列和ASSERT系列的区别是:

  • EXPECT  失败时,案例继续往下执行。

  • ASSERT 失败时,直接在当前函数中返回,当前函数中ASSERT后面的语句将不会执行。

例如:

TEST(ASSERTTest, ASSERT_VS_EXPECT){    ASSERT_TRUE(10<2);  // ASSERT失败,直接在当前函数中返回,后面语句不执行    ASSERT_FALSE(10<2);    EXPECT_EQ(6, Foo(310, 18));}

每个Test是个宏,Test底层源码如下:

# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)

对应test_case名与test名.

上述代码中10<2为False,而使用了ASSERT_TRUE,该Test后面所有内容就不会执行,如果换成EXPECT_TRUE则正常运行!

布尔值检查

Fatal assertionNonfatal assertionVerifies
ASSERT_TRUE(condition);EXPECT_TRUE(condition);condition is true
ASSERT_FALSE(condition);EXPECT_FALSE(condition);condition is false

数值型数据检查

Fatal assertionNonfatal assertionVerifies
ASSERT_EQ(expected,actual);EXPECT_EQ(expected,actual);expected == actual
ASSERT_NE(val1,val2);EXPECT_NE(val1,val2);val1 != val2
ASSERT_LT(val1,val2);EXPECT_LT(val1,val2);val1 < val2
ASSERT_LE(val1,val2);EXPECT_LE(val1,val2);val1 <= val2
ASSERT_GT(val1,val2);EXPECT_GT(val1,val2);val1 > val2
ASSERT_GE(val1,val2);EXPECT_GE(val1,val2);val1 >= val2

字符串检查

TEST(StringCmpTest, Demo){    char* pszCoderZh = "CoderZh";    wchar_t* wszCoderZh = L"CoderZh";    std::string strCoderZh = "CoderZh";    std::wstring wstrCoderZh = L"CoderZh";    EXPECT_STREQ("CoderZh", pszCoderZh);    EXPECT_STREQ(L"CoderZh", wszCoderZh);    EXPECT_STRNE("CnBlogs", pszCoderZh);    EXPECT_STRNE(L"CnBlogs", wszCoderZh);    EXPECT_STRCASEEQ("coderzh", pszCoderZh);    //EXPECT_STRCASEEQ(L"coderzh", wszCoderZh);    不支持    EXPECT_STREQ("CoderZh", strCoderZh.c_str());    EXPECT_STREQ(L"CoderZh", wstrCoderZh.c_str());}

其中STREQ和STRNE同时支持char和wchar_t类型的,STRCASEEQSTRCASENE却只接收char*

显示返回成功或失败

直接返回成功:SUCCEED();

返回失败:

Fatal assertionNonfatal assertion
FAIL();ADD_FAILURE();
// 返回成功与否TEST(ExplicitTest, Demo){    ADD_FAILURE() << "这行打印失败 Sorry"; // None Fatal Asserton,继续往下执行。    //FAIL(); // Fatal Assertion,不往下执行该案例。    EXPECT_TRUE(1==2)<<"1==2 failed!";      // 为了验证上述失败后是否执行下面    SUCCEED();}

异常检查

分为三个:

EXPECT_NO_THROW(statement);  不抛出异常

EXPECT_ANY_THROW(statement);抛出任意类型异常

EXPECT_THROW(statement, exception_type); 抛出指定类型异常

TEST(ExceptionTest,et) {    // 抛出任意类型异常    EXPECT_ANY_THROW(10/0); //Expected: 10/0 throws an exception.    // 抛出指定类型异常    EXPECT_THROW(1/0,int); //Expected: 1/0 throws an exception of type int.}

Predicate Assertions

检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪

例如:

// 预测断言bool MN(int m, int n){    return m>n;}//检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪TEST(PredicateAssertionTest, Demo){    int m = 5, n = 6;    EXPECT_PRED2(MN, m, n); //只提供<=5个参数  传递参数要与函数MN对应}

`EXPECT_PRED2(pred2, val1, val2);ASSERT类似.PRED2可以到PRED5

最多支持5个参数.

浮点型检查

EXPECT_FLOAT_EQ(expected, actual)EXPECT_DOUBLE_EQ(expected, actual)

ASSERT类似.

对相近的两个数比较:

EXPECT_NEAR(val1, val2, abs_error);

ASSERT类似.

例如:

// 浮点型TEST(FloatDoubleTest,Demo) {    ASSERT_DOUBLE_EQ(1.1,1.1);    EXPECT_FLOAT_EQ(1.2,4.0);    EXPECT_NEAR(1.234,1.888,0.9);//    EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);//    EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);    EXPECT_PRED_FORMAT2(testing::FloatLE,1,0);      // LE表示小于等于 也就是value1<=value2    EXPECT_PRED_FORMAT2(testing::DoubleLE,0.1,0.2);}

类型检查

// 类型检查template <typename T>class Tt{public:    void foo() {        testing::StaticAssertTypeEq<bool, T>();     // 与下面调用一致就不报错,否则报错    }};TEST(TypeAssertionTest, Demo){    Tt<bool> tt;    tt.foo();}

学习参考自:https://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html

f1e43da3e65fc5000531686da0dd1bc7.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GTest是Google Test的简称,是一个功能强大的C++单元测试框架。它提供了丰富的断言和测试工具,可以方便地编写、运行和管理测试用例。 首先,我们需要下载并安装GTest框架GTest可以从官方网站下载并编译安装,也可以使用包管理工具进行安装。安装完成后,我们就可以在自己的项目使用GTest进行单元测试了。 在编写测试用例时,我们需要在一个类定义多个测试函数。每个测试函数都应该以"TEST"宏开始,并且应该在测试函数使用多个断言来验证被测试代码的行为。例如,我们可以使用"EXPECT_EQ"断言来验证两个值是否相等。当测试函数执行完毕时,我们可以使用"ASSERT_"宏来检查测试是否通过。 GTest还提供了一些高级功能,例如测试夹具(Test Fixture)和参数化测试(Parameterized Test)等。测试夹具可以帮助我们在测试函数之前和之后执行一些共享的设置和清理操作。参数化测试可以使得我们在一组测试数据上运行相同的测试代码,以验证被测试代码在不同输入条件下的行为。 在运行测试时,我们可以使用GTest提供的命令行工具来执行测试用例。它会输出每个测试函数的执行结果以及总体的测试统计信息。我们也可以在IDE集成GTest,并通过点击运行按钮来执行测试。 总之,GTest是一个非常强大和方便的单元测试框架,可以帮助我们编写高质量的测试用例并验证被测试代码的正确性。通过充分利用GTest提供的功能,我们可以玩转Google单元测试框架,提升软件开发的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值