Ondra začal psát pro blog Sama Lu (který je například autorem velmi oblíbené aplikace aTrackDog) tuto sérii článků o testování androidích aplikací. Články jsou sice v angličtině, ale jsou natolik zajímavé, že nám přišlo škoda nepodělit se o ně. Ale nebojte, rozhodně to neznamená, že bychom na našem webu začali psát už jen anglicky…
Unit tests and testing are parts of each developer’s life and they are important parts of development. Developers usually concentrate on unit tests which help them ensure that future changes will not break the system and let other people do tests and stress tests of applications to reveal bugs, which we as developers simply cannot see.
About This Series of Articles
This is the first article about testing Android applications. We will look at some testing background, discuss basic elements available for you in the SDK and show how to prepare testing environment to run tests. In following articles we will concentrate on describing testing methods in detail.
Short History of Android Testing
Prior to Android SDK 1.0 there was a huge gap in testing of android applications which inspired 3rd-party testing frameworks such as Positron and Electron. With Android SDK 1.0 Google filled the gap with its own testing framework and Positron and Electron frameworks are not needed any more. Filled the gap in
testing and filled it well. Let’s have a look at what is available there for us. We will concentrate on unit and functional test which are supported with new part of Android SDK.
There are basically three levels of tests/unit-test you can use in your application:
- Unit testing of logic which does not depend on android at all. This is similar to every usual unit testing. Running tests directly from Eclipse requires some configuration changes which we will cover later.
- Unit testing of business logic which depends on Android but does not depend on Android application elements and ui. These logic does not require activity to be running with complete context and it can be tested in isolation from ui. These tests usually require something from context (e.g. resources, configuration, logger, some native classes)
- Unit/funcional testing of Android application elements. These tests are fully instantiated activities, services, content providers and applications. Via instrumentation it is possible to send keyboard and touch events to the activities and check response in ui. It is possible to test lifecycle of a service and to test databases changes made by content provider.
To be able to test layers of the application in isolation using and fully use prevoius three levels. It is useful to follow these guidelines during design and development phases of your Android application:
AnTuTu Benchmark mění způsob hodnocení. Změřte si, jak je na tom váš telefon
- Separate business logic from ui logic as much as possible.
- Create presenter for complicated activities which models state on the screen and binds to the views according to MVP pattern.
- Make clear non expansive contracts between ui layer and business logic.
- Return error codes from business logic and let present logic transform them to error messages.
- Pass configuraton stored in preferences or in resources in parameters and do not load it in business logic
How to Prepare Testing Environment for Unit Tests
Good starting point for preparing environment for tests which do not depend on Android can be found here. Android runtime in android.jar contains some subset of junit which can not be used out of android environment. If you try to run unit test directly from Eclipse, you get exception like this:
Internal Error (classFileParser.cpp:2924), pid=11018, tid=3084700560 # Error: ShouldNotReachHere()
To be able to run tests from Eclipse you have to replace android.jar by junit.jar
- go to “Run Configurations”
- search for configuration running your unit test
- go to “Classpath” tab
- remove “Android Library” from “Bootstrap Entries”
- then go to project build path configuration
- and add Junit library to your project
- you should be able to run junit unit tests
Image on the left shows “Run Configuration” dialog with Android library not deleted and image on the right shows configuration of build path. It is sometimes even possible to unit test classes which depends on classes from android.jar by deleting junit classes in the jar file. But once tested classes requires something from android runtime, you get exceptions.
Setup for Tests Depending on Android
Good starting point is here which shows how to set separate application and test environment but does not
show that is possible to have everything working together in one project. You have to setup instrumentation for your project which allows your tests to hook into your application and take control over application ui and pass various events.
- Add library definition to elements in your manifest file
<uses-library android:name=”android.test.runner” />
- Add test runner definition to your manifest file
android:label=“Tests for Small Applacation” />
- android:name is name of the test runner class – use android.test.InstrumentationTestRunner as default
- android:targetPackage is application package you want to instrument
- android:label is name of the test which appears under Instrumentation in Dev Tools application
How to Run Tests Depending on Android in Eclipse and Emulator
To run tests directly from emulator go to DevTools application in the emulator, select Instrumentation and click on the name of the tests you want to run. Results and lot of debugging output can be found in Logcat console.
How to Run Tests Depending on Android with adb
To run tests from command line enter:
adb shell am instrument -w PACKAGE/android.test.InstrumentationTestRunner
where PACKAGE is full name of application package which should be instrumented.
Does everything seem to be too complicated for you? Do you wonder if there is simple way how to test Android application? The answer is UI/Application Exerciser Monkey tool available in Android SDK. Monkey is quite fast way for testing of ui. Just be warned that monkey does not like real devices yet. There is bug which causes that monkey is killed by Android whenever it tries to send a notification key to the real T-Mobile G1 device. Now our clever monkey likes to work without bugs with the emulator only.
So far we know what we can test on Android application and we know how to setup and run various kinds of tests. Next time we will look at some tips and hints how to actually write unit and functional tests.
Proč (ne)vypnout aplikaci Svět Androida?