如果我们需要输出到XML文件,则执行./unittest --gtest_output=xml,那么会在当前目录下生成test_detail.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <testsuites tests="3" failures="0" disabled="0" errors="0" time="0.001" name="AllTests"> <testsuite name="CHashTableTest" tests="3" failures="0" disabled="0" errors="0" time="0.001"> <testcase name="hashfunc" status="run" time="0.001" classname="CHashTableTest" /> <testcase name="addget" status="run" time="0" classname="CHashTableTest" /> <testcase name="delget" status="run" time="0" classname="CHashTableTest" /> </testsuite> </testsuites> |
如此,一个简单的单元测试写完。因为太简单,所以不需要使用google mock模拟一些依赖。后续我再写结合google mock来写一些复杂的gtest单元测试。
下面来简单说下gtest的工作流程。
4、google test内部是如何执行我们的单元测试用例的
首先从main函数看起。
我们的main函数执行了RUN_ALL_TESTS宏,这个宏干了些什么事呢?
#define RUN_ALL_TESTS()\ } // namespace testing |
原来是调用了UnitTest静态工厂实例的Run方法!在gtest里,一切测试用例都是Test类的实例!所以,Run方法将会执行所有的Test实例来运行所有的单元测试,看看类图:
为什么说一切单元测试用例都是Test类的实例呢?
我们有两种写测试用例的方法,一种就是上面我说的TEST_F宏,这要求我们要显示的定义一个子类继承自Test类。在TEST_F宏里,会再次定义一个新类,继承自我们上面定义的子类(两重继承哈)。
第二种就是TEST宏,这个宏里不要求用户代码定义类,但在google test里,TEST宏还是定义了一个子类继承自Test类。
所以,UnitTest的Run方法只需要执行所有Test实例即可。