Gtest 基础


#include<gtest/gtest.h>
#include<iostream>

// 下载地址 : https://github.com/google/googletest

// 编译gtest 库
// cd googletest-master
// cmake CMakeLists.txt
// make
// sudo cp libgtest*.a  /usr/lib
// sudo cp –a include/gtest /usr/include
// sudo cp –a include/gmock /usr/include

#define Test_MAIN_START " ======================== TestMain Start ======================== "
#define Test_MAIN_STOP  " ======================== TestMain Stop  ======================== "

#define Test_SUITE_START " ======================== TestSuite Start ======================== "
#define Test_SUTIE_STOP  " ======================== TestSuite Stop  ======================== "

#define Test_CASE_START " ======================== TestCase Start ======================== "
#define Test_CASE_STOP  " ======================== TestCase Stop  ======================== "
/*
要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。
1. SetUp()方法在所有案例执行前执行
2. TearDown()方法在所有案例执行后执行
还需要告诉gtest添加这个全局事件,我们需要在main函数中通过testing::AddGlobalTestEnvironment方法将事件挂进来,
也就是说,我们可以写很多个这样的类,然后将他们的事件都挂上去。
*/
class TestMain: public testing::Environment
{
public:
    virtual void SetUp()
    {
        std::cout <<Test_MAIN_START<< std::endl;

    }
    virtual void TearDown()
    {
        std::cout <<Test_MAIN_STOP<< std::endl;
    }
};
/*
TestSuite事件
我们需要写一个类,继承testing::Test,然后实现两个静态方法
1. SetUpTestCase() 方法在第一个TestCase之前执行
2. TearDownTestCase() 方法在最后一个TestCase之后执行
在编写测试案例时,我们需要使用TEST_F这个宏,第一个参数必须是我们上面类的名字,代表一个TestSuite。
*/
class TestSuite:public testing::Test
{
public:
    static void SetUpTestCase()
    {
        std::cout <<Test_SUITE_START<< std::endl;
    }
    static void TearDownTestCase()
    {
        std::cout <<Test_SUTIE_STOP<< std::endl;
    }
    void SetUp()
    {
        std::cout <<Test_CASE_START<< std::endl;
    }
    void TearDown()
    {
        std::cout <<Test_CASE_STOP<< std::endl;
    } 
};
// 测试 框架
TEST_F(TestSuite, Test1)
{
    // first case
}
TEST_F(TestSuite, Test2)
{
    // second case
}
class TestAssertSuite:public testing::Test
{
public:
    static void SetUpTestCase()
    {
        std::cout <<"TestAssertSuite begin"<< std::endl;
    }
    static void TearDownTestCase()
    {
        std::cout <<"TestAssertSuite end"<< std::endl;
    }
    void SetUp()
    {
        std::cout <<"TestAssertSuite Case Begin"<< std::endl;
    }
    void TearDown()
    {
        std::cout <<"TestAssertSuite Case End"<< std::endl;
    } 
};

TEST_F(TestAssertSuite, TestBool)
{
    // bool值检查
    ASSERT_TRUE(true);      // ASSERT_TRUE(参数),期待结果是true
    ASSERT_FALSE(false);    // ASSERT_FALSE(参数),期待结果是false
}

TEST_F(TestAssertSuite, TestInt)
{
    ASSERT_EQ(100,100); // ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数  equal
    ASSERT_NE(100,10);  // ASSERT_NE(参数1,参数2),not equal,不等于才返回true
    ASSERT_LT(10,100);  // ASSERT_LT(参数1,参数2),less than,小于才返回true
    ASSERT_GT(100,10);  // ASSERT_GT(参数1,参数2),greater than,大于才返回true
    ASSERT_LE(10,100);  // ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
    ASSERT_GE(100,10);// ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true
}

/*
字符串检查
ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
ASSERT_STRCASEEQ(expected_str, actual_str)
ASSERT_STRCASENE(str1, str2)
EXPECT_系列,也是具有类似的宏结构的
*/

// 运行命令
// g++  test.cc -lgtest -lpthread
// ./a.out --gtest_output=xml:result.xml
/*
命令行参数
说明
--gtest_color=(yes|no|auto)
输出命令行时是否使用一些五颜六色的颜色。默认是auto。
--gtest_print_time
输出命令行时是否打印每个测试案例的执行时间。默认是不打印的。
--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
将测试结果输出到一个xml中。
1.--gtest_output=xml:    不指定输出路径时,默认为案例当前路径。
2.--gtest_output=xml:d:\ 指定输出到某个目录 
3.--gtest_output=xml:d:\foo.xml 指定输出到d:\foo.xml
如果不是指定了特定的文件路径,gtest每次输出的报告不会覆盖,而会以数字后缀的方式创建。xml的输出内容后面介绍吧。 

--gtest_break_on_failure
调试模式下,当案例失败时停止,方便调试
*/
class IsPrimeParamTest : public::testing::TestWithParam<int>{};
bool test_func(int a)
{
    return a > 0;
}
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
    int n =  GetParam();
    EXPECT_TRUE(test_func(n));
}
//被测函数须传入多个相关的值
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
/*
第一个参数是测试案例的前缀,可以任意取。 
第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如:IsPrimeParamTest 
第三个参数是可以理解为参数生成器,上面的例子使用test::Values表示使用括号内的参数。Google提供了一系列的参数生成的函数:
Range(begin, end[, step])	范围在begin~end之间,步长为step,不包括end
Values(v1, v2, ..., vN)	v1,v2到vN的值
ValuesIn(container) and ValuesIn(begin, end)	从一个C类型的数组或是STL容器,或是迭代器中取值
Bool()	取false 和 true 两个值
Combine(g1, g2, ..., gN)	
这个比较强悍,它将g1,g2,...gN进行排列组合,g1,g2,...gN本身是一个参数生成器,每次分别从g1,g2,..gN中各取出一个值,组合成一个元组(Tuple)作为一个参数。
说明:这个功能只在提供了<tr1/tuple>头的系统中有效。gtest会自动去判断是否支持tr/tuple,如果你的系统确实支持,而gtest判断错误的话,你可以重新定义宏GTEST_HAS_TR1_TUPLE=1。
*/
int main(int argc,char **argv)
{
    testing::AddGlobalTestEnvironment(new TestMain);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

[==========] Running 9 tests from 3 test suites.
[----------] Global test environment set-up.
 ======================== TestMain Start ======================== 
[----------] 2 tests from TestSuite
 ======================== TestSuite Start ======================== 
[ RUN      ] TestSuite.Test1
 ======================== TestCase Start ======================== 
 ======================== TestCase Stop  ======================== 
[       OK ] TestSuite.Test1 (0 ms)
[ RUN      ] TestSuite.Test2
 ======================== TestCase Start ======================== 
 ======================== TestCase Stop  ======================== 
[       OK ] TestSuite.Test2 (0 ms)
 ======================== TestSuite Stop  ======================== 
[----------] 2 tests from TestSuite (0 ms total)

[----------] 2 tests from TestAssertSuite
TestAssertSuite begin
[ RUN      ] TestAssertSuite.TestBool
TestAssertSuite Case Begin
TestAssertSuite Case End
[       OK ] TestAssertSuite.TestBool (0 ms)
[ RUN      ] TestAssertSuite.TestInt
TestAssertSuite Case Begin
TestAssertSuite Case End
[       OK ] TestAssertSuite.TestInt (0 ms)
TestAssertSuite end
[----------] 2 tests from TestAssertSuite (0 ms total)

[----------] 5 tests from TrueReturn/IsPrimeParamTest
[ RUN      ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/0
[       OK ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/0 (0 ms)
[ RUN      ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/1
[       OK ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/1 (0 ms)
[ RUN      ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/2
[       OK ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/2 (0 ms)
[ RUN      ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/3
[       OK ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/3 (0 ms)
[ RUN      ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/4
[       OK ] TrueReturn/IsPrimeParamTest.HandleTrueReturn/4 (0 ms)
[----------] 5 tests from TrueReturn/IsPrimeParamTest (0 ms total)

[----------] Global test environment tear-down
 ======================== TestMain Stop  ======================== 
[==========] 9 tests from 3 test suites ran. (1 ms total)
[  PASSED  ] 9 tests.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值