Gtest小结

gtest 小结

1. gtest在xcode的配置

Build Settings设置:

Header Search Paths 添加 /usr/local/include

Library Search Paths 添加 /usr/local/lib/

Other Linker Flags 添加/usr/local/lib/libgtest.a

Build Phases设置

Link Binary With Libraries

//添加
libgtest_main.a
libgtest.a

2.认识gtest

int Foo(int a, int b)
{
    if (a == 0 || b == 0)
    {
        throw "don't do that";
    }
    int c = a % b;
    if (c == 0)
        return b;
    return Foo(b, c);
}
---------------------------------------
#include <gtest/gtest.h>

TEST(FooTest, HandleNoneZeroInput)
{
    EXPECT_EQ(2, Foo(4, 10));
    EXPECT_EQ(6, Foo(30, 18));
}

--------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

函数是用来求最大公约数.

使用了TEST这个宏,它有两个参数,官方的对这两个参数的解释为:[TestCaseName,TestName]

testing::InitGoogleTest(&argc, argv) :gtest的测试案例允许接收一系列的命令行参数,

RUN_ALL_TESTS() 运行所有测试案例.

2.断言

断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:

  1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
  2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
//int型比较,预期值:3,实际值:Add(1,2)
EXPECT_EQ(3,Add(1,2))

3.事件机制

gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:

  1. 全局的,所有案例执行前后。
  2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
  3. TestCase级别的,每个TestCase前后。

全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。

  1. SetUp()方法在所有案例执行前执行
  2. TearDown()方法在所有案例执行后执行
  3. 需要在main函数中通过testing::AddGlobalTestEnvironment方法将事件挂进来
class FooEnvironment : public testing::Environment
{
public:
    virtual void SetUp()
    {
        std::cout << "Foo FooEnvironment SetUP" << std::endl;
    }
    virtual void TearDown()
    {
        std::cout << "Foo FooEnvironment TearDown" << std::endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

运行参数

gtest提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。

gtest提供了三种设置的途径:

  1. 系统环境变量

  2. 命令行参数

  3. 代码中指定FLAG 比较理想的优先级: 命令行参数 > 代码中指定FLAG > 系统环境变量

  4. --gtest_filter

  5. --gtest_output=xml[:DIRECTORY_PATH|:FILE_PATH]

  6. --gtest_catch_exceptions

  7. 同时使用--gtest_filter和--gtest_output=xml:时,在xml测试报告中能否只包含过滤后的测试案例的信息。

  8. 有时,我在代码中设置 testing::GTEST_FLAG(catch_exceptions) = 1和我在命令行中使用--gtest_catch_exceptions结果稍有不同,在代码中设置FLAG方式有时候捕捉不了某些异常,但是通过命令行参数的方式一般都不会有问题。这是我曾经遇到过的一个问题,最后我的处理办法是既在代码中设置FLAG,又在命令行参数中传入--gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不够稳定,还是我自己测试案例的问题。


updatedupdated2020-11-242020-11-24