编写Chromium的browser tests


发布于 2021-03-18


Chromium项目里面有很多种测试,比如单元测试、fuzzing模糊测试、Telemetry的自动化和性能测试。还有一些针对特定业务的GPU测试、webkit Layout Tests、UI Pixel Tests测试。

单元测试的代码通常放在xxx_unittest.cc里面,用于测试一些功能比较独立,耦合比较少的代码。但是对于一些耦合比较重的业务逻辑,单元测试则无能为力

本文主要介绍的是针对浏览器主进程业务进行测试的browser tests,它其实是一种扩展的单元测试。它运行在浏览器的主进程里面,好处是直接可以访问浏览器里面的对象,方便调试和操作。

它有好几个独立的测试可以执行文件:

  • browser_tests,测试chrome层浏览器主进程的逻辑。
  • interactive_ui_tests,交互式的UI测试
  • components_browsertests,测试components层浏览器主进程的逻辑。
  • content_browsertests,测试content层浏览器主进程的逻辑。
  • extensions_browsertests,测试extensions层浏览器主进程的逻辑。

最常见还是执行browser_tests

browser tests的代码通常放在_browsertest.cc里面。不同于单元测试,创建一个browser tests用的是IN_PROC_BROWSER_TEST_F宏。一般需要先定义一个继承自InProcessBrowserTest的测试fixture类,用于初始化和清理浏览器的测试环境。

browser tests在一些模块目录的test目录里面还提供了很多有用的测试基础设施。比如内置的网络服务器EmbeddedTestServer用户测试网络方面的功能比较方便。还提供了一些接口的test实现,比如TestBrowserWindow,TestingBrowserProcess,还有一些mock类URLRequestMockHTTPJob等等。

chromium已经提供的这些用于测试的基础设施综合起来使用,可以满足大部分场景。要想写好完善充分的测试用例,有时候不得不重构我们的代码,一开始我们写业务代码的时候,就要有可测试的思想,提供一些测试控制接口。

此外还可以利用FRIEND_TEST_ALL_PREFIXES宏,让测试代码可以访问业务类的私有方法和数据。

参考