| # JUnit Tests |
| |
| JUnit tests are Java unit tests. These tests run locally on your workstation. |
| |
| [TOC] |
| |
| ## Writing a JUnit test |
| |
| When writing JUnit tests, you must decide whether you need to use Android code. |
| If you want to use Android code you must write a [Robolectric](http://robolectric.org/) test. |
| |
| ### JUnit tests (without Android) |
| |
| Build these types of test using the `junit_binary` GN template. |
| |
| If you don't need to use any Android code in your tests, you can write plain, |
| old JUnit tests. Some more documentation about writing JUnit tests can be |
| found [here](https://github.com/junit-team/junit4/wiki/Getting-started). |
| |
| #### Example Code |
| |
| ```java |
| package org.chromium.sample.test; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.BlockJUnit4ClassRunner; |
| |
| @RunWith(BlockJUnit4ClassRunner.class) |
| public class MyJUnitTest { |
| |
| @Test |
| public void exampleTest() { |
| boolean shouldWriteMoreJUnitTests = true; |
| assertTrue(shouldWriteMoreJUnitTests); |
| } |
| } |
| ``` |
| |
| #### Example within Chromium |
| |
| See the [junit_unit_tests](https://cs.chromium.org/chromium/src/testing/android/junit/BUILD.gn) test suite. |
| |
| ### JUnit tests with Robolectric |
| |
| Build these types of test using the `junit_binary` GN template. |
| |
| Robolectric is a unit testing framework that lets you run tests with Android |
| code on your workstation. It does this by providing a special version of the |
| Android SDK jar that can run in your host JVM. Some more information about |
| Robolectric can be found [here](http://robolectric.org/). |
| |
| One on the main benefits of using Robolectric framework are [shadow classes](http://robolectric.org/extending/). |
| Robolectric comes with many prebuilt shadow classes and also lets you define |
| your own. Whenever an object is instantiated within a Robolectric test, |
| Robolectric looks for a corresponding shadow class (marked by |
| `@Implements(ClassBeingShadowed.class)`). If found, any time a method is invoked |
| on the object, the shadow class's implementation of the method is invoked first. |
| This works even for static and final methods. |
| |
| #### Useful Tips |
| |
| * Use `@RunWith(LocalRobolectricTestRunner.class)` for all Chromium Robolectric tests. |
| * You can specify the Android SDK to run your test with with `@Config(sdk = ??)`. |
| |
| > Currently, only SDK levels 18, 21, and 25 are supported in Chromium |
| > but more can be added on request. |
| |
| #### Example Code |
| |
| ```java |
| package org.chromium.sample.test; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import android.text.TextUtils; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.robolectric.annotation.Config; |
| |
| import org.chromium.testing.local.LocalRobolectricTestRunner; |
| |
| // Be sure to specify to run tests with the LocalRobolectricTestRunner. The |
| // default JUnit test runner won't load the Robolectric Android code properly. |
| @RunWith(LocalRobolectricTestRunner.class) |
| // Can specify some Robolectric related configs here. |
| // More about configuring Robolectric at http://robolectric.org/configuring/. |
| // SDK will default to the latest we support in Chromium. |
| @Config(manifest = Config.NONE, sdk = 21) |
| public class MyRobolectricJUnitTest { |
| |
| @Test |
| public void exampleTest() { |
| String testString = "test"; |
| |
| // Even though these tests runs on the host, Android classes are |
| // available to use thanks to Robolectric. |
| assertTrue(TextUtils.equals(testString, "test")); |
| } |
| } |
| ``` |
| |
| #### Example junit_binary build template. |
| |
| ```python |
| junit_binary("my_robolectric_tests") { |
| |
| java_files = [ |
| "java/src/foo/bar/MyJUnitTest.java" |
| |
| deps = [ |
| "//my/test:dependency", |
| ] |
| |
| # Sets app's package name in Robolectric tests. You need to specify |
| # this variable in order for Robolectric to be able to find your app's |
| # resources. |
| package_name = manifest_package |
| } |
| ``` |
| |
| #### Example within Chromium |
| |
| See the [content_junit_tests](https://cs.chromium.org/chromium/src/content/public/android/BUILD.gn) test suite. |
| |
| ## Running JUnit tests |
| |
| After writing a test, you can run it by: |
| |
| 1. Adding the test file to a `junit_binary` GN target. |
| 2. Rebuild. |
| 3. GN will generate binary `<out_dir>/bin/run_<suite name>` which |
| can be used to run your test. |
| |
| For example, the following can be used to run chrome_junit_tests. |
| |
| ```bash |
| # Build the test suite after adding our new test. |
| ninja -C out/Debug chrome_junit_tests |
| |
| # Run the test! |
| out/Debug/bin/run_chrome_junit_tests |
| ``` |