在https://code.google.com/p/googletest/ 下载源码
进入msvc, 注意编译方式, 若是是dll, 选择 gtest-md
编译生成lib文件, 而后引入.文件便可使用git
#include "gtest/gtest.h" int _tmain(int argc, _TCHAR* argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
固然咱们也能够输出到xmlgithub
int _tmain(int argc, _TCHAR* argv[]) { testing::GTEST_FLAG(output) = "xml:"; testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
断言的宏能够分为两类ASSERT系列和EXPECT系列。函数
TEST(StringCmpTest, Demo) { EXPECT_EQ(3, add(1, 2)); ASSERT_EQ(3, add(1, 2)); }
咱们再来看下所支持的宏测试
直接返回成功仍是失败google
Predicate Assertions指针
在使用EXPECT_TRUE或ASSERT_TRUE时,有时但愿可以输出更加详细的信息,好比检查一个函数的返回值TRUE仍是FALSE时,但愿可以输出传入的参数是什么,以便失败后好跟踪。所以提供了以下的断言:code
若是对这样的输出不满意的话,还能够自定义输出格式化orm
若是咱们有这样一个类Arithmetic
咱们只须要新建一个ArithmeticUnit.cpp文件,而后写下以下代码:xml
#include "stdafx.h" #include "Arithmetic.h" #include "gtest/gtest.h" TEST(Arithmetic, add){ Arithmetic arith; int a(1), b(2); EXPECT_EQ(3, arith.add(1, 2)); }
首先从TEST宏入手, 咱们看下宏的定义对象
//1 define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name) //2 #define GTEST_TEST(test_case_name, test_name)\ GTEST_TEST_(test_case_name, test_name, \ ::testing::Test, ::testing::internal::GetTestTypeId()) //3 #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ public:\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ private:\ virtual void TestBody();\ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ .... 因此 1. 最终展开的宏是继承自testing::Test类 2. 咱们最终写的代码是放在TestBody()中的 3. 经过静态变量test_info_,调用MakeAndRegisterTestInfo对测试案例进行注册。
看下MakeAndRegisterTestInfo 是如何实现的
TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = new TestInfo(test_case_name, name, type_param, value_param, fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; }
TestInfo对象主要用于包含以下信息:
测试名称(test name)
该案例是否须要执行
测试结果
咱们还看到,TestInfo的构造函数中,很是重要的一个参数就是工厂对象
internal::TestFactoryBase* factory
它主要负责在运行测试案例时建立出Test对象
new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>)
咱们再来看下 TestFactoryImpl 是如何实现的
template <class TestClass> class TestFactoryImpl : public TestFactoryBase { public: virtual Test* CreateTest() { return new TestClass; } };
我靠, 这也能算是工厂吗~
不过总之流程是, 咱们要建立一个测试对象的时候,先调用factory的CreateTest()方法 建立TestInfo对象, 再经过 GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);对TestInfo对象进行注册
UnitTest 是单例
UnitTestImpl 是实现
void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, TestInfo * test_info) { // 获取或建立了一个TestCase对象,并将testinfo添加到TestCase对象中。 GetTestCase(test_info->test_case_name(), test_info->test_case_comment(), set_up_tc, tear_down_tc)->AddTestInfo(test_info); }
这里TestCase对象就出来了
TEST宏中的两个参数,第一个参数testcase_name,就是TestCase对象的名称,第二个参数test_name就是Test对象的名称。而TestInfo包含了一个测试案例的一系列信息。
一个TestCase对象对应一个或多个TestInfo对象。
总结一下gtest里的几个关键的对象:
一个简单的UML图以下