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系列。一个直观的解释就是:
- ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
- EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
//int型比较,预期值:3,实际值:Add(1,2)
EXPECT_EQ(3,Add(1,2))
3.事件机制
gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:
- 全局的,所有案例执行前后。
- TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
- TestCase级别的,每个TestCase前后。
全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。
- SetUp()方法在所有案例执行前执行
- TearDown()方法在所有案例执行后执行
- 需要在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提供了三种设置的途径:
-
系统环境变量
-
命令行参数
-
代码中指定FLAG 比较理想的优先级: 命令行参数 > 代码中指定FLAG > 系统环境变量
-
--gtest_filter
-
--gtest_output=xml[:DIRECTORY_PATH|:FILE_PATH]
-
--gtest_catch_exceptions
-
同时使用--gtest_filter和--gtest_output=xml:时,在xml测试报告中能否只包含过滤后的测试案例的信息。
-
有时,我在代码中设置 testing::GTEST_FLAG(catch_exceptions) = 1和我在命令行中使用--gtest_catch_exceptions结果稍有不同,在代码中设置FLAG方式有时候捕捉不了某些异常,但是通过命令行参数的方式一般都不会有问题。这是我曾经遇到过的一个问题,最后我的处理办法是既在代码中设置FLAG,又在命令行参数中传入--gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不够稳定,还是我自己测试案例的问题。