Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: docs/testing/writing_layout_tests.md

Issue 2492733003: New documentation on writing LayoutTests. (Closed)
Patch Set: Addressed most of foolip's feedback. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « docs/testing/layout_tests.md ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Writing Layout Tests
2
3 _Layout tests_ is a bit of a misnomer. This term is
4 [a part of our WebKit heritage](https://webkit.org/blog/1452/layout-tests-theory /),
5 and we use it to refer to every test that is written as a Web page (HTML, SVG,
6 or XHTML) and lives in
7 [third_party/WebKit/LayoutTests/](../../third_party/WebKit/LayoutTests).
8
9 [TOC]
10
11 ## Overview
12
13 Layout tests should be used to accomplish one of the following goals:
14
15 1. The entire surface of Blink that is exposed to the Web should be covered by
16 tests that we contribute to the
17 [Web Platform Tests Project](https://github.com/w3c/web-platform-tests)
18 (WPT). This helps us avoid regressions, and helps us identify Web Platform
19 areas where the major browsers don't have interoperable implementations.
20 2. When a Blink feature cannot be tested using the Web Platform, and cannot be
21 easily covered by
22 [C++ unit tests](https://cs.chromium.org/chromium/src/third_party/WebKit/Sour ce/web/tests/?q=webframetest&sq=package:chromium&type=cs),
23 the feature must be covered by layout tests, to avoid unexpected regressions.
24 These tests will use Blink-specific testing APIs that are only available in
25 [content_shell](./layout_tests_in_content_shell.md).
26
27 ### Test Types
28
29 There are three broad types of layout tests, listed in the order of preference.
30
31 * *JavaScript Tests* are the layout test implementation of
32 [xUnit tests](https://en.wikipedia.org/wiki/XUnit). These tests contain
33 assertions written in JavaScript, and pass if the assertions evaluate to
34 true.
35 * *Reference Tests* render a test page and a reference page, and pass if the two
36 renderings are identical, according to a pixel-by-pixel comparison. These
37 tests are less robust, harder to debug, and significantly slower than
38 JavaScript tests, and are only used when JavaScript tests are insufficient,
39 such as when testing layout code.
40 * *Pixel Tests* render a test page and compare the result against a pre-rendered
41 image in the repository. Pixel tests are less robust than JavaScript tests and
42 reference tests, because the rendering of a page is influenced by many factors
43 such as the host computer's graphics card and driver, the platform's text
44 rendering system, and various user-configurable operating system settings.
45 For this reason, it is not uncommon for a pixel test to have a different
46 reference image for each platform that Blink is tested on. Pixel tests are
47 least preferred, because the reference images are
48 [quite cumbersome to manage](./layout_test_expectations.md).
49
50 ## General Principles
51
52 The principles below are adapted from
53 [Test the Web Forward's Test Format Guidelines](http://testthewebforward.org/doc s/test-format-guidelines.html)
54 and
55 [WebKit's Wiki page on Writing good test cases](https://trac.webkit.org/wiki/Wri ting%20Layout%20Tests%20for%20DumpRenderTree).
56
57 * Tests should be as **short** as possible. The page should only include
58 elements that are necessary and relevant to what is being tested.
59
60 * Tests should be as **fast** as possible. Blink has several thousand layout
61 tests that are run in parallel, and avoiding unnecessary delays is crucial to
62 keeping our Commit Queue in good shape.
63 * Avoid [window.setTimeout](https://developer.mozilla.org/en-US/docs/Web/API /WindowTimers/setTimeout),
64 as it wastes time on the testing infrastructure. Instead, use specific
65 event handlers, such as
66 [window.onload](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEve ntHandlers/onload),
67 to decide when to proceed with a test.
68
69 * Tests should be **reliable** and yield consistent results for a given
70 implementation. Flaky tests slow down fellow developers' debugging efforts and
71 the Commit Queue.
72 * `window.setTimeout` is again a primary offender here. Asides from wasting
73 time on a fast system, tests that rely on fixed timeouts can fail when run
74 on systems that are slower than expected.
75 * Follow the guidelines in this
76 [PSA on writing reliable layout tests](https://docs.google.com/document/d/ 1Yl4SnTLBWmY1O99_BTtQvuoffP8YM9HZx2YPkEsaduQ/edit).
77
78 * Tests should be **self-describing**, so that a project member can recognize
79 whether a test passes or fails without having to read the specification of the
80 feature being tested. `testharness.js` makes a test self-describing when used
81 correctly, but tests that degrade to manual tests
82 [must be carefully designed](http://testthewebforward.org/docs/test-style-guid elines.html)
83 to be self-describing.
84
85 * Tests should use the **minimal** set of platform features needed to express
86 the test scenario efficiently.
87 * Avoid depending on edge case behavior of features that aren't explicitly
88 covered by the test. For example, except where testing parsing, tests
89 should contain valid markup (no parsing errors).
90 * Prefer JavaScript's
91 [===](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operator s/Comparison_Operators#Identity_strict_equality_())
92 operator to
93 [==](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators /Comparison_Operators#Equality_())
94 so that readers don't have to reason about
95 [type conversion](http://www.ecma-international.org/ecma-262/6.0/#sec-abst ract-equality-comparison).
96
97 * Tests should be as **cross-platform** as reasonably possible. Avoid
98 assumptions about device type, screen resolution, etc. Unavoidable assumptions
99 should be documented.
100 * When possible, tests should only use Web platform features, as specified
101 in the relevant standards.
102 * Test pages should use the HTML5 doctype (`<!doctype html>`) unless they
103 are testing the quirks mode.
104 * Tests should be written under the assumption that they will be upstreamed
105 to the WPT project. For example, tests should follow the
106 [WPT guidelines](http://testthewebforward.org/docs/writing-tests.html).
107 * Tests that use Blink-specific testing APIs should feature-test for the
108 presence of the testing APIs and degrade to
109 [manual tests](http://testthewebforward.org/docs/manual-test.html)
110 when the testing APIs are not present.
111
112 * Tests must be **self-contained** and not depend on external network resources.
113 Unless used by multiple test files, CSS and JavaScript should be inlined using
114 `<style>` and `<script>` tags. Content shared by multiple tests should be
115 placed in a `resources/` directory near the tests that share it. See below for
116 using multiple origins in a test.
117
118 * Test **file names** should describe what is being tested. File names should
119 use `snake-case`, but preserve the case of any embedded API names. For
120 example, prefer `document-createElement.html` to
121 `document-create-element.html`.
122
123 * Tests should prefer **modern features** in JavaScript and in the Web Platform.
124 * JavaScript code should prefer
125 [const](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statem ents/const)
126 and
127 [let](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statemen ts/let)
128 over `var`, prefer
129 [classes](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Clas ses)
130 over other OOP constructs, and prefer
131 [Promises](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Glo bal_Objects/Promise)
132 over other mechanisms for structuring asynchronous code.
133 * The desire to use modern features must be balanced with the desire for
134 cross-platform tests. Avoid using features that haven't shipped by other
135 current major rendering engines (WebKit, Gecko, Edge). When unsure, check
136 [caniuse.com](http://caniuse.com/).
137
138 * Tests must use the UTF-8 **character encoding**, which should be declared by
139 `<meta charset=utf-8>`. This does not apply when specifically testing
140 encodings.
141
142 * Tests must aim to have a **coding style** that is consistent with
143 [Google's JavaScript Style Guide](https://google.github.io/styleguide/javascri ptguide.xml),
144 and
145 [Google's HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssgui de.xml),
146 with the following exceptions.
147 * Rules related to Google Closure and JSDoc do not apply.
148 * Modern Web Platform and JavaScript features should be preferred to legacy
149 constructs that target old browsers. For example, prefer `const` and `let`
150 to `var`, and prefer `class` over other OOP constructs. This should be
151 balanced with the desire to have cross-platform tests.
152 * Concerns regarding buggy behavior in legacy browsers do not apply. For
153 example, the garbage collection cycle note in the _Closures_ section does
154 not apply.
155 * Per the JavaScript guide, new tests should also follow any per-project
156 style guide, such as the
157 [ServiceWorker Tests Style guide](http://www.chromium.org/blink/servicewor ker/testing).
158
159 ## JavaScript Tests
160
161 Whenever possible, the testing criteria should be expressed in JavaScript. The
162 alternatives, which will be described in future sections, result in slower and
163 less robust tests.
164
165 All new JavaScript tests should be written using the
166 [testharness.js](https://github.com/w3c/testharness.js/) testing framework. This
167 framework is used by the tests in the
168 [web-platform-tests](https://github.com/w3c/web-platform-tests) repository,
169 which is shared with all the other browser vendors, so `testharness.js` tests
170 are more accessible to browser developers.
171
172 As a shared framework, `testharness.js` enjoys high-quality documentation, such
173 as [a tutorial](http://testthewebforward.org/docs/testharness-tutorial.html) and
174 [API documentation](https://github.com/w3c/testharness.js/blob/master/docs/api.m d).
175 Layout tests should follow the recommendations of the above documents.
176 Furthermore, layout tests should include relevant
177 [metadata](http://testthewebforward.org/docs/css-metadata.html). The
178 specification URL (in `<link rel="help">`) is almost always relevant, and is
179 incredibly helpful to a developer who needs to understand the test quickly.
180
181 Below is a skeleton for a JavaScript test embedded in an HTML page. Note that,
182 in order to follow the minimality guideline, the test omits the tags `<html>`,
183 `<head>` and `<body>`, as they can be inferred by the HTML parser.
184
185 ```html
186 <!doctype html>
187 <meta charset="utf-8">
188 <title>JavaScript: the true literal</title>
189 <link rel="help" href="https://tc39.github.io/ecma262/#sec-boolean-literals">
190 <meta name="assert" value="The true literal is equal to itself and immutable">
191 <script src="/resources/testharness.js"></script>
192 <script src="/resources/testharnessreport.js"></script>
193 <script>
194
195 // Synchronous test example.
196 test(() => {
197 const value = true;
198 assert_true(value, 'true literal');
199 assert_equal(!value, false, 'the logical negtion of true');
foolip 2016/11/18 11:30:40 I guess assert_false here, since you'll have a cha
pwnall 2016/11/22 20:32:55 I changed the assertion to assert_equals(value.toS
foolip 2016/11/23 09:23:59 Thanks, that looks good!
200 }, 'The literal true in a synchronous test case');
201
202 // Asynchronous test example.
203 async_test(t => {
204 const originallyTrue = true;
205 setTimeout(t.step_func_done(() => {
206 const value = true;
207 assert_true(originallyTrue);
foolip 2016/11/18 11:30:40 assert_equals(value, orginallyTrue), or maybe the
pwnall 2016/11/22 20:32:55 Thanks for noticing! I remove the value variable a
208 }), 0);
209 }, 'The literal true in a setTimeout callback');
210
211 // Promise test example.
212 promise_test(() => {
213 return new Promise((resolve, reject) => {
214 resolve(true);
215 }).then(value => {
216 assert_true(value);
217 });
218 }, 'The literal true used to resolve a Promise');
219
220 </script>
221 ```
222
223 Some points that are not immediately obvious from the example:
224
225 * The `<meta name="assert">` describes the purpose of the entire file, and
226 is not redundant to `<title>`. Don't add a `<meta name="assert">` when the
227 information in the `<title>` is sufficient.
228 * When calling an `assert_` function that compares two values, the first
229 argument is the actual value (produced by the functionality being tested), and
230 the second argument is the expected value (known good, golden). The order
231 is important, because the testing harness relies on it to generate expressive
232 error messages that are relied upon when debugging test failures.
233 * The assertion description (the string argument to `assert_` methods) conveys
234 the way the actual value was obtained.
235 * If the expected value doesn't make it clear, the assertion description
236 should explain the desired behavior.
237 * Test cases with a single assertion should omit the assertion's description
238 when it is sufficiently clear.
239 * Each test case describes the circumstance that it tests, without being
240 redundant.
241 * Do not start test case descriptions with redundant terms like "Testing "
foolip 2016/11/18 11:30:40 This whole block is great! Nit here is extra space
pwnall 2016/11/22 20:32:55 Done. Thank you for catching this! Totally my faul
242 or "Test for".
243 * Test files with a single test case should omit the test case description.
244 The file's `<title>` should be sufficient to describe the scenario being
245 tested.
246 * Asynchronous tests have a few subtleties.
247 * The `async_test` wrapper calls its function with a test case argument that
248 is used to signal when the test case is done, and to connect assertion
249 failures to the correct test.
250 * `t.done()` must be called after all the test case's assertions have
251 executed.
252 * Test case assertions must be wrapped in `t.step_func()` calls, so that
foolip 2016/11/18 11:30:40 Callbacks that don't have assertions but could pla
pwnall 2016/11/22 20:32:55 Good point! I amended the description.
253 assertion failures can be connected to the correct test case.
254 * `t.step_func_done()` is a shortcut that combines `t.step_func()` with a
255 `t.done()` call.
256
257 *** promo
258 Layout tests that load from `file://` origins must currently use relative paths
259 to point to
260 [/resources/testharness.js](../../third_party/WebKit/LayoutTests/resources/testh arness.js)
261 and
262 [/resources/testharnessreport.js](../../third_party/WebKit/LayoutTests/resources /testharnessreport.js).
263 This is contrary to the WPT guidelines, which call for absolute paths.
264 This limitation does not apply to the tests in `LayoutTests/http`, which rely on
265 an HTTP server, or to the tests in `LayoutTests/imported/wpt`, which are
266 imported from the [WPT repository](https://github.com/w3c/web-platform-tests).
267 ***
268
269
270 ### Relying on Blink-Specific Testing APIs
271
272 Tests that cannot be expressed using the Web Platform APIs rely on
273 Blink-specific testing APIs. These APIs are only available in
274 [content_shell](./layout_tests_in_content_shell.md).
275
276 ### Manual Tests
277
278 Whenever possible, tests that rely on Blink-specific testing APIs should also be
279 usable as [manual tests](http://testthewebforward.org/docs/manual-test.html).
280 This makes it easy to debug the test, and to check whether our behavior matches
281 other browsers.
282
283 Manual tests should minimize the chance of user error. This implies keeping the
284 manual steps to a minimum, and having simple and clear instructions that
285 describe all the configuration changes and user gestures that match the effect
286 of the Blink-specific APIs used by the test.
287
288 Below is an example of a fairly minimal test that uses a Blink-Specific API
289 (`window.eventSender`), and gracefully degrades to a manual test.
290
291 ```html
292 <!doctype html>
293 <meta charset="utf-8">
294 <title>DOM: Event.isTrusted for UI events</title>
295 <link rel="help" href="https://dom.spec.whatwg.org/#dom-event-istrusted">
296 <link rel="help" href="https://dom.spec.whatwg.org/#constructing-events">
297 <meta name="assert"
298 content="Event.isTrusted is true for events generated by user interaction">
299 <script src="../../resources/testharness.js"></script>
300 <script src="../../resources/testharnessreport.js"></script>
301
302 <p>Please click on the button below.</p>
303 <button>Click Me!</button>
304
305 <script>
306
307 setup({ explicit_timeout: true });
308
309 promise_test(() => {
310 const button = document.querySelector('button');
311 return new Promise((resolve, reject) => {
312 const button = document.querySelector('button');
313 button.addEventListener('click', (event) => {
314 clickEvent = event;
315 resolve(event);
316 });
317
318 if (window.eventSender) {
319 eventSender.mouseMoveTo(button.offsetLeft, button.offsetTop);
320 eventSender.mouseDown();
321 eventSender.mouseUp();
322 }
323 }).then((clickEvent) => {
324 assert_true(clickEvent.isTrusted);
325 });
326
327 }, 'Click generated by user interaction');
328
329 </script>
330 ```
331
332 The test exhibits the following desirable features:
333
334 * It has a second specification URL (`<link rel="help">`), because the paragraph
335 that documents the tested feature (referenced by the primary URL) is not very
336 informative on its own.
337 * It links to the
338 [WHATWG Living Standard](https://wiki.whatwg.org/wiki/FAQ#What_does_.22Living_ Standard.22_mean.3F),
339 rather than to a frozen version of the specification.
340 * It documents its assertions clearly.
341 * The `<meta name="assert">` describes the purpose of the entire file.
342 However, don't add a `<meta>` when the information in the `<title>` is
343 sufficient.
344 * The `assert_equals` string describes the way the actual value was
foolip 2016/11/18 11:30:40 The above test doesn't have assert_equals any more
pwnall 2016/11/22 20:32:54 Done. This block was duplicated (and then edited)
345 obtained. If the expected value doesn't make it clear, the assertion
346 description should explain the desired behavior.
347 * Each test case describes the circumstance that it tests.
348 * It contains clear instructions for manually triggering the test conditions.
349 The test starts with a paragraph (`<p>`) that tells the tester exactly what to
350 do, and the `<button>` that needs to be clicked is clearly labeled.
351 * It disables the timeout mechanism built into `testharness.js` by calling
352 `setup({ explicit_timeout: true });`
353 * It checks for the presence of the Blink-specific testing APIs
354 (`window.eventSender`) before invoking them. The test does not automatically
355 fail when the APIs are not present.
356 * It uses [Promises](https://developer.mozilla.org/docs/Web/JavaScript/Reference /Global_Objects/Promise)
357 to separate the test setup from the assertions. This is particularly helpful
358 for manual tests that depend on a sequence of events to occur, as Promises
359 offer a composable way to express waiting for asynchronous events that avoids
360 [callback hell](http://stackabuse.com/avoiding-callback-hell-in-node-js/).
361
362 Notice that the test is pretty heavy compared to a minimal JavaScript test that
363 does not rely on testing APIs. Only use Blink-specific testing APIs when the
364 desired testing conditions cannot be set up using Web Platform APIs.
365
366 #### Using Blink-Specific Testing APIs
367
368 A downside of Blink-specific APIs is that they are not as well documented as the
369 Web Platform features. Learning to use a Blink-specific feature requires finding
370 other tests that use it, or reading its source code.
371
372 For example, the most popular Blink-specific API is `testRunner`, which is
373 implemented in
374 [components/test_runner/test_runner.h](../../components/test_runner/test_runner. h)
375 and
376 [components/test_runner/test_runner.cpp](../../components/test_runner/test_runne r.cpp).
377 By skimming the `TestRunnerBindings::Install` method, we learn that the
378 testRunner API is presented by the `window.testRunner` and
379 `window.layoutTestsController` objects, which are synonyms. Reading the
380 `TestRunnerBindings::GetObjectTemplateBuilder` method tells us what properties
381 are available on the `window.testRunner` object.
382
383 *** aside
384 `window.testRunner` is the preferred way to access the `testRunner` APIs.
385 `window.layoutTestsController` is still supported because it is used by
386 3rd-party tests.
387 ***
388
389 *** note
390 `testRunner` is the most popular testing API because it is also used indirectly
391 by tests that stick to Web Platform APIs. The `testharnessreport.js` file in
392 `testharness.js` is specifically designated to hold glue code that connects
393 `testharness.js` to the testing environment. Our implementation is in
394 [third_party/WebKit/LayoutTests/resources/testharnessreport.js](../../third_part y/WebKit/LayoutTests/resources/testharnessreport.js),
395 and uses the `testRunner` API.
396 ***
397
398 See the [components/test_runner/](../../components/test_runner/) directory and
399 [WebKit's LayoutTests guide](https://trac.webkit.org/wiki/Writing%20Layout%20Tes ts%20for%20DumpRenderTree)
400 for other useful APIs. For example, `window.eventSender`
401 ([components/test_runner/event_sender.h](../../components/test_runner/event_send er.h)
402 and
403 [components/test_runner/event_sender.cpp](../../components/test_runner/event_sen der.cpp))
404 has methods that simulate events input such as keyboard / mouse input and
405 drag-and-drop.
406
407 Here is a UML diagram of how the `testRunner` bindings fit into Chromium.
408
409 [![UML of testRunner bindings configuring platform implementation](https://docs. google.com/drawings/u/1/d/1KNRNjlxK0Q3Tp8rKxuuM5mpWf4OJQZmvm9_kpwu_Wwg/export/sv g?id=1KNRNjlxK0Q3Tp8rKxuuM5mpWf4OJQZmvm9_kpwu_Wwg&pageid=p)](https://docs.google .com/drawings/d/1KNRNjlxK0Q3Tp8rKxuuM5mpWf4OJQZmvm9_kpwu_Wwg/edit)
410
411 ### Text Test Baselines
412
413 By default, all the test cases in a file that uses `testharness.js` are expected
414 to pass. However, in some cases, we prefer to add failing test cases to the
415 repository, so that we can be notified when the failure modes change (e.g., we
416 want to know if a test starts crashing rather than returning incorrect output).
417 In these situations, a test file will be accompanied by a baseline, which is an
418 `-expected.txt` file that contains the test's expected output.
419
420 The baselines are generated automatically when appropriate by
421 `run-webkit-tests`, which is described [here](./layout_tests.md), and by the
422 [rebaselining tools](./layout_test_expectations.md).
423
424 Text baselines for `testharness.js` should be avoided, as having a text baseline
425 associated with a `testharness.js` indicates the presence of a bug. For this
426 reason, CLs that add text baselines must include a
427 [crbug.com](https://crbug.com) link for an issue tracking the removal of the
428 text expectations.
429
430 * When creating tests that will be upstreamed to WPT, and Blink's current
431 behavior does not match the specification that is being tested, a text
432 baseline is necessary. Remember to create an issue tracking the expectation's
433 removal, and to link the issue in the CL description.
434 * Layout tests that cannot be upstreamed to WPT should use JavaScript to
435 document Blink's current behavior, rather than using JavaScript to document
436 desired behavior and a text file to document current behavior.
437
438
439 ### The js-test.js Legacy Harness
440
441 *** promo
442 For historical reasons, older tests are written using the `js-test` harness.
443 This harness is **deprecated**, and should not be used for new tests.
444 ***
445
446 If you need to understand old tests, the best `js-test` documentation is its
447 implementation at
448 [third_party/WebKit/LayoutTests/resources/js-test.js](../../third_party/WebKit/L ayoutTests/resources/js-test.js).
449
450 `js-test` tests lean heavily on the Blink-specific `testRunner` testing API.
451 In a nutshell, the tests call `testRunner.dumpAsText()` to signal that the page
452 content should be dumped and compared against a text baseline (an
453 `-expected.txt` file). As a consequence, `js-test` tests are always accompanied
454 by text baselines. Asynchronous tests also use `testRunner.waitUntilDone()` and
455 `testRunner.notifyDone()` to tell the testing tools when they are complete.
456
457 ### Tests that use an HTTP Server
458
459 By default, tests are loaded as if via `file:` URLs. Some web platform features
460 require tests served via HTTP or HTTPS, for example absolute paths (`src=/foo`)
461 or features restricted to secure protocols.
462
463 HTTP tests are those tests that are under `LayoutTests/http/tests` (or virtual
464 variants). Use a locally running HTTP server (Apache) to run them. Tests are
465 served off of ports 8000 and 8080 for HTTP, and 8443 for HTTPS. If you run the
466 tests using `run-webkit-tests`, the server will be started automatically. To run
467 the server manually to reproduce or debug a failure:
468
469 ```bash
470 cd src/third_party/WebKit/Tools/Scripts
471 run-blink-httpd start
472 ```
473
474 The layout tests will be served from `http://127.0.0.1:8000`. For example, to
475 run the test `http/tests/serviceworker/chromium/service-worker-allowed.html`,
476 navigate to
477 `http://127.0.0.1:8000/serviceworker/chromium/service-worker-allowed.html`. Some
478 tests will behave differently if you go to 127.0.0.1 instead of localhost, so
479 use 127.0.0.1.
480
481 To kill the server, run `run-blink-httpd --server stop`, or just use `taskkill`
482 or the Task Manager on Windows, and `killall` or Activity Monitor on MacOS.
483
484 The test server sets up an alias to `LayoutTests/resources` directory. In HTTP
485 tests, you can access the testing framework at e.g.
486 `src="/js-test-resources/js-test.js"`.
487
488 TODO: Document [wptserve](http://wptserve.readthedocs.io/) when we are in a
489 position to use it to run layout tests.
490
491 ## Reference Tests
492
493 *** promo
494 In the long term, we intend to express reference tests as
495 [WPT reftests](http://testthewebforward.org/docs/reftests.html). Currently,
496 Chromium's testing infrastructure does not support WPT reftests. In the
foolip 2016/11/18 11:31:42 qyearsley@, I think this maybe doesn't quite captu
qyearsley 2016/11/18 18:02:08 Yeah, rather than saying that we "don't support WP
foolip 2016/11/21 09:45:02 Keeping -expected.html outside of WPT sounds good
pwnall 2016/11/22 20:32:55 In the spirit of writing tests that can be upstrea
foolip 2016/11/23 09:23:59 I think using just one model at a time is preferab
497 meantime, please use the legacy reference tests format described below.
498 ***
499
500 *** note
501 TODO: Summarize best practices for reftests and give examples.
502 ***
503
504 ### Legacy Reference Tests
505
506 Blink also has inherited a sizable amount of
507 [reftests](https://trac.webkit.org/wiki/Writing%20Reftests) from WebKit. In
508 these tests, the reference page file name is based on the test page's file name
509 and an `-expected.html` suffix.
qyearsley 2016/11/18 18:02:08 Not sure if it's worth mentioning that it's also p
foolip 2016/11/21 09:45:02 +1, this can be powerful, and the first time I wan
pwnall 2016/11/22 20:32:54 Thank you very much for explaining all this! It is
510
511 ## Pixel Tests
512
513 `testRunner` APIs such as `window.testRunner.dumpAsTextWithPixelResults()` and
514 `window.testRunner.dumpDragImage()` create an image result that is associated
515 with the test. The image result is compared against an image baseline, which is
516 an `-expected.png` file associated with the test, and the test passes if the
517 image result is identical to the baseline, according to a pixel-by-pixel
518 comparison. Tests that have image results (and baselines) are called **pixel
519 tests**.
520
521 Pixel tests should still follow the principles laid out above. Pixel tests pose
522 unique challenges to the desire to have *self-describing* and *cross-platform*
523 tests. The
524 [WPT test style guidelines](http://testthewebforward.org/docs/test-style-guideli nes.html)
525 contain useful guidance. The most relevant pieces of advice are below.
526
527 * use a green paragraph / page / square to indicate success
528 * use the red color or the word `FAIL` to highlight errors
529 * use the [Ahem font](https://www.w3.org/Style/CSS/Test/Fonts/Ahem/README) to
530 minimize the variance introduced by the platform's text rendering system
531
532 The following snippet includes the Ahem font in a layout test.
533
534 ```html
535 <style>
536 body {
537 font: 10px Ahem;
538 }
539 </style>
540 <script src="/resources/ahem.js"></script>
541 ```
542
543 *** promo
544 Tests outside `LayoutTests/http` and `LayoutTests/imported/wpt` currently need
545 to use a relative path to
546 [/third_party/WebKit/LayoutTests/resources/ahem.js](../../third_party/WebKit/Lay outTests/resources/ahem.js)
547 ***
548
549 ### Tests that need to paint, raster, or draw a frame of intermediate output
550
551 A layout test does not actually draw frames of output until the test exits. If
552 it is required to generate a painted frame, then use
553 `window.testRunner.displayAsyncThen`, which will run the machinery to put up a
554 frame, then call the passed callback. There is also a library at
555 `fast/repaint/resources/text-based-repaint.js` to help with writing paint
556 invalidation and repaint tests.
557
558 ## Directory Structure
559
560 The [LayoutTests directory](../../third_party/WebKit/LayoutTests) currently
561 lacks a strict, formal structure. The following directories have special
562 meaning:
563
564 * The `http/` directory hosts tests that require a HTTP server (see above).
565 * The `resources/` subdirectory in every directory contains binary files, such
566 as media files, and code that is shared by multiple test files.
567
568 *** note
569 Some layout tests consist of a minimal HTML page that references a JavaScript
570 file in `resources/`. Please do not use this pattern for new tests, as it goes
571 against the minimality principle. JavaScript and CSS files should only live in
572 `resources/` if they are shared by at least two test files.
573 ***
OLDNEW
« no previous file with comments | « docs/testing/layout_tests.md ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698