Chromium Chronicle #4:使用 WPT 测试您的网络平台功能

第 4 集:作者:Robert in Waterloo,安大略省(2019 年 7 月)
上一集

如果您处理 Blink,您可能知道 web_tests(以前称为 LayoutTests)。web-platform-tests (WPT) 位于 web_test/external/wpt 中。WPT 是测试 Web 公开功能的首选方法,因为它通过 GitHub 与其他浏览器共享。它具有两种主要的测试类型:refteststestharness.js 测试。

reftests 会截取并比较两个网页的屏幕截图。默认情况下,系统会在 load 事件触发后截取屏幕截图;如果您将 reftest-wait 类添加到 <html> 元素,系统会在移除该类后截取屏幕截图。停用的测试意味着测试覆盖率降低。请注意与字体相关的不稳定;尽可能使用 Ahem 字体。

testharness.js 是一个 JavaScript 框架,用于测试除呈现之外的任何内容。编写 testharness.js 测试时,请注意计时,并记得清理全局状态

不稳定的超时和潜在的泄露状态:

错误做法
<script>
promise_test(async t => {
  assert_equals(await slowLocalStorageTest(), "expected", "message");
  localStorage.clear();
});
</script>

使用较长的超时和清理性能更佳:

正确做法
<meta name="timeout" content="long">
<script>
promise_test(async t => {
  t.add_cleanup(() => localStorage.clear());
  assert_equals(await slowLocalStorageTest(), "expected", "message");
});
</script>

如果您需要在网站上无法使用自动化功能,请使用 testdriver.js。 您可以通过 test_driver.bless 获取用户手势,使用 test_driver.action_sequence 生成复杂的可信输入,等等。

WPT 还通过文件名提供一些实用的服务器端功能。 多全局测试(.any.js 及其对应项)在不同作用域(windowworker 等)中运行相同的测试;.https.sub.html 要求通过 HTTPS 加载测试,并提供服务器端替换支持,如下所示:

var anotherOrigin = "https://&#123;&#123;hosts[][www1]}}:&#123;&#123;ports[https][0]}}/path/to/page.html";

部分功能也可以在查询字符串中启用。 baz.html?pipe=sub|header(X-Key,val)|trickle(d1) 支持替换,在响应的标头中添加 X-Key: val,并在响应前延迟 1 秒。如需了解详情,请访问 web-platform-tests.org,搜索“pipes”。

WPT 还可以测试尚未包含在规范中的行为;只需将测试命名为 .tentative 即可。如果您需要 Blink 内部 API(例如 testRunnerinternals),请将测试放在 web_tests/wpt_internal 中。

对 WPT 所做的更改会自动导出到 GitHub。您将在 CL 中看到聊天机器人的评论。系统还会不断导入来自其他供应商的 GitHub 更改。如需在导入新故障时收到自动提交的 bug,请在 WPT 的子目录中创建一个 OWNERS 文件:

# TEAM: your-team@chromium.org
# COMPONENT: Blink>YourComponent
# WPT-NOTIFY: true
emails-here-will-be-cc@chromium.org

其他资源

  • 想要了解您的测试如何在其他浏览器上运行,以及您的功能的互操作性如何?使用 wpt.fyi
  • 想要查找有关 API、指南、示例、提示等内容的更多文档? 访问 web-platform-tests.org