diff options
Diffstat (limited to 'examples/ex1_standalone_app/README.md')
-rw-r--r-- | examples/ex1_standalone_app/README.md | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/examples/ex1_standalone_app/README.md b/examples/ex1_standalone_app/README.md new file mode 100644 index 0000000..5d68e34 --- /dev/null +++ b/examples/ex1_standalone_app/README.md @@ -0,0 +1,108 @@ +# Standalone Snippet App Example + +This tutorial shows you how to create a standalone Mobly snippet app. To create +a snippet app that controls (instruments) another app under test, please see +[Example 2](../ex2_espresso/README.md). + +## Tutorial + +1. Use Android Studio to create a new app project. + +1. Link against Mobly Snippet Lib in your `build.gradle` file + + ``` + dependencies { + implementation 'com.google.android.mobly:mobly-snippet-lib:1.3.1' + } + ``` + +1. Write a Java class implementing `Snippet` and add methods to trigger the + behaviour that you want. Annotate them with `@Rpc` + + ```java + package com.my.app; + ... + public class ExampleSnippet implements Snippet { + @Rpc(description='Returns a string containing the given number.') + public String getFoo(Integer input) { + return "foo " + input; + } + + @Override + public void shutdown() {} + } + ``` + +1. Add any classes that implement the `Snippet` interface in your + `AndroidManifest.xml` application section as `meta-data` + + ```xml + <manifest + xmlns:android="http://schemas.android.com/apk/res/android" + package="com.my.app"> + <application> + <meta-data + android:name="mobly-snippets" + android:value="com.my.app.test.MySnippet1, + com.my.app.test.MySnippet2" /> + ... + ``` + + +1. Add an `instrumentation` tag to your `AndroidManifest.xml` so that the + framework can launch your server through an `instrument` command. + + ```xml + <manifest + xmlns:android="http://schemas.android.com/apk/res/android" + package="com.my.app"> + <application>...</application> + <instrumentation + android:name="com.google.android.mobly.snippet.ServerRunner" + android:targetPackage="com.my.app" /> + </manifest> + ``` + +1. Build your apk and install it on your phone + +1. In your Mobly python test, connect to your snippet .apk in `setup_class` + + ```python + class HelloWorldTest(base_test.BaseTestClass): + def setup_class(self): + self.ads = self.register_controller(android_device) + self.dut1 = self.ads[0] + self.dut1.load_snippet(name='snippet', package='com.my.app.test') + ``` + +6. Invoke your needed functionality within your test + + ```python + def test_get_foo(self): + actual_foo = self.dut1.snippet.getFoo(5) + asserts.assert_equal("foo 5", actual_foo) + ``` + +## Running the example code + +This folder contains a fully working example of a standalone snippet apk. + +1. Compile the example + + ./gradlew examples:ex1_standalone_app:assembleDebug + +1. Install the apk on your phone + + adb install -r ./examples/ex1_standalone_app/build/outputs/apk/debug/ex1_standalone_app-debug.apk + +1. Use `snippet_shell` from mobly to trigger `getFoo()`: + + snippet_shell.py com.google.android.mobly.snippet.example1 + + >>> print(s.help()) + Known methods: + getBar(String) returns String // Returns the given string with the prefix "bar" + getFoo(Integer) returns String // Returns the given integer with the prefix "foo" + + >>> s.getFoo(5) + u'foo 5' |