# Contributing to WebView Tests
[TOC]
## Instrumentation tests
These are on-device integration tests for android\_webview with rest of the
chromium code (covering both Java and native code). A large percentage of
Android applications use WebView, and could trigger WebView specific code paths
in the codebase, therefore it is important to have solid integration tests.
#### Where to add tests?
The tests are located in the [javatests directory](/android_webview/javatests/src/org/chromium/android_webview/test/).
They are roughly organized by the
[Aw classes](/android_webview/java/src/org/chromium/android_webview/) (some
tests are organized by overall functionality instead). Put new tests into an
existing test class or create a new one if a suitable one isn't available.
#### How to write intrumentation tests?
See the [instrumentation test doc](/docs/testing/android_instrumentation_tests.md).
#### How do tests interact with WebView?
Tests are written as JUnit4 tests. [AwActivityTestRule] is used to create and
obtain references to WebView objects such as [AwContents](internally it launches
the [WebView instrumentation shell](/android_webview/test/shell/src/org/chromium/android_webview/shell/)
application to hold [AwTestContainerViews](/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestContainerView.java)
which in turn contains [AwContents]). [AwContents] will allow the test to
trigger code paths such as loading urls, going forwards/backwards, etc... .
[AwActivityTestRule] has some helper methods to call the [AwContents] methods,
for example to ensure that they are called on the UI thread. Some AW
components, such as [AwCookieManager](/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java),
can be directly created in tests.
#### How do tests inject html/css/js content?
Tests can use the load\* methods in [AwActivityTestRule] to inject snippets
of content. This will however bypass the network layer. To have end-to-end
testing, use [EmbeddedTestServer](/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java),
which will allow simple loading of files from the [data directory](/android_webview/test/data/).
For loading data from arbitrary URIs and more advanced control, the
[TestWebServer](/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java)
can be used. Note that, when simulating input or user actions on web content,
the content should include some visiible text because input is typically
ignored until something meaningful is painted.
## Java unittest (JUnit)
These are off-device tests using robolectric that only exercise android\_webview
Java code.
#### Where to add tests?
The tests are located in the [junit directory](/android_webview/junit/src/org/chromium/android_webview/robolectric/).
#### How to write junit tests?
See the [JUnit doc](/docs/testing/android_robolectric_tests.md).
## Native unittests
These are on-device gtests that only exercise android\_webview native code.
#### Where to add tests?
The tests are located alongside respective source code files under
[android\_webview directory](/android_webview/).
#### How to write gtests?
See the [GTest doc](/docs/testing/android_gtests.md).
## How to run tests?
Running tests is covered in [WebView Test Instructions](/android_webview/docs/test-instructions.md).
[AwActivityTestRule]:
/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
[AwContents]:
/android_webview/java/src/org/chromium/android_webview/AwContents.java