1.简介
GTest 是一个跨平台的 (Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian) C++单元测试框架,由google公司发布。
GTest 有如下特点:
提供强大的断言集,支持包括布尔、整型、浮点型、字符串等提供断言方法自定义扩展自动收集测试用例,无需开发者再次组织提供死亡测试功能可以将公共的用例初始化和清理工作放入测试夹具中,由gtest自动调用使用参数化自动生成多个相似的测试用例
获取地址:https://github.com/google/googletest
2.初始化
在一切环境、编译等准备就绪后,开始 GTest 的学习。
下面针对我使用的 FCL 案例,来学习其中 GTEST 测试的部分:
// gtest 头文件
#include <gtest/gtest.h>
// main 函数,用于初始化 gtest 和运行所有的测试样例
int main(int argc, char* argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
12345678910
我们在程序中创建了许多 TEST(详见后文),RUN_ALL_TESTS();
可以批量地执行它们。
在终端中的结果输出为:
[==========] Running 5 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 5 tests from FCL_COLLISION
123
即,在我们的当前测试程序中,有一个测试样例,这个测试样例中包含了五个测试段,这五个 test 又都属于 FCL_COLLISION。具体内容详见后文所述。
3.使用
将我们要测试的函数加入到 GTEST 中:
GTEST_TEST(FCL_COLLISION, test_SplineMotion_rotated_spline_collide_test)
{
test_SplineMotion_rotated_spline_collide_test<double>();
}
GTEST_TEST(FCL_COLLISION, OBB_Box_test)
{
test_OBB_Box_test<double>();
}
GTEST_TEST(FCL_COLLISION, OBB_shape_test)
{
test_OBB_shape_test<double>();
}
GTEST_TEST(FCL_COLLISION, OBB_AABB_test)
{
test_OBB_AABB_test<double>();
}
GTEST_TEST(FCL_COLLISION, mesh_mesh)
{
test_mesh_mesh<double>();
}
1234567891011121314151617181920212223
这里如果测试函数加入成功,则在执行时终端会打印:
[ RUN ] FCL_COLLISION.test_SplineMotion_rotated_spline_collide_test
1
可以直观地看出GTEST_TEST
中的参数与终端打印输出的关系。
在上述五个待测试函数中的结尾处,加入断言宏函数
EXPECT_TRUE(result.is_collide);
1
注,result.is_collide
是自定义的 bool 类型的状态变量。
这样,我们就可以得知测试的结果。在终端显示为:
[ OK ] FCL_COLLISION.test_SplineMotion_rotated_spline_collide_test (0 ms)
1
注:
这里使用了 gtest 的断言(assertion)宏。包括:
ASSERT_XXX(condition)
,返回类型为success
和fatal failture
EXPECT_XXX(condition)
,返回类型为success
和non-fatal failture
断言的结果是根据condition(expected, actual)
返回的结果来判断的,若返回 false,则断言的结果为 failture。其中,fatal failture 会使程序直接退出,non-fatal failture 会返回错误信息,然后继续测试后续案例。所以在工程中,常用EXPECT_XXX
宏函数。
主要的的EXPECT_XXX
、ASSERT_XXX
函数及其判断条件,如下两个表所示。
还有更多宏,可以自行去网上查找。
全部测试样例完成后,终端打印输出:
[----------] Global test environment tear-down
[==========] 5 tests from 1 test case ran. (3834 ms total)
[ PASSED ] 5 tests.
123