aboutsummaryrefslogtreecommitdiff
path: root/en/compatibility/tests/development/test-config.md
diff options
context:
space:
mode:
Diffstat (limited to 'en/compatibility/tests/development/test-config.md')
-rw-r--r--en/compatibility/tests/development/test-config.md185
1 files changed, 185 insertions, 0 deletions
diff --git a/en/compatibility/tests/development/test-config.md b/en/compatibility/tests/development/test-config.md
new file mode 100644
index 00000000..2e631da0
--- /dev/null
+++ b/en/compatibility/tests/development/test-config.md
@@ -0,0 +1,185 @@
+Project: /_project.yaml
+Book: /_book.yaml
+
+{% include "_versions.html" %}
+
+<!--
+ Copyright 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+# Complex Test Configuration
+
+Important: The instructions on this page are needed only for Android
+[Compatibility Test Suite](compatibility/cts) (CTS) tests or those that require
+special setup, such as disabling Bluetooth or collecting sample data. All other
+cases can be covered by the Soong-based [Simple Test
+Configuration](blueprints.md) using Blueprints that automate much of the
+configuration previously conducted manually.
+
+Some test modules may require customized setup and tear down steps that cannot
+be performed within the test case itself. Typical examples may include:
+
+* install other apks (in addition to the test apk)
+* push some files to the device
+* run commands (e.g. adb shell pm ...)
+
+In the past, component teams usually resort to writing a host side test to
+perform such tasks, which requires understanding of Trade Federation harness
+and typically increases the complexity of a test module .
+
+Borrowing from CTS, we introduced the concept of test module config to support
+such tasks, the common tasks list above can be achieved by just a few lines of
+config. For maximum flexibility, you can even implement your own target
+preparer, as defined by [ITargetPreparer]
+(/reference/com/android/tradefed/targetprep/ITargetPreparer.html)
+or [ITargetCleaner]
+(/reference/com/android/tradefed/targetprep/ITargetCleaner.html),
+and configure them to use in your own test module config.
+
+A test module config for a test module is a required XML file added to the top
+level module source folder, named ‘AndroidTest.xml’. The XML follows the format
+of a configuration file used by Trade Federation test automation harness.
+Currently the main tags handled via the test module configs are the “target_preparer” and
+"test" tags.
+
+## Target preparers
+A “target_preparer” tag, as the name suggests, defines a target preparer
+(see [ITargetPreparer](/reference/com/android/tradefed/targetprep/ITargetPreparer.html))
+that offers a setup method, which gets called before the test module is executed
+for testing; and if the class referenced in the “target_preparer” tag also
+implements
+[ITargetCleaner](/reference/com/android/tradefed/targetprep/ITargetCleaner.html),
+its teardown method will be invoked after the test module has finished.
+
+To use the built-in common module config, add a new file ‘AndroidTest.xml’ at
+the top level folder for your test module, and populate it with the following
+content:
+
+```xml
+<?xml version="1.0" encoding="utf-8"?>
+<!-- [insert standard AOSP copyright here] -->
+<configuration description="Test module config for Foo">
+<!-- insert options here -->
+</configuration>
+```
+
+As an example, we can add the following option tags (at the “insert” comment
+above):
+
+```xml
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="settings put secure accessibility_enabled 1" />
+ <option name="teardown-command" value="settings put secure accessibility_enabled 0" />
+ </target_preparer>
+```
+
+The options will configure the test harness to:
+
+1. before test module is invoked, execute shell command “settings put secure
+ accessibility_enabled 1” on device
+2. after test module is finished, execute shell command “settings put secure
+ accessibility_enabled 0”
+
+In this particular example, accessibility is enabled/disabled before/after the
+test module execution, respectively. With a simple example demonstrated, it’s
+necessary to cover more details on how the “option” tag is used. As shown above,
+the tag can have two attributes: name, value. The name attribute indicated the
+name of the option, and is further broken down into two parts separated by a
+colon: short name for the preparer, and the actual option name offered by the
+preparer.
+
+The exact purpose of value field is dependent on how preparer defined
+the option: it can be a string, a number, a boolean, or even a file path etc. In
+the example above, name “run-command:run-command” means that we are setting
+value for the option “run-command” defined by a target preparer with short name
+“run-command”; and name “run-command:teardown-command” means that we are setting
+value for the option “teardown-command” also defined by the same target preparer
+with short name “run-command”. Here's a summary of the three common target
+preparers:
+
+* class name: [PushFilePreparer](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/targetprep/PushFilePreparer.java)
+
+ * **short name**: push-file
+ * **function**: pushes arbitrary files under test case folder into
+ destination on device
+ * **notes**:
+ * this preparer can push from folder to folder, or file to file; that
+ is, you cannot push a file under a folder on device: you must
+ specify the destination filename under that folder as well
+ * **options**:
+ * **push:** A push-spec, formatted as
+ '`/path/to/srcfile.txt->/path/to/destfile.txt`' or
+ '`/path/to/srcfile.txt->/path/to/destdir/`'. May be repeated
+ This path may be relative to the test module directory or the out
+ directory itself.
+ * **post-push: **A command to run on the device (with \``adb shell
+ <your command>`\`) after all pushes have been attempted. Typical use
+ case would be using chmod for permissions
+
+* class name: [InstallApkSetup](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/targetprep/InstallApkSetup.java)
+
+ * **short name:**install-apk
+ * **function:** pushes arbitrary apk files under into destination on
+ device
+ * **options:**
+ * **test-file-name:** the name of the apk to be installed on to
+ device.
+ * **install-arg:** Additional arguments to be passed to the pm install
+ command, including leading dash, e.g. “-d". May be repeated
+
+* class name: [RunCommandTargetPreparer](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/targetprep/RunCommandTargetPreparer.java)
+
+ * **short name:** run-command
+ * **function:** executes arbitrary shell commands before or after test
+ module execution
+ * **options:**
+ * **run-command:**adb shell command to run. May be repeated
+ * **teardown-command:**adb shell command to run during teardown phase.
+ May be repeated
+
+## Test class
+A test class is the Trade Federation class to use to execute the test.
+
+```xml
+<test class="com.android.tradefed.testtype.AndroidJUnitTest">
+ <option name="package" value="android.test.example.helloworld"/>
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+</test>
+```
+
+Here are three common test classes:
+
+* class name: [GTest](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/testtype/GTest.java)
+
+ * **short name:** gtest
+ * **function:** A Test that runs a native test package on given device.
+ * **options:**
+ * **native-test-device-path:**The path on the device where native tests are located.
+
+* class name: [InstrumentationTest](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/testtype/InstrumentationTest.java)
+
+ * **short name:** instrumentation
+ * **function:** A Test that runs an instrumentation test package on given device
+ * **options:**
+ * **package:**The manifest package name of the Android test application to run.
+ * **class:**The test class name to run.
+ * **method:**The test method name to run.
+
+* class name: [AndroidJUnitTest](https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/testtype/AndroidJUnitTest.java)
+
+ * **function:** A Test that runs an instrumentation test package on given
+ device using the android.support.test.runner.AndroidJUnitRunner
+ This is the main way to execute an instrumentation test.
+