使用gtest/gmock做单元测试
使用gtest/gmock做单元测试
1.下载编译gmock源码
由于gmock本身包含gtest源码,因此我们只编译gmock引入gmock头文件即可。
从Google C++ Mocking Framework上下载googlemock-read-only源码,使用VC2010编译gmock.sln生成成Debug版本的gmock.lib、gmock_main.lib。
2.在项目中使用gmock
原项目名称为ProjName,测试项目为ProjNameUnitTest,目录结构如下:
├─ProjComm
│ ├─include
│ │ └─gmock
│ │ │ gmock.h
│ │ │
│ │ └─internal
│ │ gmock-generated-internal-utils.h
│ │
│ └─lib
│ gmock.lib
│ gmock_main.lib
│
└─ProjName
│ ProjName.vcxproj
│ ProjNameUnitTest.vcxproj
│
├─src
├─test
│ UnitTest.cpp
│ UnitTest.h
│
└─testcase
文件UnitTest.h以及UnitTest.cpp用来向工程引入gmock头文件以及静态链接库gmock.lib
UnitTest.h
#ifndef _UNIT_TEST_COMMON_H_
#define _UNIT_TEST_COMMON_H_
#ifdef UNIT_TEST
#include "../../ProjComm/include/gmock/gmock.h"
#define STATIC
#define PRIVATE public
#define PROTECTED public
#else
#define STATIC static
#define PRIVATE private
#define PROTECTED protected
#endif
#endif /* _UNIT_TEST_COMMON_H_ */
UnitTest.cpp
#include "UnitTest.h"
#ifdef UNIT_TEST
#pragma comment(lib, "../../ProjComm/lib/gmock.lib")
#pragma comment(lib, "../../ProjComm/lib/gmock_main.lib")
#else
#error "Use only in the unit test project."
#endif
在ProjName与ProjNameUnitTest中引入UnitTest.h,同时在ProjNameUnitTest中定义UNIT_TEST,在ProjNameUnitTest中引入UnitTest.cpp用来包含gmock.lib以及gmock_main.lib。
3.配置ProjNameUnitTest
需要在ProjNameUnitTest中作如下配置才能使gmock_main.lib替换现有的main入口函数;
(1) 在C/C++ | Code Generation中设置Runtime Library为Multi-threaded Debug (/MTd)
(2) 在Linker | Input中的Additional Dependencies前增加uafxcwd.lib;Libcmtd.lib;
(3) 在Linker | Input中的Ignore Specific Default Libraries中增加Libcmtd.lib;uafxcwd.lib;(注意顺序)
单测注意事项
- 尽量不要改动被测试项目代码,尽量整体引用被测试程序;
- 如果被测试项目是COM组件,需要引用ProjectName_i.c文件,因为该文件包含了自动生成的接口GUID;
- 测试工程本身没有stdafx.h,.cpp文件,需要引入被测试工程的预编译头文件;