linux geogle test教程及TEST_F,TEST_P宏用法

Gtest提供了若干个case方法进行测试不同的用例。主要常见的有TEST/TEST_F及TEST_P宏的使用。
在每个TestCase中可以通过断言提供的方法进行控制检查程序的预期走向是否是期望的结果,从而以此来判定程序的正确性。

测试实例的完整目录

  • TclCommon.cc与TclCommon.hh 构成 test fixture 类 

如上分析TclCommon这个类,它是 test fixture 类,是使用TEST_F所必须的类需要继承testing::Test类,如上图中的第一点的两个函数,

static void SetUpTestCase();

static void TearDownTestCase();

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的第二点:

virtual void SetUp():在每个TEST_F中测试案例之前运行;

virtual void TearDown():在每个TEST_F之后运行。

可以通过重写这两个虚函数,让同一个TestFixtureName下的每个TEST_F都会先执行重写后的SetUp,最后执行TearDwom。

例如如图每个测试用例(每个TEST_F宏)在最开始都执行了

auto interp = Commands::interp();

因此其实可以将这行代码加入到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)来测试代码实现的功能是否符合预期。断言的结果分为successnon-fatal failturefatal 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_XXXASSERT_XXX函数及其判断条件,如下表。

失败案例

从上图可以看出名为delete_history的测试案例运行失败,是由于我使用ASSERT_EQ的断言宏,而TCL_Eval函数的返回值不等于TCL_OK从而导致了测试案例运行失败。

  • test_main.cc  主函数

上图是gtest的主函数,主要的就是如图中的

testing::InitGoogleTest(&argc, argv);

int ret = RUN_ALL_TESTS();

其余皆为根据实际情况添加

输出目录

CMAKE_RUNTIME_OUTPUT_DIRECTORY   可执行文件的输出目录

${PROJECT_SOURCE_DIR}   工程根目录

全部运行和单案例运行方法

如果想运行所有testcase进入输出目录运行可执行文件即可

通常GoogleTest的单元测试,直接执行,就全跑一遍,很耗时,有时候需要只测试某个case,怎么只运行某个测试用例呢?

您可以使用高级选项来运行Google测试。

要仅运行某些单元测试,可以使用--gtest_filter=Test_Cases1*命令行选项,其值应接受*?通配符以与多个测试匹配。。

  1. 通过运行测试来获取所有测试用例 --gtest_list_tests
  2. 选择您要运行的测试用例
  3. 使用选项运行测试可执行文件 --gtest_filter

从上图可以看到,先使用第一个命令查到所有testcase的名字,在通过第二条命令筛选特定的testcase运行,并且可以使用通配符

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值