blob: 2a6b45c1c41a2bf26afe152f7526eee432fb75e3 [file] [log] [blame] [view]
# Testing: Questions and Answers
You are encouraged to add your own questions (and answers) here!
[TOC]
## Q: How do I define a new unit test?
A: Use language-appropriate constructs, like GTest for C++. You can define a new
file if need be, such as:
(in a BUILD.gn file)
```code
executable("unittests") {
output_name = "scenic_unittests"
testonly = true
sources = ["some_test.cc"],
deps = [":some_dep"],
}
```
## Q: What ensures it is run?
A: An unbroken chain of dependencies that roll up to your `fx set` command's
universe of available packages (expandable using the
[`--with`](/tools/devshell/set)
flag), typically going through the `all` target of
`//<layer>/packages/tests/BUILD.gn`, such as
[`//garnet/packages/tests:all`](/garnet/packages/tests/BUILD.gn).
For example:
`//garnet/lib/ui/scenic/tests:unittests`
is an executable, listed under the "tests" stanza of
`//garnet/bin/ui:scenic_tests`
which is a package, which is listed in a package group
`//garnet/packages/tests:scenic`
which is itself included in the catch-all group,
`//garnet/packages/tests:all`
Your product definition (typically one found in
[products/](/products) may or
may not transitively include this test group. If it doesn't, add it to your `fx
set` command, like so:
`fx set ... --with //garnet/packages/tests:scenic_tests`
Typically, one just adds a new test to an existing binary, or a new test binary
to an existing package.
## Q: How do I run this unit test on a QEMU instance?
There's the easy way if your QEMU has networking, and the hard way if it
doesn't.
A (with networking): In one terminal, start your QEMU instance with `fx run -N`.
Next, on another terminal, type in `fx run-test scenic_tests`.
This invocation runs all the test executables in the `scenic_tests` package.
A (no networking): Start a QEMU instance (`fx run`), and then *manually* invoke
the `runtests` command.
In the QEMU shell, type in `run-test-component scenic_tests`. The
argument is a specific directory containing the test executables.
Note Well! Without networking, the files are loaded into the QEMU instance at
startup. So after rebuilding a test, you'll need to shutdown and re-start the
QEMU instance to see the rebuilt test.
To exit QEMU, `dm shutdown`.
## Q: How do I run this unit test on my development device?
A: Either manual invocation, like in QEMU, **or** `fx run-test` to a running
device.
Note that the booted device may not contain your binary at startup, but `fx
run-test` will build the test binary, ship it over to the device, and run it,
while piping the output back to your workstation terminal. Slick!
Make sure your device is running (hit Ctrl-D to boot an existing image) and
connected to your workstation.
From your workstation, `fx run-test scenic_tests` will serially run through all
test executables contained in the `scenic_tests` package.
To run just one test executable, `fx run-test scenic_test -t scenic_unittests`,
where the argument to `-t` is the executable name.
You can automatically rebuild, install, and run your tests on every source file
change with `fx -i`. For instance: `fx -i run-test scenic_tests`.
## Q: Where are the test results captured?
A: The output is directed to your terminal.
There does exist a way to write test output into files (including a summary JSON
file), which is how CQ bots collect the test output for automated runs.
## Q: How to disable a test? How to find and run disabled tests?
A: To temporary prevent a particular test to being run as part of a test suite,
you can mark it as disabled. Disabled tests are defined by having their name
prefixed with `DISABLED_`. One way to find them is therefore simply `git grep
DISABLED_`.
If running the test outputs `YOU HAVE 1 DISABLED TEST`, you can also pass the
following flags to find out which test is disabled: `fx run-test scenic_tests --
--gtest_list_tests --gtest_filter=*DISABLED_*`.
To force-run disabled tests: `fx run-test scenic_tests --
--gtest_also_run_disabled_tests`.
Alternatively, you may also want to disable an entire test *executable* within a
package containing several test executables. To do this, edit the `BUILD.gn` as
follows: `tests = [ { name = "scenic_unittests", disabled = true } ]`. As a
result, `scenic_unittests` will be put in a `disabled` sub-directory of
`/pkgfs/packages/<package_name>/0/test`, and will not be run by the CQ system.
## Q: How do I run a bunch of tests automatically? How do I ensure all dependencies are tested?
A: Upload your patch to Gerrit and do a CQ dry run.
## Q: How do I run this unit test in a CQ dry run?
A: Clicking on CQ dry run (aka +1) will take your CL's properly defined unit
test and run it on multiple bots, one for each build target (*x86-64* versus
*arm64*, *release* versus *debug*). Each job will have an output page showing
all the tests that ran.