blob: c4da79c0d8a4832c690fd64cffdebb8da4c23869 [file] [view] [edit]
# Writing Tests
If you haven't already, it's strongly recommended to read
the [introduction](../index) first, as it introduces the various test types.
There's also a load of [general guidelines](general-guidelines) that apply to all tests.
```eval_rst
.. toctree::
:maxdepth: 1
general-guidelines
ahem
assumptions
css-metadata
css-user-styles
file-names
h2tests
lint-tool
manual
reftest-tutorial
reftests
rendering
server-features
submission-process
testdriver
testdriver-tutorial
testharness
tools
visual
wdspec
test-templates
github-intro
```
## Test Type
Tests in this project use a few different approaches to verify expected
behavior. The tests can be classified based on the way they express
expectations:
* Rendering tests should be used to verify that the browser graphically
displays pages as expected. See the [rendering test guidelines][rendering]
for tips on how to write great rendering tests. There are a few different
ways to write rendering tests:
* [Reftests](reftests) should be used to test rendering and layout. They
consist of two or more pages with assertions as to whether they render
identically or not.
* [Visual tests](visual) should be used for checking rendering where there is
a large number of conforming renderings such that reftests are impractical.
They consist of a page that renders to final state at which point a
screenshot can be taken and compared to an expected rendering for that user
agent on that platform.
* [testharness.js](testharness) tests should be used (where possible!) for
testing everything else. They are built with the testharness.js unit testing
framework, and consist of assertions written in JavaScript.
* [wdspec](wdspec) tests are written in Python using
[pytest](https://docs.pytest.org/en/latest/) and test [the WebDriver browser
automation protocol](https://w3c.github.io/webdriver/)
* [Manual tests](manual) are used as a last resort for anything that can't be
tested using any of the above. They consist of a page that needs manual
interaction or verification of the final result.
In general, there is a strong preference towards reftests and testharness.js
tests types (as they can be easily run without human interaction), so they
should be used in preference to the others even if it results in a
somewhat cumbersome test; there is a far weaker preference between the
two test types, and it is at times advisable to use testharness.js tests
for things which would typically be tested using reftests but for
which it would be overly cumbersome.
See [file names](file-names) for test types and features determined by the file names,
and [server features](server-features) for advanced testing features.
## Submitting Tests
Once you've written tests, please submit them using
the [typical GitHub Pull Request workflow](submission-process); please
make sure you run the [`lint` script](lint-tool) before opening a pull request!