blob: 435eb6665051ff2a624521b951510f871d97972d [file] [log] [blame] [view]
# Run Fuchsia tests
This guide provides instructions on how to run Fuchsia tests using the `fx test`
command.
In Fuchsia, a test can be a component that runs on a Fuchsia device (see
[Tests as components][tests-as-components]) or a standalone executable that runs
on the host machine.
To run a Fuchsia test, use the `fx test` command with the name of the test:
```posix-terminal
fx test <TEST_NAME>
```
If `TEST_NAME` is a test component, `fx test` connects to your Fuchsia device to
load and run the test component. That is, the command finds the component's
corresponding [component URI][component-uri] and calls `run-test-component` on
the target device. However, if `TEST_NAME` is a host test, `fx test` directly
invokes that test binary to run on the host machine.
Similar to a host test, an end-to-end test also runs on a host machine. The test
then may interact with various services on a Fuchsia device for testing purposes
(see [Scripting Layer for Fuchsia][scripting-layer-for-fuchsia]). To run an
end-to-end test, provide an additional flag (`--e2e`) to `fx test`:
```posix-terminal
fx test --e2e <END_TO_END_TEST_NAME>
```
## Customize invocations {#customize-invocations}
`fx test` can run multiple tests or test suites at once. The command can also
filter those tests to be only device, host, or end-to-end tests.
To customize `fx test`, you can [add flags][fx-test-flags] and provide a
number of tests:
```posix-terminal
fx test <FLAGS> <TEST_NAME_01> <TEST_NAME_02> ...
```
Common ways to customize `fx test` are listed in the sections below.
### Run multiple tests {#run-multiple-tests}
If you want to run multiple sets of Fuchsia tests, configure your Fuchsia build
to include several of the primary testing bundles, build Fuchsia, and then run
all tests in the build. For example:
```none
$ fx set core.x64 --with //bundles:tools,//bundles:tests
$ fx build
$ fx test
```
You can also provide multiple targets in a single invocation:
```posix-terminal
fx test <PACKAGE_01> <PACKAGE_02> <COMPONENT_01> <COMPONENT_02>
```
See [Specify a test in multiple ways](#specify-a-test-in-multiple-ways) for
various ways to specify tests.
### Pass arguments to tests {#pass-argument-to-test}
Use the `--` flag to pass additional arguments to test components.
Note: `fx test` passes these arguments to all selected tests. When you target
many test components in a single command, this option may not be ideal.
The following example passes a `timeout` flag to a test:
```none
$ fx test <TEST_NAME> -- --timeout=5
```
For example, the command above internally calls the following command on the
device:
```none
$ fx shell run-test-component <TEST_COMPONENT_URI> -- --timeout=5
$ fx shell run-test-suite <TEST_COMPONENT_URI> -- --timeout=5
```
## Specify a test in multiple ways {#specify-a-test-in-multiple-ways}
`fx test` supports multiple ways to reference a specific test:
* [Host test path](#host-test-path)
* [Package URL](#package-url)
* [Package name](#package-name)
* [Component name](#component-name)
### Host test path {#host-test-path}
For a host test, provide a relative path to the test binary from the root of the
Fuchsia build output directory. If the path points to a subdirectory, not a
file, `fx test` runs all matching test binaries in that directory.
For example, you can provide a relative path to specify a test binary:
```none
fx test host_x64/pm_cmd_pm_genkey_test
```
Or you can provide a relative path to a test directory:
```none
fx test host_x64/gen/sdk
```
### Package URL {#package-url}
Provide a full [Fuchsia component URL][component-uri] to specify a test
component. For example:
```none
fx test fuchsia-pkg://fuchsia.com/my_example_test_pkg#meta/my_example_test.cmx
```
Provide a partial package URL to match and run all test components in the
package with the provided Fuchsia package URL. For example:
```none
fx test fuchsia-pkg://fuchsia.com/my_example_test_pkg
```
### Package name {#package-name}
Provide a [package name][fuchsia-package-name] to run all test components in
that package. For example:
```none
fx test my_example_test_pkg
```
To explicitly specify the input to be a package name, use the flag `-p`. For
example:
```none
fx test -p my_example_test_pkg
```
### Component name {#component-name}
Provide a component name (or a [resource path][resource-path]) to test a single
component in a package. For example:
```none
fx test my_example_test
```
To explicitly specify the input to be a component name, use the flag `-c`. For
example:
```none
fx test -c my_example_test
```
To run a component on a specific package, use both `-p <PACKAGE_NAME>` and `-c
<COMPONENT_NAME>`. For example:
```none
fx test -p my_example_test_pkg -c my_example_test
```
## Convert from run-test or run-host-tests {#convert-from-run-test-or-run-host-tests}
The `fx run-test`, `fx run-host-tests` and `fx run-e2e-tests` commands are being
deprecated in favor of `fx test`. See the following instructions on how to use
`fx test` in place of these commands:
* [run-test](#run-test)
* [run-host-tests](#run-host-tests)
* [run-e2e-tests](#run-e2e-tests)
### run-test {#run-test}
Substitute `fx run-test` with `fx test`.
From:
```posix-terminal
fx run-test <TEST_PACKAGE_NAME>
```
To:
```posix-terminal
fx test <TEST_PACKAGE_NAME>
```
#### The -t flag
With `run-test`, you were able to use the `-t` flag to specify a single test
component to run. For example:
```posix-terminal
fx run-test <PACKAGE_NAME> -t <NESTED_COMPONENT_NAME>
```
With `fx test`, this command becomes:
```posix-terminal
fx test -p <PACKAGE_NAME> -c <NESTED_COMPONENT_NAME>
```
If there are no name collisions for the test component, you can simply run:
```posix-terminal
fx test <NESTED_COMPONENT_NAME>
```
### run-host-tests {#run-host-tests}
Substitute `fx run-host-tests` with `fx test`.
From:
```posix-terminal
fx run-host-tests <PATH_TO_HOST_TEST>
```
To:
```posix-terminal
fx test <PATH_TO_HOST_TEST>
```
### run-e2e-tests
Substitute `fx run-e2e-tests` with `fx test` and an additional `--e2e` flag.
From:
```posix-terminal
fx run-e2e-tests <END_TO_END_TEST>
```
To:
```posix-terminal
fx test --e2e <END_TO_END_TEST>
```
## Test-driven development
The `fx smoke-test` command automatically detects all tests that are known to
the build system as affected by changes in your checkout. Try the following:
```posix-terminal
fx -i smoke-test --verbose
```
In the command above, `--verbose` will also print which tests `fx smoke-test`
thinks are affected by your change. `-i` will automatically repeat this command
every time you save your changes. For test-driven development, try launching
this command in a separate shell and watching your code rebuild and retest as
you're working on it.
`fx smoke-test` works best with hermetic test packages. A test package is
hermetic if the package contains all the dependencies of any tests in it.
That is to say, any code changes that affect the outcome of this test should
require rebuilding that test's package as well.
<!-- Reference links -->
[tests-as-components]: /docs/concepts/testing/v1_test_component.md
[scripting-layer-for-fuchsia]: /docs/development/drivers/concepts/driver_development/sl4f.md
[component-uri]: /docs/reference/components/url.md
[rust-glob-syntax]: https://docs.rs/glob/0.3.0/glob/struct.Pattern.html
[fuchsia-package-name]: /docs/concepts/packages/package_url.md#package-name
[resource-path]: /docs/concepts/packages/package_url.md#resource-paths
[fx-test-flags]: https://fuchsia.dev/reference/tools/fx/cmd/test