| For [Resource Timing][1] tests, we want to have a consistent and clear coding | |
| style. The goals of this style are to: | |
| * Make it easier for new contributors to find their way around | |
| * Help improve readability and maintainability | |
| * Help us understand which parts of the spec are tested or not | |
| Lots of the following rules are arbitrary but the value is realized in | |
| consistency instead of adhering to the 'perfect' style. | |
| We want the test suite to be navigable. Developers should be able to easily | |
| find the file or test that is relevant to their work. | |
| * Tests should be arranged in files according to which piece of the spec they | |
| test | |
| * Files should be named using a consistent pattern | |
| * HTML files should include useful meta tags | |
| * `<title>` for controlling labels in results pages | |
| * `<link rel="help">` to point at the relevant piece of the spec | |
| We want the test suite to run consistently. Flaky tests are counterproductive. | |
| * Prefer `promise_test` to `async_test` | |
| * Note that there’s [still potential for some concurrency][2]; use | |
| `add_cleanup()` if needed | |
| We want the tests to be readable. Tests should be written in a modern style | |
| with recurring patterns. | |
| * 80 character line limits where we can | |
| * Consistent use of anonymous functions | |
| * prefer | |
| ``` | |
| const func1 = param1 => { | |
| body(); | |
| } | |
| const func2 = (param1, param2) => { | |
| body(); | |
| } | |
| fn(param => { | |
| body(); | |
| }); | |
| ``` | |
| over | |
| ``` | |
| function func1(param1) { | |
| body(); | |
| } | |
| function func2(param1, param2) { | |
| body(); | |
| } | |
| fn(function(param) { | |
| body(); | |
| }); | |
| ``` | |
| * Prefer `const` (or, if needed, `let`) to `var` | |
| * Contain use of ‘.sub’ in filenames to known helper utilities where possible | |
| * E.g. prefer use of get-host-info.sub.js to `{{host}}` or `{{ports[0]}}` | |
| expressions | |
| * Avoid use of webperftestharness[extension].js as it’s a layer of cognitive | |
| overhead between test content and test intent | |
| * Helper .js files are still encouraged where it makes sense but we want | |
| to avoid a testing framework that is specific to Resource Timing (or | |
| web performance APIs, in general). | |
| * Prefer [`fetch_tests_from_window`][3] to collect test results from embedded | |
| iframes instead of hand-rolled `postMessage` approaches | |
| * Use the [`assert_*`][4] family of functions to check conformance to the spec | |
| but throw exceptions explicitly when the test itself is broken. | |
| * A failed assert indicates "the implementation doesn't conform to the | |
| spec" | |
| * Other uncaught exceptions indicate "the test case itself has a bug" | |
| * Where possible, we want tests to be scalable - adding another test case | |
| should be as simple as calling the tests with new parameters, rather than | |
| copying an existing test and modifying it. | |
| [1]: https://www.w3.org/TR/resource-timing-2/ | |
| [2]: https://web-platform-tests.org/writing-tests/testharness-api.html#promise-tests | |
| [3]: https://web-platform-tests.org/writing-tests/testharness-api.html#consolidating-tests-from-other-documents | |
| [4]: https://web-platform-tests.org/writing-tests/testharness-api.html#list-of-assertions |