Gtest提供了若干个case方法进行测试不同的用例。主要常见的有TEST/TEST_F及TEST_P宏的使用。
在每个TestCase中可以通过断言提供的方法进行控制检查程序的预期走向是否是期望的结果,从而以此来判定程序的正确性。
测试实例的完整目录
-
TclCommon.cc与TclCommon.hh 构成 test fixture 类
如上分析TclCommon这个类,它是 test fixture 类,是使用TEST_F所必须的类需要继承testing::Test类,如上图中的第一点的两个函数,
|
SetUpTestCase和TearDownTestCase为是testing::Test类的静态方法,在测试的第一个测试用例开始前,
SetUpTestCase函数会被调用,而在测试中的最后一个测试用例运行结束后,TearDownTestCase函数会被调用。
可以通过在testfixture类中重新定义覆盖testing::Test类的静态方法在所有测试案例运行前后加入自己的内容。
TEST_F
test fixture,对应的宏函数是TEST_F(TestFixtureName, TestName)
- 案例中,TEST_F()的第一个参数为TestFixtureName test fixture类名,实例中使用using 给TclCommon类起了别名
- TEST_F()的第二个参数为测试名,这个可以任意取名
如果发现自己编写了两个或多个对相似数据进行操作的测试用例(宏),可以使用 test fixture 来为多个测试重用这些相同的配置。
TEST_F就是完成这样的事情,它的第一个参数是TestFixtureName类,同时根据需要实现以下两个虚函数如上TclCommon.hh的第二点:
|
可以通过重写这两个虚函数,让同一个TestFixtureName下的每个TEST_F都会先执行重写后的SetUp,最后执行TearDwom。
例如如图每个测试用例(每个TEST_F宏)在最开始都执行了
|
因此其实可以将这行代码加入到SetUp()中,在每个TEST_F测试案例之前执行。
TEST_F相对于TEST的区别
TEST_F与TEST的区别是,TEST_F提供了一个初始化函数(SetUp)和一个清理函数(TearDown),
在TEST_F中使用的变量可以在初始化函数SetUp中初始化,在TearDown中销毁,并且所有的TEST_F是互相独立的,
都是在初始化以后的状态开始运行,一个TEST_F不会影响另一个TEST_F所使用的数据
总结来说TEST_F就是功能更多的TEST,所以直接使用TEST_F即可
TEST_F相对于TEST_P的区别及TEST_P的用法
//TODO
assertion
在gtest
中,是通过断言(assertion
)来测试代码实现的功能是否符合预期。断言的结果分为success
、non-fatal failture
和fatal failture
,并根据断言失败的种类,gtest
提供了两种断言函数:
success
:即断言成功,程序的行为符合预期。non-fatal failure
:即断言失败,但是程序没有直接crash,而是继续向下运行。
gtest
提供了宏函数EXPECT_XXX(expected, actual)
:如果condition(expected, actual)
返回false,则EXPECT_XXX
产生的就是non-fatal failure
错误,并显示相关错误。
fatal failure
:断言失败,程序直接crash,后续的测试案例不会被运行。
gtest
提供了宏函数ASSERT_XXX(expected, actual)
。
在写单元测试时,更加倾向于使用EXPECT_XXX
,因为ASSERT_XXX
是直接crash退出的,可能会导致一些内存、文件资源没有释放,因此可能会引入一些bug。
具体的EXPECT_XXX
、ASSERT_XXX
函数及其判断条件,如下表。
失败案例
从上图可以看出名为delete_history的测试案例运行失败,是由于我使用ASSERT_EQ的断言宏,而TCL_Eval函数的返回值不等于TCL_OK从而导致了测试案例运行失败。
-
test_main.cc 主函数
上图是gtest的主函数,主要的就是如图中的
|
其余皆为根据实际情况添加
输出目录
CMAKE_RUNTIME_OUTPUT_DIRECTORY 可执行文件的输出目录
${PROJECT_SOURCE_DIR} 工程根目录
全部运行和单案例运行方法
如果想运行所有testcase进入输出目录运行可执行文件即可
通常GoogleTest的单元测试,直接执行,就全跑一遍,很耗时,有时候需要只测试某个case,怎么只运行某个测试用例呢?
您可以使用高级选项来运行Google测试。
要仅运行某些单元测试,可以使用--gtest_filter=Test_Cases1*
命令行选项,其值应接受*
和?
通配符以与多个测试匹配。。
- 通过运行测试来获取所有测试用例
--gtest_list_tests
- 选择您要运行的测试用例
- 使用选项运行测试可执行文件
--gtest_filter
从上图可以看到,先使用第一个命令查到所有testcase的名字,在通过第二条命令筛选特定的testcase运行,并且可以使用通配符