mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			348 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			348 lines
		
	
	
	
		
			16 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 </web-platform/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.
 | 
						|
File type
 | 
						|
   When adding a new test, you will generally create a file of this type
 | 
						|
   in the source tree and then declare it in a manifest or makefile.
 | 
						|
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.
 | 
						|
 | 
						|
.. _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
 | 
						|
   <https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Mochitest/SpecialPowers>`__
 | 
						|
   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
 |