359 lines
17 KiB
ReStructuredText
359 lines
17 KiB
ReStructuredText
Automated Testing
|
|
=================
|
|
|
|
You've just written a feature and (hopefully!) want to test it. Or you've
|
|
decided that an existing feature doesn't have enough tests and want to contribute
|
|
some. But where do you start? You've looked around and found references to things
|
|
like "xpcshell" or "web-platform-tests" or "talos". What code, features or
|
|
platforms do they all test? Where do their feature sets overlap? In short, where
|
|
should your new tests go? This document is a starting point for those who want
|
|
to start to learn about Mozilla's automated testing tools and procedures. Below
|
|
you'll find a short summary of each framework we use, and some questions to help
|
|
you pick the framework(s) you need for your purposes.
|
|
|
|
If you still have questions, ask on `Matrix <https://wiki.mozilla.org/Matrix>`__
|
|
or on the relevant bug.
|
|
|
|
Firefox Production
|
|
------------------
|
|
These tests are found within the `mozilla-central <https://hg.mozilla.org/mozilla-central>`__
|
|
tree, along with the product code.
|
|
|
|
They are run when a changeset is pushed
|
|
to `mozilla-central <https://hg.mozilla.org/mozilla-central>`__,
|
|
`autoland <https://hg.mozilla.org/integration/autoland/>`__, or
|
|
`try </tools/try/index.html>`_, with the results showing up on
|
|
`Treeherder <https://treeherder.mozilla.org/>`__. Not all tests will be run on
|
|
every changeset; alogrithms are put in place to run the most likely failures,
|
|
with all tests being run on a regular basis.
|
|
|
|
They can also be run on local builds.
|
|
Note: Most of the mobile tests run on emulators, but some of the tests
|
|
(notably, performance tests) run on hardware devices.
|
|
We try to avoid running mobile tests on hardware devices unnecessarily.
|
|
In Treeherder, tests with names that start with "hw-" run on hardware.
|
|
|
|
Linting
|
|
~~~~~~~
|
|
|
|
Lint tests help to ensure better quality, less error-prone code by
|
|
analysing the code with a linter.
|
|
|
|
|
|
.. csv-table:: Linters
|
|
:header-rows: 1
|
|
|
|
"Treeherder Symbol", "Name", "Platforms", "What is Tested"
|
|
"``ES``", "`ESLint </code-quality/lint/linters/eslint.html>`__", "All", "JavaScript is analyzed for correctness."
|
|
"``ES-build``", "`eslint-build </code-quality/lint/linters/eslint.html#eslint-build-es-b>`_", "All", "Extended javascript analysis that uses build artifacts."
|
|
"``mocha(EPM)``", "`ESLint-plugin-mozilla </code-quality/lint/linters/eslint-plugin-mozilla.html>`__", "Desktop", "The ESLint plugin rules."
|
|
"``f8``", "`flake8 </code-quality/lint/linters/flake8.html>`__", "All", "Python analyzed for style and correctness."
|
|
"``stylelint``", "`Stylelint </code-quality/lint/linters/stylelint.html>`__", "All", "CSS is analyzed for correctness."
|
|
"``W``", "`wpt lint </web-platform/index.html>`__", "Desktop", "web-platform-tests analyzed for style and manifest correctness"
|
|
"``WR(tidy)``", "`WebRender servo-tidy </testing/webrender/index.html>`__", "Desktop", "Code in gfx/wr is run through servo-tidy."
|
|
"``A``", "`Spotless </code-quality/lint/linters/android-format.html>`_", "Android", "Java is analyzed for style and correctness."
|
|
|
|
.. _Functional_testing:
|
|
|
|
Functional testing
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
.. csv-table:: Automated Test Suites
|
|
:header-rows: 2
|
|
|
|
"Treeherder Symbol", "Name", "Platform", "Process", "Environment", "", "Privilege", "What is Tested"
|
|
"", "", "", "", "Shell", "Browser Profile", "",
|
|
"``R(J)``", "JS Reftest", "Desktop", "N/A", "JSShell", "N/A", "N/A", "The JavaScript engine's implementation of the JavaScript language."
|
|
"``R(C)``", "`Crashtest </web-platform/index.html>`__", "All", "Child", "Content", "Yes", "Low", "That pages load without crashing, asserting, or leaking."
|
|
"``R(R)``", "`Reftest </web-platform/index.html>`__", "All", "Child", "Content", "Yes", "Low", "That pages are rendered (and thus also layed out) correctly."
|
|
"``GTest``", "`GTest </gtest/index.html>`__", "All", "N/A", "Terminal", "N/A", "N/A", "Code that is not exposed to JavaScript."
|
|
"``X``", "`xpcshell </testing/xpcshell/index.html>`__", "All", "Parent, Allow", "XPCShell", "Allow", "High", "Low-level code exposed to JavaScript, such as XPCOM components."
|
|
"``M(a11y)``", "Accessibility (mochitest-a11y)", "Desktop", "Child", "Content", "Yes", "?", "Accessibility interfaces."
|
|
"``M(1), M(2), M(...)``", "`Mochitest plain </testing/mochitest-plain/index.html>`__", "All", "Child", "Content", "Yes", "Low, Allow", "Features exposed to JavaScript in web content, like DOM and other Web APIs, where the APIs do not require elevated permissions to test."
|
|
"``M(c1/c2/c3)``", "`Mochitest chrome </testing/chrome-tests/index.html>`__", "All", "Child, Allow", "Content", "Yes", "High", "Code requiring UI or JavaScript interactions with privileged objects."
|
|
"``M(bc)``", "`Mochitest browser-chrome </testing/mochitest-plain/index.html>`__", "All", "Parent, Allow", "Browser", "Yes", "High", "How the browser UI interacts with itself and with content."
|
|
"``M(remote)``", "Mochitest Remote Protocol", "All", "Parent, Allow", "Browser", "Yes", "High", "Firefox Remote Protocol (Implements parts of Chrome dev-tools protocol). Based on Mochitest browser-chrome."
|
|
"``SM(...), SM(pkg)``", "`SpiderMonkey automation <https://wiki.mozilla.org/Javascript:Automation_Builds>`__", "Desktop", "N/A", "JSShell", "N/A", "Low", "SpiderMonkey engine shell tests and JSAPI tests."
|
|
"``W``", "`web-platform-tests </web-platform/index.html>`__", "Desktop", "Child", "Content", "Yes", "Low", "Standardized features exposed to ECMAScript in web content; tests are shared with other vendors."
|
|
"``Wr``", "`web-platform-tests <https://web-platform-tests.org/writing-tests/reftests.html>`__", "All", "Child", "Content", "Yes", "Low", "Layout and graphic correctness for standardized features; tests are shared with other vendors."
|
|
"``Mn``", "`Marionette </testing/marionette/Testing.html>`__", "Desktop", "?", "Content, Browser", "?", "High", "Large out-of-process function integration tests and tests that do communication with multiple remote Gecko processes."
|
|
"``Fxfn``", "`Firefox UI Tests </remote/Testing.html#puppeteer-tests>`__", "Desktop", "?", "Content, Browser", "Yes", "High", "Integration tests with a focus on the user interface and localization."
|
|
"``tt(c)``", "`telemetry-tests-client </toolkit/components/telemetry/internals/tests.html>`__", "Desktop", "N/A", "Content, Browser", "Yes", "High", "Integration tests for the Firefox Telemetry client."
|
|
"``TV``", "`Test Verification (test-verify) </testing/test-verification/index.html>`__", "All", "Depends on test harness", "?", "?", "?", "Uses other test harnesses - mochitest, reftest, xpcshell - to perform extra testing on new/modified tests."
|
|
"``TVw``", "`Test Verification for wpt (test-verify-wpt) </testing/test-verification/index.html>`__", "Desktop", "Child", "?", "?", "?", "Uses wpt test harnesses to perform extra testing on new/modified web-platform tests."
|
|
"``WR(wrench)``", "`WebRender standalone tests </testing/webrender/index.html>`__", "All", "N/A", "Terminal", "N/A", "N/A", "WebRender rust code (as a standalone module, with Gecko integration)."
|
|
|
|
Note: there are preference-based variations of the previous testing suites.
|
|
For example, mochitests on Treeherder can have ``gli``, ``swr``, ``spi``,
|
|
``nofis``, ``a11y-checks``, ``spi-nw-1proc``, and many others. Another
|
|
example is GTest, which can use ``GTest-1proc``. To learn more about
|
|
these variations, you can mouse hover over these items to read a
|
|
description of what these abbreviations mean.
|
|
|
|
.. _Table_key:
|
|
|
|
Table key
|
|
^^^^^^^^^
|
|
|
|
Symbol
|
|
Abbreviation for the test suite used by
|
|
`Treeherder <https://treeherder.mozilla.org/>`__. The first letter
|
|
generally indicates which of the test harnesses is used to execute
|
|
the test. The letter in parentheses identifies the actual test suite.
|
|
Name
|
|
Common name used when referring to the test suite.
|
|
Platform
|
|
Most test suites are supported only on a subset of the available
|
|
plaforms and operating systems. Unless otherwise noted:
|
|
|
|
- **Desktop** tests run on Windows, Mac OS X, and Linux.
|
|
- **Mobile** tests run on Android emulators or remotely on Android
|
|
devices.
|
|
|
|
Process
|
|
- When **Parent** is indicated, the test file will always run in the
|
|
parent process, even when the browser is running in Electrolysis
|
|
(e10s) mode.
|
|
- When **Child** is indicated, the test file will run in the child
|
|
process when the browser is running in Electrolysis (e10s) mode.
|
|
- The **Allow** label indicates that the test has access to
|
|
mechanisms to run code in the other process.
|
|
|
|
Environment
|
|
- The **JSShell** and **XPCShell** environments are limited
|
|
JavaScript execution environments with no windows or user
|
|
interface (note however that XPCShell tests on Android are run
|
|
within a browser window.)
|
|
- The **Content** indication means that the test is run inside a
|
|
content page loaded by a browser window.
|
|
- The **Browser** indication means that the test is loaded in the
|
|
JavaScript context of a browser XUL window.
|
|
- The **Browser Profile** column indicates whether a browser profile
|
|
is loaded when the test starts. The **Allow** label means that the
|
|
test can optionally load a profile using a special command.
|
|
|
|
Privilege
|
|
Indicates whether the tests normally run with low (content) or high
|
|
(chrome) JavaScript privileges. The **Allow** label means that the
|
|
test can optionally run code in a privileged environment using a
|
|
special command.
|
|
|
|
.. _Performance_testing:
|
|
|
|
Performance testing
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
There are many test harnesses used to test performance.
|
|
`For more information on the various performance harnesses,
|
|
check out the perf docs. </testing/perfdocs>`_
|
|
|
|
|
|
.. _So_which_should_I_use:
|
|
|
|
So which should I use?
|
|
----------------------
|
|
|
|
Generally, you should pick the lowest-level framework that you can. If
|
|
you are testing JavaScript but don't need a window, use XPCShell or even
|
|
JSShell. If you're testing page layout, try to use
|
|
`web-platform-test reftest.
|
|
<https://web-platform-tests.org/writing-tests/reftests.html>`_
|
|
The advantage in lower level testing is that you don't drag in a lot of
|
|
other components that might have their own problems, so you can home in
|
|
quickly on any bugs in what you are specifically testing.
|
|
|
|
Here's a series of questions to ask about your work when you want to
|
|
write some tests.
|
|
|
|
.. _Is_it_low-level_code:
|
|
|
|
Is it low-level code?
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If the functionality is exposed to JavaScript, and you don't need a
|
|
window, consider `XPCShell </testing/xpcshell/index.html>`__. If not,
|
|
you'll probably have to use `GTest </gtest/index.html>`__, which can
|
|
test pretty much anything. In general, this should be your
|
|
last option for a new test, unless you have to test something that is
|
|
not exposed to JavaScript.
|
|
|
|
.. _Does_it_cause_a_crash:
|
|
|
|
Does it cause a crash?
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If you've found pages that crash Firefox, add a
|
|
`crashtest </web-platform/index.html>`__ to
|
|
make sure future versions don't experience this crash (assertion or
|
|
leak) again. Note that this may lead to more tests once the core
|
|
problem is found.
|
|
|
|
.. _Is_it_a_layoutgraphics_feature:
|
|
|
|
Is it a layout/graphics feature?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
`Reftest </layout/Reftest.html#writing-tests>`__ is your best bet, if possible.
|
|
|
|
.. _Do_you_need_to_verify_performance:
|
|
|
|
Do you need to verify performance?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
`Use an appropriate performance test suite from this list </testing/perfdocs>`_.
|
|
|
|
.. _Are_you_testing_UI_features:
|
|
|
|
Are you testing UI features?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Try one of the flavors of
|
|
`mochitest </testing/mochitest-plain/index.html>`__, or
|
|
`Marionette </docs/Marionette>`__ if the application also needs to be
|
|
restarted, or tested with localized builds.
|
|
|
|
.. _Are_you_testing_MobileAndroid:
|
|
|
|
Are you testing Mobile/Android?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If you are testing GeckoView, you will need to need to use
|
|
`JUnit integration tests
|
|
</mobile/android/geckoview/contributor/junit.html#testing-overview>`__.
|
|
|
|
There are some specific features that
|
|
`Mochitest </testing/mochitest-plain/index.html>`__ or
|
|
`Reftest </layout/Reftest.html>`__ can cover. Browser-chrome tests do not run on
|
|
Android. If you want to test performance, `Raptor </testing/perfdocs/raptor.html>`__ will
|
|
be a good choice.
|
|
|
|
|
|
.. _Are_you_doing_none_of_the_above:
|
|
|
|
Are you doing none of the above?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
- To get your tests running in continuous integration, try
|
|
`web-platform-tests </web-platform/index.html>`_, or
|
|
`Mochitest </testing/mochitest-plain/index.html>`__, or,
|
|
if higher privileges are required, try
|
|
`Mochitest browser chrome tests </testing/mochitest-plain/index.html>`__.
|
|
- For Desktop Firefox, or if you just want to see the future of Gecko
|
|
testing, look into the on-going
|
|
`Marionette </testing/marionette/Testing.html#harness-tests>`__ project.
|
|
|
|
.. _Need_to_get_more_data_out_of_your_tests:
|
|
|
|
Need to get more data out of your tests?
|
|
----------------------------------------
|
|
|
|
Most test jobs now expose an environment variable named
|
|
``MOZ_UPLOAD_DIR``. If this variable is set during automated test runs,
|
|
you can drop additional files into this directory, and they will be
|
|
uploaded to a web server when the test finishes. The URLs to retrieve
|
|
the files will be output in the test log.
|
|
|
|
Passing ``MOZ_RECORD_TEST=1`` as an environment variable when running some
|
|
tests (e.g. mochitests) on Linux Desktop and macOS will trigger a recording of the
|
|
desktop with GNOME Screencast. This works on try as well, in which case the video
|
|
file will be uploaded as an artifact and available in the
|
|
``Artifacts and Debugging Tools`` panel on Treeherder.
|
|
|
|
For browser chrome mochitests, passing ``MOZ_DEVTOOLS_TEST_SCOPES=1`` as an
|
|
environment variable will record all variables and arguments available in
|
|
the scope of the test when any assert fails. On try, each failed assert will generate
|
|
a JSON file named `scope-variables-[...].json` which will be uploaded as a
|
|
test artifact. When using the feature locally, set MOZ_UPLOAD_DIR to a local
|
|
folder where the JSON files should be saved. Note that Firefox opens JSON files
|
|
with the built-in DevTools JSON viewer.
|
|
|
|
.. _Need_to_set_preferences_for_test-suites:
|
|
|
|
Need to set preferences for test-suites?
|
|
----------------------------------------
|
|
|
|
First ask yourself if these prefs need to be enabled for all tests or
|
|
just a subset of tests (e.g to enable a feature).
|
|
|
|
.. _Setting_prefs_that_only_apply_to_certain_tests:
|
|
|
|
Setting prefs that only apply to certain tests
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If the answer is the latter, try to set the pref as local to the tests
|
|
that need it as possible. Here are some options:
|
|
|
|
- If the test runs in chrome scope (e.g mochitest chrome or
|
|
browser-chrome), you can use
|
|
`Services.prefs
|
|
<https://searchfox.org/mozilla-central/source/modules/libpref/nsIPrefBranch.idl>`__
|
|
to set the prefs in your test's setup function. Be sure to reset the
|
|
pref back to its original value during teardown!
|
|
|
|
- Mochitest plain tests can use
|
|
`SpecialPowers
|
|
</testing/mochitest-plain/faq.html#what-if-i-need-to-change-a-preference-to-run-my-test>`__
|
|
to set prefs.
|
|
|
|
- All variants of mochitest can set prefs in their manifests. For
|
|
example, to set a pref for all tests in a manifest:
|
|
|
|
::
|
|
|
|
[DEFAULT]
|
|
prefs =
|
|
my.awesome.pref=foo,
|
|
my.other.awesome.pref=bar,
|
|
[test_foo.js]
|
|
[test_bar.js]
|
|
|
|
- All variants of reftest can also set prefs in their
|
|
`manifests </layout/Reftest.html>`__.
|
|
|
|
- All variants of web-platform-tests can also `set prefs in their
|
|
manifests </web-platform/index.html#enabling-prefs>`__.
|
|
|
|
.. _Setting_prefs_that_apply_to_the_entire_suite:
|
|
|
|
Setting prefs that apply to the entire suite
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Most test suites define prefs in user.js files that live under
|
|
`testing/profiles
|
|
<https://searchfox.org/mozilla-central/source/testing/profiles>`__.
|
|
Each directory is a profile that contains a ``user.js`` file with a
|
|
number of prefs defined in it. Test suites will then merge one or more
|
|
of these basic profiles into their own profile at runtime. To see which
|
|
profiles apply to which test suites, you can inspect
|
|
`testing/profiles/profiles.json
|
|
<https://searchfox.org/mozilla-central/source/testing/profiles/profiles.json>`__.
|
|
Profiles at the beginning of the list get overridden by profiles at the
|
|
end of the list.
|
|
|
|
Because this system makes it hard to get an overall view of which
|
|
profiles are set for any given test suite, a handy ``profile`` utility
|
|
was created:
|
|
|
|
::
|
|
|
|
$ cd testing/profiles
|
|
$ ./profile -- --help
|
|
usage: profile [-h] {diff,sort,show,rm} ...
|
|
$ ./profile show mochitest # prints all prefs that will be set in mochitest
|
|
$ ./profile diff mochitest reftest # prints differences between the mochitest and reftest suites
|
|
|
|
.. container:: blockIndicator note
|
|
|
|
**Note:** JS engine tests do not use testing/profiles yet, instead
|
|
`set prefs
|
|
here <https://searchfox.org/mozilla-central/source/js/src/tests/user.js>`__.
|
|
|
|
Adding New Context to Skip Conditions
|
|
-------------------------------------
|
|
|
|
Often when standing up new test configurations, it's necessary to add new keys
|
|
that can be used in ``skip-if`` annotations.
|
|
|
|
.. toctree::
|
|
|
|
manifest-sandbox
|