Chromium Chronicle #4: протестируйте возможности своей веб-платформы с помощью WPT

Эпизод 4: Роберт в Ватерлоо, Онтарио (июль 2019 г.)
Предыдущие серии

Если вы работаете над Blink, возможно, вы знаете о web_tests (ранее LayoutTests). web-platform-tests (WPT) находится внутри web_test/external/wpt . WPT — предпочтительный способ тестирования функций, доступных в Интернете, поскольку он доступен другим браузерам через GitHub. Он имеет два основных типа тестов: рефтесты и тесты testharness.js .

рефтесты берут и сравнивают скриншоты двух страниц. По умолчанию снимки экрана создаются после запуска события 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 и его друзья) запускают одни и те же тесты в разных областях ( window , worker и т. д.); .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 секунду перед ответом. Чтобы узнать больше, выполните поиск по запросу «pipe» на сайте web-platform-tests.org .

WPT также может тестировать поведение, которое еще не включено в спецификации; просто назовите тест как .tentative . Если вам нужны внутренние API Blink (например testRunner , internals ), поместите свои тесты в web_tests/wpt_internal .

Изменения, внесенные в WPT, автоматически экспортируются в GitHub. Вы увидите комментарии бота в своем ЛК. Изменения GitHub от других поставщиков также постоянно импортируются. Чтобы получать автоматически зарегистрированные ошибки при импорте новых сбоев, создайте файл OWNERS в подкаталоге WPT:

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

Дополнительные ресурсы

  • Хотите узнать, как ваши тесты выполняются в других браузерах и насколько совместима ваша функция? Используйте wpt.fyi .
  • Ищете дополнительную документацию по API, рекомендации, примеры, советы и многое другое? Посетите веб-платформу-tests.org .