Chromium Chronicle n.o 4: Prueba las funciones de tu plataforma web con WPT

Episodio 4: de Robert en Waterloo, ON (julio de 2019)
Episodios anteriores

Si trabajas en Blink, es posible que conozcas web_tests (antes LayoutTests). web-platform-tests (WPT) se encuentra dentro de web_test/external/wpt. WPT es la forma preferida de probar las funciones expuestas en la Web, ya que se comparte con otros navegadores a través de GitHub. Tiene dos tipos principales de pruebas: reftests y testharness.js.

reftests toma y compara capturas de pantalla de dos páginas. De forma predeterminada, las capturas de pantalla se toman después de que se activa el evento load. Si agregas una clase reftest-wait al elemento <html>, se tomará la captura de pantalla cuando se quite la clase. Si inhabilitas las pruebas, la cobertura disminuirá. Ten en cuenta la fragilidad relacionada con la fuente; usa la fuente Ahem cuando sea posible.

testharness.js es un framework de JavaScript para probar cualquier cosa, excepto la renderización. Cuando escribas pruebas testharness.js, presta atención a los tiempos y recuerda limpiar el estado global.

Tiempo de espera inestable y posibles estados de filtración:

Qué no debes hacer
<script>
promise_test(async t => {
  assert_equals(await slowLocalStorageTest(), "expected", "message");
  localStorage.clear();
});
</script>

Una prueba mejor con tiempo de espera y limpieza prolongados:

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

Usa testdriver.js si necesitas que la automatización no esté disponible en la Web. Puedes obtener un gesto del usuario desde test_driver.bless, generar entradas complejas y confiables con test_driver.action_sequence, etcétera.

WPT también proporciona algunas funciones útiles del servidor mediante nombres de archivos. Las pruebas multiglobal (.any.js y sus amigos) ejecutan las mismas pruebas en diferentes alcances (window, worker, etc.); .https.sub.html solicita que la prueba se cargue a través de HTTPS con compatibilidad de sustitución del servidor como se muestra a continuación:

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

Algunas funciones también se pueden habilitar en las cadenas de consulta. baz.html?pipe=sub|header(X-Key,val)|trickle(d1) habilita la sustitución, agrega X-Key: val a los encabezados de la respuesta y retrasa 1 segundo antes de responder. Busca “canales” en web-platform-tests.org para obtener más información.

WPT puede probar comportamientos que aún no se incluyen en las especificaciones; solo asigna el nombre .tentative a la prueba. Si necesitas las APIs internas de Blink (p.ej., testRunner y internals), coloca tus pruebas en web_tests/wpt_internal.

Los cambios realizados a WPT se exportan automáticamente a GitHub. Verás los comentarios de un bot en tu CL. Los cambios de GitHub de otros proveedores también se importan de forma continua. Para recibir errores presentados automáticamente cuando se importan fallas nuevas, crea un archivo OWNERS en un subdirectorio en WPT:

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

Recursos adicionales

  • ¿Quieres saber cómo se ejecutan las pruebas en otros navegadores y qué tan interoperable es tu función? Usa wpt.fyi.
  • ¿Buscas más documentación sobre APIs, lineamientos, ejemplos, sugerencias y mucho más? Visita web-platform-tests.org.