Chromium Chronicle #4: przetestuj funkcje platformy internetowej dzięki WPT

Odcinek 4: Robert in Waterloo, W dniu (lipiec 2019 r.)
Poprzednie odcinki

Jeśli pracujesz nad Blink, być może znasz np. web_tests (dawniej UkładTests). web-platform-tests (WPT) znajduje się w obrębie web_test/external/wpt. WPT to preferowany sposób testowania funkcji internetowych, ponieważ są one udostępniane innym przeglądarkom przez GitHuba. Zawiera 2 główne typy testów: testy reftests i testharness.js.

reftesty wykonują i porównują zrzuty ekranu dwóch stron. Domyślnie zrzuty ekranu są wykonywane po wywołaniu zdarzenia load. Jeśli dodasz do elementu <html> klasę reftest-wait, zrzut ekranu zostanie wykonany po usunięciu klasy. Wyłączone testy oznaczają zmniejszenie zasięgu testów. Pamiętaj o niestabilności czcionki. W miarę możliwości używaj czcionki Ahem.

testharness.js to platforma JavaScript do testowania wszystkiego poza renderowaniem. Pisząc testy testharness.js, zwracaj uwagę na czas i pamiętaj o wyczyszczeniu stanu globalnego.

Niestabilny czas oczekiwania i potencjalne wycieki:

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

Lepszy test z długim czasem oczekiwania i czyszczeniem:

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

Jeśli potrzebujesz automatyzacji, która w innym przypadku nie jest dostępna w internecie, użyj pliku testdriver.js. Możesz wykonać gest użytkownika z funkcji test_driver.bless i generować złożone, zaufane dane wejściowe za pomocą test_driver.action_sequence itp.

WPT udostępnia też przydatne funkcje działające po stronie serwera w postaci nazw plików. Testy wieloglobalne (.any.js i jego znajomi) przeprowadzają te same testy w różnych zakresach (window, worker itp.); .https.sub.html prosi, aby test był wczytywany przez HTTPS z obsługą zastępowania po stronie serwera w ten sposób:

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

Niektóre funkcje można też włączyć w ciągach zapytań. baz.html?pipe=sub|header(X-Key,val)|trickle(d1) umożliwia zastępowanie, dodaje element X-Key: val do nagłówków odpowiedzi i opóźnia 1 sekundę przed udzieleniem odpowiedzi. Aby dowiedzieć się więcej, wyszukaj „potoki” na stronie web-platform-tests.org.

WPT może też testować zachowania, które nie są jeszcze uwzględnione w specyfikacji. Test po prostu nazywa się .tentative. Jeśli potrzebujesz wewnętrznych interfejsów API Blink (np. testRunner, internals), umieść testy w web_tests/wpt_internal.

Zmiany wprowadzone w WPT są automatycznie eksportowane do GitHuba. Na liście zmian zobaczysz komentarze od bota. Zmiany w GitHubie od innych dostawców również są importowane na bieżąco. Aby otrzymywać automatycznie zgłaszane błędy po zaimportowaniu nowych błędów, utwórz plik OWNERS w podkatalogu w WPT:

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

Dodatkowe materiały

  • Chcesz dowiedzieć się, jak przebiegają testy w innych przeglądarkach i jak współdziałają ze sobą Twoje funkcje? Użyj ciągu wpt.fyi.
  • Szukasz dodatkowej dokumentacji interfejsów API, wytycznych, przykładów, wskazówek i innych informacji? Wejdź na stronę web-platform-tests.org.