# On disabling tests
Sometimes you don't want to run a test that you've written (or that
you've imported, like conformance tests). The test might not be possible to
run in a particular configuration, or be temporarily broken by another
change, or be flaky, or simply not work yet. In these cases (and perhaps others),
you should disable the test :).
There are a number of different ways to do so:
* If the test is an entire binary or test suite, the first (and
simplest) way is to simply not build (or build, but not run)
the test binary, of course. This makes sense for binaries that
are specific to particular build configurations (e.g., Android JUnit
tests don't need to be built on Windows).
* A second way (for tests in C++) is to not compile a test in a
given configuration, e.g., `#ifndef WIN`. In this situation, the only
way you would know the test existed and was disabled would be to
parse the source code. We often do this today for tests that will
never be enabled in particular build configurations, but sometimes we do
this to temporarily skip tests as well.
* A third way is to take advantage of features in your testing framework to
skip over tests. Examples include involve adding `DISABLED_` to the test
method name for GTest-based tests, `@unittest.skip` for Python-based tests,
or using the
[DisabledTest](../../base/test/android/javatests/src/org/chromium/base/test/DisabledTest.java)
annotation for JUnit-based Java tests (this works in both instrumentation
and Robolectric tests). In these cases, you don't run the test by default,
but you can determine the list of disabled tests at runtime because the
tests are present in the executable, and you may still be able to force the
test to be run via a command-line flag.
* Fourth, for test frameworks that support
[expectations files or filter files](https://bit.ly/chromium-test-list-format),
you can use them to decide what to run and what to skip. This moves
the mechanisms out of the source code and into separate files; there are
advantages and disadvantages to this. The main advantage is that it
can make it easier to write tooling to disable tests, and the main
disadvantage is that it moves the mechanism away from the code it affects,
potentially making it harder to understand what's going on.
* Finally, the test harness can run the test, but the test itself
might detect at runtime that it should exit early for some reason
rather than actually executing the code paths you'd normally want to
test. For example, if you have a test for some code path that requires
a GPU, but there's no GPU on the machine, the test might check for a
GPU and exit early with "success".
If you want to be able to determine a global picture of which tests
were disabled, you can either parse BUILD files, expectations and filter
files, and source code to try and figure that out, or require the tests be
present in test binaries (i.e., not compiled out) and then run the test
binaries in order to collect the lists of disabled tests and report them
to a central system.
Parsing code can be straightforward for some types of tests, but
difficult-to-impractical to do correctly for others.