It doesn’t matter how much time you invest in design and implementation , mistakes are inevitable, and bugs will appear.
In this tutorial, you will learn-
Why Android Testing? Android Testing Strategy Unit tests Integration tests Operational tests System tests Automated ANDROID TESTING Android testing framework Robolectric testing framework Myths of Android Testing Best practices in Android Testing
Android Testing Strategy
A correct android testing strategy should include the following
Unit Test
Integration Test
Operational Test
System Test
Unit tests
Unit Tests include sets of one or more programs which are designed to verify an atomic unit of source code, such as a method or a class. Android platform comes pre-integrated Junit 3.0 framework. It’s open source framework for automating Unit Testing. Android Testing Framework is powerful tool for developer to write the effective unit test program.
The integration of Android and JUnit framework
An addition to Unit Testing is User Interface (UI) tests. These tests relate to UI components of your target application. UI tests ensure that your application return the correct UI output in response to sequence of user actions on device.
Common user UI actions on application
The common way to performance UI tests on device is Android Instrumentation. But this has performance issues. One of the best tools to conduct UI testing on Android is Robotium .
Integration tests
In Integration Testing, all unit tested modules, are combined and verified. In Android, integration tests often involve checking integration withAndroid components such as Service testing, Activity testing, Content Provider testing, etc
Types of integration test on Android
There’s many testing frameworks are used to conduct integration test for Android such as Troyd, Robolectric, Robotium.
Operational tests
Operational are also called Functional Tests or Acceptation Tests. They are high level tests designed to check the completeness and correctness of application.
In Android, FitNesse is open-source framework that makes it easy to conduct operational tests for target application.
System tests
In System Testing the system is tested as a whole and the interaction between the components, software and hardware is checked. In Android, System Testing normally includes
GUI tests
Usability tests
Performance tests
Stress tests
In the above list, Performance Testing is given more focus. You can use tools like Traceview to conduct performance test on Android .This tool can help you debug your application and profile its performance.
Automated ANDROID TESTING
As android is fragmented, testing on multitude of devices is necessary. But this will also cost you money. Automated Android Testing can help reduce costs Benefits of automated android testing
Reduce time for executing test cases
Increase productivity of your development process
Early bug detection, save cost on software maintenance
Quickly found and fix the bugs on implementation
Ensure the quality of software
We will study the following 2 frameworks
Android Testing framework
Robolectric Testing framework
Android testing framework
One of the standard testing frameworks for Android application is Android testing framework. It is a powerful and easy-to-use testing framework that is well integrated with the Android SDK tools.
Android testing framework Architecture
Application package is your target application which needs to be tested
InstrumentationTestRunner is the Test Case runner that executes test case on target application. It includes:
2a) Test tools: A SDK tools for building test. They are integrated in Eclipse IDE or run as command line. 2b) MonkeyRunner: A tool that provides APIs for writing program which control an Android device or emulator outside of Android code.
Test package are organized into test projects. This package follows naming convention. If the application under test has a package name of “com.mydomain.myapp” than Test package should be “com.mydomain.myapp.test” .Test package includes 2 objects as below:
3a) Test case classes:include test methods to executed on target application. 3b) Mock objects : includes mock data that will be used as sample input for test cases.
Android Test Case Classes
AndroidTestCase class diagram
TestCase includes JUnit methods to run JUnit test
TestSuite is used to run set of test cases
InstrumentationTestSuite is a TestSuite that injects Instrumentation into InstrumentationTestCase before running them.
InstrumentationTestRunner is the test case runner that execute test case on target application.
AndroidTestCase extends JUnit TestCase. It contains methods for accessing resources like Activity Context.
ApplicationTestCase verifies the Application classes in a controlled environment.
InstrumentationTestCase verifies a particular feature or behavior of target application , for e.g., verify UI output of application.
ActivityTestCase is base class that supports testing the Application Activities.
ProviderTestCase is class for testing single ContentProvider.
ServiceTestCase is used to test Service classes in testing environment. It also supports Service’s life cycle.
SingeLauchActivityTestCase is used to test single Activity with an InstrumentationTestCase.
ActivityUnitTestCase
ActivityInstrumentationTestCase2
Below is an example of ActivityInstrumentationTestCase. It verifies the UI operation of Calculator application, check the correctness of the UI outputs.
ActivityInstrumentationTestCase2 testing example
Robolectric testing framework
Testing using Android Testing framework with device or emulator is difficult. Building and running test is slow and take much development effort. To fix this problem, there’s another choice – Robolectric testing framework. Robolectric framework allows you to run Android tests directly on JVM without the need for a device or an emulator.
Advance features of Robolectric
Robolectric Test Case Classes
Operation of Robolectric
As shown above, Robolectric can perform following actions:
Register and create a Shadow class
Intercept the loading of Android class
Uses javaassist to override the method bodies of Android class
Bind Shadow object to Android class
This allows the code under test to execute without Android environment.
Others testing framework
Besides testing frameworks which were mentioned above, there are many other testing frameworks such as:
Android Junit Report, a custom instrumentation test runner for Android that generates XML reports for integration with other tools. Expresso
Appium
Myths of Android Testing
Many enterprises develop android Testing strategies that are based on common misconceptions. This section examines a few popular myths and realities of Android testing.
Appium
Myth #1:All Android devices are the same… test on emulators is enough Let’s start with a simple example. An application works perfectly on emulator s but on some real devices, it crashes during execution
Application crashes during execution on real device
Emulators are not sufficient for your mobile testing. You must test your app on real devices.
Myth #2:Testing on some common devices is enough
On different devices, your application looks different because different devices have different hardware, screen sizes, memory etc. You must test your application on different devices, OS versions, carrier networks and locations.
Myth#3:Exploratory testing just before launch is enough
Generally in all testing, we design the test cases then execute them. But in Exploratory testing, test design and execution all will be done together.
In exploratory testing, there’s no plan and no preparation, then tester would do tests that he wants to do. Some functions will be tested repeatedly, while some functions will not be tested altogether.
Myth#4:If there some bugs in application, users will understand
If application doesn’t work and has bugs, users uninstall your app
Quality issues are the first reason for bad review in Google Play. It affects to your reputation and you lose customer’s trust.
Therefore its essential to have a proper android testing strategy in place
Best practices in Android Testing
Application developers should create the test cases at the same time when they are writing the code
All test cases should be stored in version control-together with source code
Use continuous integration and run tests every time the code is changed
Avoid using emulators and rooted devices