对于chromium这样庞大的系统来说,单元测试是少不了的。chromium代码库中存在大量的单元测试代码,通常命名为xxx_unittest.cc。chromium中采用的单元测试框架为gtest。
gtest是google开发的一套开源的C++测试框架,支持多种平台(Linux, Mac OS X, Windows, Cygwin, WindowsCE和Symbian)。它支持自动的测试发现,丰富的断言及用户自定义断言,死亡测试,致命和非致命的失败,参数化类型和值的测试,XML测试报告产生。gtest项目地址为https://mogoweb.net/ndk/。
1. gtest简单示例
闲话少说,我们先用一个简单的示例来感受一下gtest的基本功能。首先下载gtest压缩包,ubuntu下很简单,解压源代码后:
./configure
make
即可。下面写一段简单的代码:
// foo_unittest.cc
#include "gtest/gtest.h"
namespace {
class FooTest : public testing::Test {
protected:
FooTest() {
// setup work for each test.
}virtual ~FooTest() {
// clean-up work
}virtual void SetUp() {
// Code here will be called immediately after the constructor
// (right before each test).
}virtual void TearDown() {
// Code here will be called immediately aftr each test
// (right before the destructor).
}
};TEST_F(FooTest, ZeroEqual) {
EXPECT_EQ(0, 0);
}TEST_F(FooTest, OneEqual) {
EXPECT_EQ(1, 1);
}} // namespace
接下来编译链接程序:
g++ -o foo_unittest.o -c foo_unittest.cc –I/home/work/dev-app/gtest-1.6.0/include
libtool -mode=link gcc –g –o foo_unittest foo_unittest.o /home/work/dev-app/gtest-1.6.0/lib/libgtest_main.la –lm
gtest提供了libgtest_main.la,我们不需要编写main文件就可以生成可执行程序。执行foo_unittest的输出如下:
2. chromium中的测试基类
本文并不探讨gtest的用法,如果希望详细了解gtest的使用,建议阅读gtest文档,另外玩转Google开源C++单元测试框架Google Test系列也写得非常不错。下面看看chromium中的单元测试。
chromium包含了一个基础测试套件类TestSuite,代码位于src/base/test/test_suite.h。它定义了一个基本的测试套件框架,用于运行基于gtest的测试用例。在main程序中示例化该类并运行类的Run方法,即可运行链接到可执行程序的任何gtest用例。在src/base/test/下有一个测试程序,主程序非常简单:
#include “base/test/test_suite.h”
int main(int argc, char** argv) {
return base::TestSuite(argc, argv).Run();
}
至于执行哪些测试用例,取决于链接了哪些gtest测试代码。