Introduced
The Android Test Support library includes a UI Automation module that automates black-box testing of Android apps. The automation module was introduced in API level 18, which allows developers to mimic user behavior on controls that compose the application UI.
In this tutorial, I'll show you how to use this module to create and execute a basic UI test, choosing the default Calculator module for testing.
Prerequisite
Before use, the following conditions are required:
- Latest version of Android Studio
- Running Android 4.3 or later devices or virtual machines
- Understanding JUnit
1. Installing dependent libraries
To use the UI Automation module in your project, you need to edit the file build.gradleunder your project's app directory and add the following dependencies:
Androidtestcompile ' com.android.support.test:runner:0.2 ' com.android.support.test:rules:0.2 ' ' com.android.support.test.uiautomator:uiautomator-v18:2.1.0 '
If you are using library APPCOMPAT-V7 and its version number is 23.1.0, you need to add the following dependencies to ensure that both the app itself and the test app use the same version of the com.android.support:support-annotations
:
Androidtestcompile ' com.android.support:support-annotations:23.1.0 '
2. Create a test class
Create a new test class that is CalculatorTester
implemented by creating a file named Calculatortester.java in the Androidtest directory. The UI Automation test cases that you create must inherit from InstrumentationTestCase
.
Override setUp
the method, and add the Testadd method. To this CalculatorTester
class is defined as follows:
Public class extends instrumentationtestcase{ @Override publicvoidthrows Exception { } Public void throws Exception { } }
3. View Launcher UI
Connect your Android device to the PC and click the Home button to enter the main screen.
Go back to your computer, use file management or terminal to browse the directory where you installed the Android SDK, and go to the Tools directory and click Uiautomatorviewer. This will start the UI Automater Viewer and you will see the following interface:
Click on the phone icon above to get a screenshot of your Android device. Notice that the captured screenshot is interactive at this point. Click on the Apps icon below. In the Node Detail area on the right, you can see different details displayed depending on the selection icon, as shown in:
Interacting with on-screen apps, UI Automation tests need to uniquely identify them. In this tutorial, you can use the app's text
, content-desc
or field, to make class
a unique distinction.
There are no fields from the apps icon that you can see text
, but there are content-desc
. Make a note of its value, which will be used later.
Pick up your Android device, touch the apps icon, and go to all the app screens installed on your device. Use the UI automater viewe to get another screen. To write a test for a calculator application, click the Calculator icon to see the detailed interface.
This time content-desc
is empty, but text
the value is calculator, also remember this value.
If your Android device is running a different main interface or different Android versions, the interface and display details will be different. This means that some modifications need to be made in subsequent code to match your operating system.
4. Prepare the test environment
Go back to Android Studio and setUp
add code to the method. As its name, the setUp
method is used to prepare the test environment. In other words, this method specifies what action needs to be performed before the actual test.
Now you need to write code to simulate a few of the actions you just performed on your Android device:
1. Press the home key to enter the main interface
2. Click the Apps icon to enter the application interface
3. Click the calculator icon to start it
Declare a variable of type in your class UiDevice
device
. It represents your Android device and later uses it to simulate user behavior.
Private Uidevice device;
in the setUp
method, by calling UiDevice.getInstance method
the to initialize device
, passing Instrumentation
instance, as follows:
device = Uidevice.getinstance (Getinstrumentation ());
Analog Click Device Home key, need to call pressHome
method.
Device.presshome ();
Next, you need to simulate the action of clicking on the apps icon. This action cannot be done immediately because the Android device needs a response time to load the interface. If this action is performed before the screen is displayed, it will cause a run-time exception.
When waiting for something to happen, you need to invoke UiDevice
the method of the instance wait
. Wait for the apps icon to display to the screen, using the Until.hasObject
method.
The Identify apps icon needs to use By.desc
the method and pass the value to the parameters of the apps. You also need to specify the maximum wait time, in milliseconds. Set here to 3000.
The following code snippet is formed:
Device.wait (Until.hasobject (By.desc ("Apps"), 3000);
to get a reference to the apps icon, you need to use findObject
method. Once you have a reference to the apps icon, you can invoke the click
method to simulate the click action.
UiObject2 Appsbutton = Device.findobject (By.desc ("Apps"); Appsbutton.click ();
as before, we need to wait some time to make sure the calculator icon is displayed on the screen. In the previous steps, we saw text
the identification calculator icon that can be unique through the field. We call By.text
the method to find the icon, passing the parameter as Calculator
.
Device.wait (Until.hasobject (By.text ("Calculator")), 3000);
5. Check the calculator UI
Launch the Calculator app on your Android device and use the UI Automater Viewer to view the display. Once you get to a screenshot, click on a different button to see what values you can use to uniquely differentiate them.
In this test case, use the calculator to calculate the value of the 9+9= and confirm whether the result is 18. This means you need to know how to differentiate between keys 9, + and =.
On my device, here is the information I collected:
- Numeric Key matching
text
values
- + and = use
content-desc
values, corresponding to plus and equals, respectively
- The return value is displayed in the
EditText
control
If you're using a different version of the Calculator app, be aware that these values may not be the same.
6. Create a test class
In the previous steps, you've learned how findObject
to use methods By.text
By.desc
to get references to different objects on the screen. Also learned click
to simulate the action of clicking an object by means of a method. The following code uses these methods to simulate 9+9=. Add these to the CalculatorTester
method in the class testAdd
.
Device.wait (Until.hasobject (By.text ("9")); = Device.findobject (By.text ("9")); Buttonnine.click (); = Device.findobject (By.desc ("plus")); Buttonplus.click (); Buttonnine.click (); = Device.findobject (By.desc ("equals")); Buttonequals.click ();
now wait for the result to run. It cannot be used here Until.hasObject
, because the result of the calculation is EditText
already displayed on the screen. Instead, we use the waitForIdle
method to wait for the calculation to complete. Similarly, the maximum wait time is 3000 milliseconds.
Device.waitforidle (3000);
Use findObject
and the By.clazz methods
method gets EditText
the reference to the object. Once you have this reference, you can call the getText
method to determine whether the calculation is correct.
UiObject2 Resulttext = Device.findobject (By.clazz ("Android.widget.EditText"= Resulttext.gettext ();
Finally, use assertTrue
to verify that the range value is 18.
Asserttrue (Result.equals ("18"));
The test ends here.
6. Perform the test
To perform the test, you need to select it in the toolbar of Android Studio CalculatorTester
and click on the Play button to the right of it.
Once the compilation is complete, the test runs successfully. When the test runs, you will see the UI Automation interface on your Android device.
7. Complete code
Public classCalculatortesterextendsInstrumentationtestcase {PrivateUidevice device; @Overrideprotected voidSetUp ()throwsException {Device=uidevice.getinstance (Getinstrumentation ()); Device.presshome (); Device.wait (Until.hasobject (By.desc ("Apps"), 3000); UiObject2 Appsbutton= Device.findobject (By.desc ("Apps")); Appsbutton.click (); Device.wait (Until.hasobject (By.text ("Calculator")), 3000); UiObject2 Calbutton= Device.findobject (By.text ("Calculator")); Calbutton.click (); Testadd (); } Public voidTestadd ()throwsException {device.wait (Until.hasobject (By.text ("9")), 3000); UiObject2 Buttonnine= Device.findobject (By.text ("9")); Buttonnine.click (); UiObject2 Buttonplus= Device.findobject (By.desc ("Plus")); Buttonplus.click (); Buttonnine.click (); UiObject2 buttonequals= Device.findobject (By.desc ("equals")); Buttonequals.click (); Device.waitforidle (3000); UiObject2 Resulttext= Device.findobject (By.clazz ("Android.widget.EditText")); String result=Resulttext.gettext (); Asserttrue (Result.equals ("18")); }}
Summarize
In this tutorial, we learned how to use the UI Automation test module and UI Automater Viewer to create a user interface test. You've also seen how easy it is to perform tests using Android studio. Although we have tested a relatively simple application, we can use the learned concepts in almost all of the testing of Android applications.
You can learn more about the test support library on the Android developer site.
Go Android UI Automation test