分类目录归档:未分类

chromium中的单元测试

对于chromium这样庞大的系统来说,单元测试是少不了的。chromium代码库中存在大量的单元测试代码,通常命名为xxx_unittest.cc。chromium中采用的单元测试框架为gtest。

gtest是google开发的一套开源的C++测试框架,支持多种平台(Linux, Mac OS X, Windows, Cygwin, WindowsCE和Symbian)。它支持自动的测试发现,丰富的断言及用户自定义断言,死亡测试,致命和非致命的失败,参数化类型和值的测试,XML测试报告产生。gtest项目地址为http://code.google.com/p/googletest。

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测试代码。