109 lines
3.1 KiB
Markdown
109 lines
3.1 KiB
Markdown
# 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'
|