# Run a test component

This guide shows you how to build Fuchsia to include a test package from
Fuchsia's source [`//examples`](/examples/) directory and run tests on
your Fuchsia target.

Note: You can find the source code for the "Hello, World" example at
[`//examples/hello_world`](/examples/hello_world).

## Prerequisites

Before you can run this test component, you must:

*   [Set up the Fuchsia development environment](/docs/get-started/get_fuchsia_source.md)

## Exploring the example {#exploring-the-example}

The `Hello, world!` examples includes unit test components written in the
various supported languages. A test component has two key elements:

*   An [executable test suite](#executable-test) written in a supported language.
*   A [`BUILD.gn`](#build-gn) file to define the test component build target and
    include it in a Fuchsia test package.

### Executable test suite {#executable-test}

Fuchsia test suites are built as components and execute within a
[test runner](/docs/concepts/testing/v2/test_runner_framework.md) for supported
testing frameworks, such as GoogleTest.
The test suite binary includes test cases written against these
language-specific frameworks.

* {C++}

   ```cpp
   {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/hello_world/cpp/hello_world_unittest.cc" region_tag="hello_test" adjust_indentation="auto" %}
   ```

* {Rust}

   ```rust
   {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/hello_world/rust/src/main.rs" region_tag="test_mod" adjust_indentation="auto" %}
   ```

For more details on testing Fuchsia components, see
[Testing with Components](/docs/concepts/testing/v2)

### BUILD.gn {#build-gn}

The `BUILD.gn` file declares build targets for `fuchsia_unittest_package()`.
This template is specifically designed to package components containing tests.

* {C++}

   ```gn
   {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/hello_world/cpp/BUILD.gn" region_tag="fuchsia_test" adjust_indentation="auto" %}
   ```

* {Rust}

   ```gn
   {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/hello_world/rust/BUILD.gn" region_tag="fuchsia_test" adjust_indentation="auto" %}
   ```

To learn more about how Fuchsia uses GN to define test packages,
see: [Building components](/docs/development/components/build.md).

## Include the example tests in your Fuchsia image {#include-the-example}

Note: For new build configurations, these commands can take up to 90 minutes.

To include the example package in your build configuration, use the `--with` flag
when setting your product and board environment:

<pre class="prettyprint">
<code class="devsite-terminal">fx set <var>product</var>.<var>board</var> --with //examples/hello_world:tests</code>
</pre>

For a Fuchsia emulator with the minimum build configuration, the command is:

```posix-terminal
fx set core.qemu-x64 --with //examples/hello_world:tests
```

In this example, `core` is a product with a minimal feature set, which includes
common network capabilities, and `x64` refers to the x64 architecture.

For a Fuchsia device with the minimum build configuration, the command is:

```posix-terminal
fx set core.x64 --with //examples/hello_world:tests
```

See [Configure a build](/docs/development/build/fx.md#configure-a-build) for
more options.

Once you have set your build configuration, build Fuchsia with the following
command:

```posix-terminal
fx build
```

You now have a build that includes the example tests that can be
[fetched and launched on demand](/docs/concepts/build_system/boards_and_products.md#universe).

## Run the test suite {#run-the-test-suite}

1.  Open a terminal and run `fx serve-updates`:

    ```posix-terminal
    fx serve-updates
    ```

1.  Open another terminal and run the `hello-world` unit tests:

    * {C++}

      ```posix-terminal
      fx test hello-world-cpp-unittests
      ```

    * {Rust}

      ```posix-terminal
      fx test hello-world-rust-tests
      ```

This command prints the following output:

* {C++}

  ```none
  $ fx test hello-world-cpp-unittests
  ...

  PASS: 0 FAIL: 0 00:00 🤔  fx shell run-test-suite '--max-severity-logs WARN' fuchsia-pkg://fuchsia.com/hello-world-cpp-unittests?hash=c34ed8b2ea21fd5158f1de77a5581a4b5123161ef851eea430768a00efc1cbbf#meta/hello-world-cpp-unittests.cm
  >> Runtime has exceeded 2 seconds (adjust this value with the -s|--slow flag)


  Running test 'fuchsia-pkg://fuchsia.com/hello-world-cpp-unittests?hash=c34ed8b2ea21fd5158f1de77a5581a4b5123161ef851eea430768a00efc1cbbf#meta/hello-world-cpp-unittests.cm'
  [RUNNING]	HelloWorldTest.True
  [PASSED]	HelloWorldTest.True


  1 out of 1 tests passed...
  fuchsia-pkg://fuchsia.com/hello-world-cpp-unittests?hash=c34ed8b2ea21fd5158f1de77a5581a4b5123161ef851eea430768a00efc1cbbf#meta/hello-world-cpp-unittests.cm completed with result: PASSED

  PASS: 1 FAIL: 0 00:15 ✅  fx shell run-test-suite '--max-severity-logs WARN' fuchsia-pkg://fuchsia.com/hello-world-cpp-unittests?hash=c34ed8b2ea21fd5158f1de77a5581a4b5123161ef851eea430768a00efc1cbbf#meta/hello-world-cpp-unittests.cm

  🎉  Ran 1 tests with 0 failures (use the -v flag to see each test) 🎉
  ```

* {Rust}

  ```none
  $ fx test hello-world-rust-tests
  ...

  PASS: 0 FAIL: 0 00:00 🤔  fx shell run-test-suite '--max-severity-logs WARN' fuchsia-pkg://fuchsia.com/hello-world-rust-tests?hash=45cc85adaa09af18c575c45be942d72e173719c53e69d879eeb9602fa38e4884#meta/hello-world-rust-tests.cm
  >> Runtime has exceeded 2 seconds (adjust this value with the -s|--slow flag)


  Running test 'fuchsia-pkg://fuchsia.com/hello-world-rust-tests?hash=45cc85adaa09af18c575c45be942d72e173719c53e69d879eeb9602fa38e4884#meta/hello-world-rust-tests.cm'
  [RUNNING]	hello_tests::greeting_test
  [RUNNING]	hello_tests::my_test
  [RUNNING]	tests::it_works
  [PASSED]	tests::it_works
  [PASSED]	hello_tests::my_test
  [PASSED]	hello_tests::greeting_test


  3 out of 3 tests passed...
  fuchsia-pkg://fuchsia.com/hello-world-rust-tests?hash=45cc85adaa09af18c575c45be942d72e173719c53e69d879eeb9602fa38e4884#meta/hello-world-rust-tests.cm completed with result: PASSED

  PASS: 1 FAIL: 0 00:15 ✅  fx shell run-test-suite '--max-severity-logs WARN' fuchsia-pkg://fuchsia.com/hello-world-rust-tests?hash=45cc85adaa09af18c575c45be942d72e173719c53e69d879eeb9602fa38e4884#meta/hello-world-rust-tests.cm
  ```
