更通用的做法是:不必在每个平台下分别编译生成静态库,可以直接使用/fused-src/gtest下的gtest.h和gtest-all.cc两个文件,此两个文件包含了所有你需要用到的Google Test的东西。如果没有/fuse-src这个文件,可以使用/scripts/fuse_gtest_files.py这个文件生成,操作步骤是:(1)、配置好python;(2)、打开命令提示符,将其定位到/scripts文件夹下,输入命令:python fuse_gtest_files.py fused_gtest ;会在/scripts文件夹下生成一个fused_gtest/gtest文件,里面包含gtest.h和gtest-all.cc两个文件,此两个文件和/fuse-src中的同名文件内容是完全一致的。
下面是对gtest的一些总结:
1. TEST(test_case_name, test_name)
TEST_F(test_fixture,test_name)
TEST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用提供的断言来进行检查。
多个测试场景需要相同数据配置的情况,用TEST_F。
2. gtest中,断言的宏可以分为两类,一类是ASSERT系列,一类是EXPECT系列。
{ASSERT|EXPECT}_EQ(expected,actual): Tests that expected == actual
{ASSERT|EXPECT}_NE(v1,v2): Tests that v1 != v2
{ASSERT|EXPECT}_LT(v1,v2): Tests that v1 < v2
{ASSERT|EXPECT}_LE(v1,v2): Tests that v1 <= v2
{ASSERT|EXPECT}_GT(v1,v2): Tests that v1 > v2
{ASSERT|EXPECT}_GE(v1,v2): Tests that v1 >= v2
EXPECT_*和ASSERT_*的区别:(1)、EXPECT_*失败时,案例继续往下执行;(2)、ASSERT_*失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行,退出当前函数,并非退出当前案例。
断言:布尔值检查、数值型数据检查、字符串检查、显示成功或失败、异常检查、Predicate Assertions、浮点型检查、Windows HRESULT assertions、类型检查。
3. ::testing::InitGoogleTest(&argc,argv):gtest的测试案例允许接收一系列的命令行参数,将命令行参数传递给gtest,进行一些初始化操作。gtest的命令行参数非常丰富。
4. RUN_ALL_TESTS():运行所有测试案例。
5. 可以通过操作符"<<"将一些自定义的信息输出,如在EXPECT_EQ(v1, v2)<< "thisis a error! "
6. gtest的事件一共有3种:(1)、全局的,所有案例执行前后;(2)、TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后;(3)、TestCase级别的,每个TestCase前后。
全局事件:要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有案例执行前执行;TearDown方法在所有案例执行后执行。
TestSuite事件:需要写一个类,继承testing::Test,然后实现两个静态方法:(1)、SetUpTestCase方法在第一个TestCase之前执行;(2)、TearDownTestCase方法在最后一个TestCase之后执行。
TestCase事件:是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。(1)、SetUp方法在每个TestCase之前执行;(2)、TearDown方法在每个TestCase之后执行。
每个基于gtest的测试过程,是可以分为多个TestSuite级别,而每个TestSuite级别又可以分为多个TestCase级别。这样分层的结构的好处,是可以针对不同的TestSuite级别或者TestCase级别设置不同的参数、事件机制等,并且可以与实际测试的各个模块层级相互对应,便于管理。
7. 参数化:必须添加一个类,继承testing::TestWithParam<T>,其中T就是你需要参数化的参数类型。
8. 编写死亡测试案例时,TEST的第一个参数,即test_case_name,请使用DeathTest后缀,原因是gtest会优先运行死亡测试案例,应该是为线程安全考虑。
9. testing::AddGlobalTestEnvironment(newFooEnvironment):在main函数中创建和注册全局环境对象。
10. 对于运行参数,gtest提供了三种设置的途径:(1)、系统环境变量;(2)、命令行参数;(3)、代码中指定FLAG。
命令行参数:(1)、--gtest_list_tests:使用这个参数时,将不会执行里面的测试案例,而是输出一个案例的列表;(2)、--gtest_filter:对执行的测试案例进行过滤,支持通配符;(3)、--gtest_also_run_disabled_tests:执行案例时,同时也执行被置为无效的测试案例;(4)、--gtest_repeat=[COUNT]:设置案例重复运行次数;(5)、--gtest_color=(yes|no|auto):输出命令行时是否使用一些五颜六色的颜色,默认是auto;(6)、--gtest_print_time:输出命令时是否打印每个测试案例的执行时间,默认是不打印的;(7)、--gtest_output=xml[:DIRECTORY_PATH|:FILE_PATH:将测试结果输出到一个xml中,如—gtest_output=xml:d:foo.xml 指定输出到d:foo.xml ,如果不是指定了特定的文件路径,gtest每次输出的报告不会覆盖,而会以数字后缀的方式创建;(8)、--gtest_break_on_failure:调试模式下,当案例失败时停止,方便调试;(9)、--gtest_throw_on_failure:当案例失败时以C++异常的方式抛出;(10)、--gtest_catch_exceptions:是否捕捉异常,gtest默认是不捕捉异常的,这个参数只在Windows下有效。