Each package may include a configuration file that applies to the package as a
whole. This file can be used to provide custom defaults for various options, to
define configuration for multiple files, and more.

The file is named `dart_test.yaml` and lives at the root of the package, next to
the package's pubspec. Like the pubspec, it's a [YAML][] file. Here's an
example:

[YAML]: http://yaml.org/

```yaml
# This package's tests are very slow. Double the default timeout.
timeout: 2x

# This is a browser-only package, so test on chrome by default.
platforms: [chrome]

tags:
  # Integration tests are even slower, so increase the timeout again.
  integration: {timeout: 2x}

  # Sanity tests are quick and verify that nothing is obviously wrong. Declaring
  # the tag allows us to tag tests with it without getting warnings.
  sanity:
```

* [Test Configuration](#test-configuration)
  * [`timeout`](#timeout)
  * [`ignore-timeouts`](#ignore-timeouts)
  * [`verbose_trace`](#verbose_trace)
  * [`chain_stack_traces`](#chain_stack_traces)
  * [`js_trace`](#js_trace)
  * [`skip`](#skip)
  * [`retry`](#retry)
  * [`test_on`](#test_on)
  * [`allow_test_randomization`](#allow_test_randomization)
  * [`allow_duplicate_test_names`](#allow_duplicate_test_names)
* [Runner Configuration](#runner-configuration)
  * [`include`](#include)
  * [`paths`](#paths)
  * [`filename`](#filename)
  * [`names`](#names)
  * [`plain_names`](#plain_names)
  * [`include_tags`](#include_tags)
  * [`exclude_tags`](#exclude_tags)
  * [`platforms`](#platforms)
  * [`concurrency`](#concurrency)
  * [`pause_after_load`](#pause_after_load)
  * [`run_skipped`](#run_skipped)
  * [`pub_serve`](#pub_serve)
  * [`reporter`](#reporter)
  * [`file_reporters`](#file_reporters)
  * [`fold_stack_frames`](#fold_stack_frames)
  * [`custom_html_template_path`](#custom_html_template_path)
* [Configuring Tags](#configuring-tags)
  * [`tags`](#tags)
  * [`add_tags`](#add_tags)
* [Configuring Platforms](#configuring-platforms)
  * [`on_os`](#on_os)
  * [`on_platform`](#on_platform)
  * [`override_platforms`](#override_platforms)
  * [`define_platforms`](#define_platforms)
  * [Browser and Node.js Settings](#browser-and-nodejs-settings)
    * [`arguments`](#arguments)
    * [`executable`](#executable)
    * [`headless`](#headless)
* [Configuration Presets](#configuration-presets)
  * [`presets`](#presets)
  * [`add_presets`](#add_presets)
* [Global Configuration](#global-configuration)

## Test Configuration

There are two major categories of configuration field: "test" and "runner". Test
configuration controls how individual tests run, while
[runner configuration](#runner-configuration) controls the test runner as a
whole. Both types of fields may be used at the top level of a configuration
file. However, because different tests can have different test configuration,
only test configuration fields may be used to [configure tags](#tags) or
[platforms](#on_platform).

### `timeout`

This field indicates how much time the test runner should allow a test to remain
inactive before it considers that test to have failed. It has three possible
formats:

* The string "none" indicates that tests should never time out.

* A number followed by a unit abbreviation indicates an exact time. For example,
  "1m" means a timeout of one minute, and "30s" means a timeout of thirty
  seconds. Multiple numbers can be combined, as in "1m 30s".

* A number followed by "x" indicates a multiple. This is applied to the default
  value of 30s.

```yaml
timeout: 1m
```

###  `ignore-timeouts`

This field disables all timeouts for all tests. This can be useful when debugging, so tests don't time out during debug sessions. It defaults to `false`.

```yaml
ignore-timeouts: true
```

### `verbose_trace`

This boolean field controls whether or not stack traces caused by errors are
trimmed to remove internal stack frames. This includes frames from the Dart core
libraries, the [`stack_trace`][stack_trace] package, and the `test` package
itself. It defaults to `false`.

[stack_trace]: https://pub.dev/packages/stack_trace

```yaml
verbose_trace: true
```

### `chain_stack_traces`

This boolean field controls whether or not stack traces are chained.
Disabling [`stack trace chaining`][stack trace chaining] will improve
performance for heavily asynchronous code at the cost of debuggability.

[stack trace chaining]: https://github.com/dart-lang/stack_trace/blob/master/README.md#stack-chains

```yaml
chain_stack_traces: false
```

### `js_trace`

This boolean field controls whether or not stack traces caused by errors that
occur while running Dart compiled to JS are converted back to Dart style. This
conversion uses the source map generated by `dart2js` to approximate the
original Dart line, column, and in some cases member name for each stack frame.
It defaults to `false`.

```yaml
js_trace: true
```

### `skip`

This field controls whether or not tests are skipped. It's usually applied to
[specific tags](#configuring-tags) rather than used at the top level. Like the
`skip` parameter for [`test()`][test], it can either be a boolean indicating
whether the tests are skipped or a string indicating the reason they're skipped.

[test]: https://pub.dev/documentation/test_api/latest/test_api/test.html

```yaml
tags:
  chrome:
    skip: "Our Chrome launcher is busted. See issue 1234."
```

This field is not supported in the
[global configuration file](#global-configuration).

### `retry`

This int field controls how many times a test is retried upon failure.

```yaml
tags:
  chrome:
    retry: 3 # Retry chrome failures 3 times.
```

This field is not supported in the
[global configuration file](#global-configuration).

### `test_on`

This field declares which platforms a test supports. It takes a
[platform selector][platform selectors] and only allows tests to run on
platforms that match the selector. It's often used with
[specific tags](#configuring-tags) to ensure that certain features will only be
tested on supported platforms.

[platform selectors]: https://github.com/dart-lang/test/tree/master/pkgs/test#platform-selectors

```yaml
tags:
  # Internet Explorer doesn't support promises yet.
  promises: {test_on: "browser && !ie"}
```

The field can also be used at the top level of the configuration file to
indicate that the entire package only supports a particular platform. If someone
tries to run the tests on an unsupported platform, the runner will print a
warning and skip that platform.

```yaml
# This package uses dart:io.
test_on: vm
```

This field is not supported in the
[global configuration file](#global-configuration).

### `allow_test_randomization`

This can be used to disable test randomization for certain tests, regardless
of the `--test-randomize-ordering-seed` configuration.

This is typically useful when a subset of your tests are order dependent, but
you want to run the other ones with randomized ordering.

```yaml
tags:
  doNotRandomize:
    allow_test_randomization: false
```

### `allow_duplicate_test_names`

This can be used to allow multiple tests in the same suite to have the same
name. This is disabled by default because it is usually an indication of a
mistake, and it causes problems with IDE integrations which run tests by name.

It can be disabled for all tests:

```yaml
allow_duplicate_test_names: true
```

Or for tagged tests only (useful if migrating to enable this):

```yaml
tags:
  allowDuplicates:
    allow_duplicate_test_names: true
```

It cannot be globally enabled or configured on the command line - this would
make it so that tests might pass on one users machine but not anothers which
should be avoided.

## Runner Configuration

Unlike [test configuration](#test-configuration), runner configuration affects
the test runner as a whole rather than individual tests. It can only be used at
the top level of the configuration file.

### `include`

This field loads another configuration file. It's useful for repositories that
contain multiple packages and want to share configuration among them. It takes a
(usually relative) `file:` URL.

If you have a repository with the following structure:

```
repo/
  dart_test_base.yaml
  package/
    test/
    dart_test.yaml
    pubspec.yaml
```

```yaml
# repo/dart_test_base.yaml
filename: "test_*.dart"
```

```yaml
# repo/package/dart_test.yaml
include: ../dart_test_base.yaml
```

...tests in the `package` directory will use configuration from both
`dart_test_base.yaml` and `dart_test.yaml`.

The local configuration file's fields take precedence over those from an
included file, so it's possible to override a base configuration.

### `paths`

This field indicates the default paths that the test runner should run. These
paths are usually directories, although single filenames may be used as well.
Paths must be relative, and they must be in URL format so that they're
compatible across operating systems. This defaults to `[test]`.

```yaml
paths: [dart/test]

paths:
- test/instantaneous
- test/fast
- test/middling
```

This field is not supported in the
[global configuration file](#global-configuration).

### `filename`

This field indicates the filename pattern that the test runner uses to find test
files in directories. All files in directories passed on the command line (or in
directories in [`paths`](#paths), if none are passed) whose basenames match this
pattern will be loaded and run as tests.

This supports the full [glob syntax][]. However, since it's only compared
against a path's basename, path separators aren't especially useful. It defaults
to `"*_test.dart"`.

```yaml
filename: "test_*.dart"
```

[glob syntax]: https://github.com/dart-lang/glob#syntax

This field is not supported in the
[global configuration file](#global-configuration).

### `names`

This field causes the runner to only run tests whose names match the given
regular expressions. A test's name must match *all* regular expressions in
`names`, as well as containing all strings in [`plain_names`](#plain_names), in
order to be run.

This is usually used in a [preset](#configuration-presets) to make it possible
to quickly select a given set of tests.

```yaml
presets:
  # Pass "-P chrome" to run only Chrome tests.
  chrome:
    names:
    - "^browser:"
    - "[Cc]hrome"
```

This field is not supported in the
[global configuration file](#global-configuration).

### `plain_names`

This field causes the runner to only run tests whose names contain the given
strings. A test's name must contain *all* strings in `plain_names`, as well as
matching all regular expressions in [`names`](#names), in order to be run.

This is usually used in a [preset](#configuration-presets) to make it possible
to quickly select a given set of tests.

```yaml
presets:
  # Pass "-P ie" to run only Internet Explorer tests.
  ie:
    plain_names:
    - "IE"
    - "Internet Explorer"
```

This field is not supported in the
[global configuration file](#global-configuration).

### `include_tags`

This field causes the runner to only run tests whose tags match the given
[boolean selector][]. If both `include_tags` and [`exclude_tags`](#exclude_tags)
are used, the exclusions take precedence.

[boolean selector]: https://github.com/dart-lang/boolean_selector/blob/master/README.md

This is usually used in a [preset](#configuration-preset) to make it possible to
quickly select a set of tests.

```yaml
presets:
  # Pass "-P windowless" to run tests that don't open browser windows.
  windowless:
    include_tags: !browser || content-shell
```

This field is not supported in the
[global configuration file](#global-configuration).

### `exclude_tags`

This field causes the runner not to run tests whose tags match the given
[boolean selector][]. If both [`include_tags`](#include_tags) and `exclude_tags`
are used, the exclusions take precedence.

This is usually used in a [preset](#configuration-preset) to make it possible to
quickly select a set of tests.

```yaml
presets:
  # Pass "-P windowless" to run tests that don't open browser windows.
  windowless:
    exclude_tags: browser && !content-shell
```

This field is not supported in the
[global configuration file](#global-configuration).

### `platforms`

This field indicates which platforms tests should run on by default. It allows
the same platform identifiers that can be passed to `--platform`. If multiple
platforms are included, the test runner will default to running tests on all of
them. This defaults to `[vm]`.

```yaml
platforms: [chrome]

platforms:
- chrome
- firefox
```

### `compilers`

This field indicates which compilers tests should be compiled with by default.
It allows the same compiler selectors that can be passed to `--compiler`. If
a given platform has no supported compiler configured, it will use its default.

```yaml
compilers: [source]

compilers:
- source
```

### `concurrency`

This field indicates the default number of test suites to run in parallel. More
parallelism can improve the overall speed of running tests up to a point, but
eventually it just adds more memory overhead without any performance gain. This
defaults to approximately half the number of processors on the current machine.
If it's set to 1, only one test suite will run at a time.

```yaml
concurrency: 3
```

### `pause_after_load`

This field indicates that the test runner should pause for debugging after each
test suite is loaded but before its tests are executed. If it's set,
[`concurrency`](#concurrency) is automatically set to 1 and
[`timeout`](#timeout) is automatically set to `none`.

This is usually used in a [preset](#configuration-presets).

```yaml
presets:
  # Pass "-P debug" to enable debugging configuration
  debug:
    pause_after_load: true
    exclude_tags: undebuggable
    reporter: expanded
```

### `run_skipped`

This field indicates that the test runner should run tests even if they're
marked as skipped.

This is usually used in a [preset](#configuration-presets).

```yaml
presets:
  # Pass "-P all" to run all tests
  debug:
    run_skipped: true
    paths: ["test/", "extra_test/"]
```

### `pub_serve`

This field indicates that the test runner should run against a `pub serve`
instance by default, and provides the port number for that instance. Note that
if there is no `pub serve` instance running at that port, running the tests will
fail by default.

```yaml
pub_serve: 8081
```

### `reporter`

This field indicates the default reporter to use. It may be set to "compact",
"expanded", or "json" (although why anyone would want to default to JSON is
beyond me). It defaults to "expanded" on Windows and "compact" everywhere else.

```yaml
reporter: expanded
```

This field is not supported in the
[global configuration file](#global-configuration).

### `file_reporters`

This field specifies additional reporters to use that will write their output to
a file rather than stdout. It should be a map of reporter names to filepaths.

```yaml
file_reporters:
  json: reports/tests.json
```

This field is not supported in the
[global configuration file](#global-configuration).

### `fold_stack_frames`

This field controls which packages' stack frames will be folded away
when displaying stack traces. Packages contained in the `except`
option will be folded. If `only` is provided, all packages not
contained in this list will be folded. By default,
frames from the `test` package and the `stream_channel`
package are folded.

```yaml
fold_stack_frames:
  except:
  - test
  - stream_channel
```

Sample stack trace, note the absence of `package:test`
and `package:stream_channel`:
```
test/sample_test.dart 7:5   main.<fn>
===== asynchronous gap ===========================
dart:async                  _Completer.completeError
test/sample_test.dart 8:3   main.<fn>
===== asynchronous gap ===========================
dart:async                  _asyncThenWrapperHelper
test/sample_test.dart 5:27  main.<fn>
```

### `custom_html_template_path`

This field specifies the path of the HTML template file to be used for tests run in an HTML environment.
Any HTML file that is named the same as the test and in the same directory will take precedence over the template.
For more information about the usage of this option see [Providing a custom HTML template](https://github.com/dart-lang/test/blob/master/README.md#providing-a-custom-html-template)

## Configuring Tags

### `tags`

The `tag` field can be used to apply [test configuration](#test-configuration)
to all tests [with a given tag][tagging tests] or set of tags. It takes a map
from tag selectors to configuration maps. These configuration maps are just like
the top level of the configuration file, except that they may not contain
[runner configuration](#runner-configuration).

[tagging tests]: https://github.com/dart-lang/test/blob/master/README.md#tagging-tests

```yaml
tags:
  # Integration tests need more time to run.
  integration:
    timeout: 1m
```

Tags may also have no configuration associated with them. The test runner prints
a warning whenever it encounters a tag it doesn't recognize, and this the best
way to tell it that a tag exists.

```yaml
# We occasionally want to use --tags or --exclude-tags on these tags.
tags:
  # A test that spawns a browser.
  browser:

  # A test that needs Ruby installed.
  ruby:
```

You can also use [boolean selector syntax][] to define configuration that
involves multiple tags. For example:

[boolean selector syntax]: https://github.com/dart-lang/boolean_selector/blob/master/README.md

```yaml
tags:
  # Tests that invoke sub-processes tend to be a little slower.
  ruby || python:
    timeout: 1.5x
```

Tag configuration is applied at whatever level the tag appears—so if a group is
tagged as `integration`, its timeout will take precedence over the suite's
timeout but not any tests'. If the group itself had a timeout declared, the
group's explicit timeout would take precedence over the tag.

If multiple tags appear at the same level, and they have conflicting
configurations, the test runner *does not guarantee* what order they'll be
resolved in. In practice, conflicting configuration is pretty unlikely and it's
easy to just explicitly specify what you want on the test itself.

This field counts as [test configuration](#test-configuration). It is not
supported in the [global configuration file](#global-configuration).

### `add_tags`

This field adds additional tags. It's technically
[test configuration](#test-configuration), but it's usually used in more
specific contexts. For example, when included in a tag's configuration, it can
be used to enable tag inheritance, where adding one tag implicitly adds another
as well. It takes a list of tag name strings.

```yaml
tags:
  # Any test that spawns a browser.
  browser:
    timeout: 2x

  # Tests that spawn specific browsers. These automatically get the browser tag
  # as well.
  chrome: {add_tags: [browser]}
  firefox: {add_tags: [browser]}
  safari: {add_tags: [browser]}
  ie: {add_tags: [browser]}
```

This field is not supported in the
[global configuration file](#global-configuration).

## Configuring Platforms

There are two different kinds of platform configuration.
[Operating system configuration](#on_os) cares about the operating system on
which test runner is running. It sets global configuration for the runner on
particular OSes. [Test platform configuration](#on_platform), on the other hand,
cares about the platform the *test* is running on (like the
[`@OnPlatform` annotation][@OnPlatform]). It sets configuration for particular
tests that are running on matching platforms.

[@OnPlatform]: https://github.com/dart-lang/test/tree/master/pkgs/test#platform-specific-configuration

### `on_os`

This field applies configuration when specific operating systems are being used.
It takes a map from operating system identifiers (the same ones that are used in
[platform selectors][]) to configuration maps that are applied on those
operating systems. These configuration maps are just like the top level of the
configuration file, and allow any fields that may be used in the context where
`on_os` was used.

```yaml
on_os:
  windows:
    # Both of these are the defaults anyway, but let's be explicit about it.
    color: false
    runner: expanded

    # My Windows machine is real slow.
    timeout: 2x

  # My Linux machine has SO MUCH RAM.
  linux:
    concurrency: 500
```

This field counts as [test configuration](#test-configuration). If it's used in
a context that only allows test configuration, it may only contain test
configuration.

### `on_platform`

This field applies configuration to tests that are run on specific platforms. It
takes a map from [platform selectors][] to configuration maps that are applied
to tests run on those platforms. These configuration maps are just like the top
level of the configuration file, except that they may not contain
[runner configuration](#runner-configuration).

```yaml
# Our code is kind of slow on Blink and WebKit.
on_platform:
  chrome || safari: {timeout: 2x}
```

**Note**: operating system names that appear in `on_platform` refer to tests
that are run on the Dart VM under that operating system. To configure all tests
when running on a particular operating system, use [`on_os`](#on_os) instead.

This field counts as [test configuration](#test-configuration).

### `override_platforms`

This field allows you to customize the settings for built-in test platforms. It
takes a map from platform identifiers to settings for those platforms. For example:

```yaml
override_platforms:
  chrome:
    # The settings to override for this platform.
    settings:
      executable: chromium
```

This tells the test runner to use the `chromium` executable for Chrome tests. It
calls that executable with the same logic and flags it normally uses for Chrome.

Each platform can define exactly which settings it supports. All browsers and
Node.js support [the same settings](#browser-and-node-js-settings), but the VM
doesn't support any settings and so can't be overridden.

### `define_platforms`

You can define new platforms in terms of old ones using the `define_platforms`
field. This lets you define variants of existing platforms without overriding
the old ones. This field takes a map from the new platform identifiers to
definitions for those platforms. For example:

```yaml
define_platforms:
  # This identifier is used to select the platform with the --platform flag.
  chromium:
    # A human-friendly name for the platform.
    name: Chromium

    # The identifier for the platform that this is based on.
    extends: chrome

    # Settings for the new child platform.
    settings:
      executable: chromium
```

Once this is defined, you can run `dart test -p chromium` and it will run
those tests in the Chromium browser, using the same logic it normally uses for
Chrome. You can even use `chromium` in platform selectors; for example, you
might pass `testOn: "chromium"` to declare that a test is Chromium-specific.
User-defined platforms also count as their parents, so Chromium will run tests
that say `testOn: "chrome"` as well.

Each platform can define exactly which settings it supports. All browsers and
Node.js support [the same settings](#browser-and-node-js-settings), but the VM
doesn't support any settings and so can't be extended.

This field is not supported in the
[global configuration file](#global-configuration).

### Browser and Node.js Settings

All built-in browser platforms, as well as the built-in Node.js platform,
provide the same settings that can be set using
[`define_platforms`](#define_platforms), which control how their executables are
invoked.

#### `arguments`

The `arguments` field provides extra arguments to the executable. It takes a
string, and parses it in the same way as the POSIX shell:

```yaml
override_platforms:
  firefox:
    settings:
      arguments: -headless
```

#### `executable`

The `executable` field tells the test runner where to look for the executable to
use to start the subprocess. It has three sub-keys, one for each supported
operating system, which each take a path or an executable name:

```yaml
define_platforms:
  chromium:
    name: Chromium
    extends: chrome

    settings:
      executable:
        linux: chromium
        mac_os: /Applications/Chromium.app/Contents/MacOS/Chromium
        windows: Chromium\Application\chrome.exe
```

Executables can be defined in three ways:

* As a plain basename, with no path separators. These executables are passed
  directly to the OS, which looks them up using the `PATH` environment variable.

* As an absolute path, which is used as-is.

* **Only on Windows**, as a relative path. The test runner will look up this
  path relative to the `LOCALAPPATA`, `PROGRAMFILES`, and `PROGRAMFILES(X86)`
  environment variables, in that order.

If a platform is omitted, it defaults to using the built-in executable location.

As a shorthand, you can also define the same executable for all operating
systems:

```yaml
define_platforms:
  chromium:
    name: Chromium
    extends: chrome

    settings:
      executable: chromium
```

#### `headless`

The `headless` field says whether or not to run the browser in headless mode.
It defaults to `true`. It's currently only supported for Chrome:

```yaml
override_platforms:
  chrome:
    settings:
      headless: false
```

Note that headless mode is always disabled when debugging.

## Configuration Presets

*Presets* are collections of configuration that can be explicitly selected on
the command-line. They're useful for quickly selecting options that are
frequently used together, for providing special configuration for continuous
integration systems, and for defining more complex logic than can be expressed
directly using command-line arguments.

Presets can be selected on the command line using the `--preset` or `-P` flag.
Any number of presets can be selected this way; if they conflict, the last one
selected wins. Only presets that are defined in the configuration file may be
selected.

### `presets`

This field defines which presets are available to select. It takes a map from
preset names to configuration maps that are applied when those presets are
selected. These configuration maps are just like the top level of the
configuration file, and allow any fields that may be used in the context where
`presets` was used.

```yaml
presets:
  # Use this when you need completely un-munged stack traces.
  debug:
    verbose_trace: false
    js_trace: true

  # Shortcut for running only browser tests.
  browser:
    paths:
    - test/runner/browser
    - test/runner/pub_serve_test.dart
```

The `presets` field counts as [test configuration](#test-configuration). It can
be useful to use it in combination with other fields for advanced preset
behavior.

```yaml
tags:
  chrome:
    skip: "Our Chrome launcher is busted. See issue 1234."

    # Pass -P force to verify that the launcher is still busted.
    presets: {force: {skip: false}}
```

### `add_presets`

This field selects additional presets. It's technically
[runner configuration](#runner-configuration), but it's usually used in more
specific contexts. For example, when included in a preset's configuration, it
can be used to enable preset inheritance, where selecting one preset implicitly
selects another as well. It takes a list of preset name strings.

```yaml
presets:
  # Shortcut for running only browser tests.
  browser:
    paths: [test/runner/browser]

  # Shortcut for running only Chrome tests.
  chrome:
    filename: "chrome_*_test.dart"
    add_presets: [browser]
```

## Global Configuration

The test runner also supports a global configuration file. On Windows, this
file's local defaults to `%LOCALAPPDATA%\DartTest.yaml`. On Unix, it defaults to
`~/.dart_test.yaml`. It can also be explicitly set using the `DART_TEST_CONFIG`
environment variable.

The global configuration file supports a subset of the fields supported by the
package-specific configuration file. In general, it doesn't support fields that
are closely tied to the structure of an individual package. Fields that are not
supported in the global configuration file say so in their documentation.
