unit & automation testing in android - stanislav gatsev, melon
TRANSCRIPT
![Page 1: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/1.jpg)
Unit and
Automation
Testing
on Android
Stanislav Gatsev
Android Team Lead,
Melon Inc.
![Page 2: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/2.jpg)
Who am I?
Stanislav Gatsev
Android Team Lead
+359 89 891 4481
http://www.melon.bg
![Page 3: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/3.jpg)
What is Android?
o World's most popular mobile
platform
o Every day another million users
power up their Android devices for
the first time
o Using Android SDK we can develop
software for almost everything from
smartphones and tablets to
glasses, watches, TVs and even
cars.
![Page 4: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/4.jpg)
Why we automate testing?
o We save time !!!
o We improve our code quality
o We support live documentation
o We run our regression tests
o We fight fragmentation
![Page 5: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/5.jpg)
Our Example Project
![Page 6: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/6.jpg)
What Can We Test?
o We can test our logic, algorithms, calculations
o We can test our UI and navigation logic
o We can test IO operations, database and network operations
o And more...
@SmallTest
public void test_addOperatorInJava() throws Exception {
Assert.assertEquals(4, 2 + 2);
Assert.assertEquals(27, 25 + 2);
}
@SmallTest
public void test_FieldsAreVisible() {
ViewAsserts.assertOnScreen(mRootView, mEmailEditText);
ViewAsserts.assertOnScreen(mRootView, mPasswordEditText);
ViewAsserts.assertOnScreen(mRootView, mLoginActionLayout);
}
![Page 7: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/7.jpg)
How we automate testing?
o We use JUnit
o We mock our objects
o We are using activity testing framework
o We click with Robotium
![Page 8: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/8.jpg)
JUnit and Android We can use the JUnit TestCase class to do unit testing on a class that
doesn't call Android APIs. TestCase is also the base class for
AndroidTestCase, which we can use to test Android-dependent objects.
Besides providing the JUnit framework, AndroidTestCase offers
Android-specific setup, teardown, and helper methods.
public class UtilTests extends AndroidTestCase {
@SmallTest
public void test_StringToLatLngValidValues() throws Exception {
String latLngString = "34.009555,-118.497072";
LatLng latLng = Util.stringToLatLng(latLngString);
Assert.assertEquals(Double.compare(latLng.latitude, 34.009555), 0);
Assert.assertEquals(Double.compare(latLng.longitude, -118.497072), 0);
}
@SmallTest
public void test_StringToLatLngValidInvalues() throws Exception {
String latLngString = "34.009555,-a118.497072";
LatLng latLng = Util.stringToLatLng(latLngString);
Assert.assertEquals(Double.compare(latLng.latitude, 0), 0);
Assert.assertEquals(Double.compare(latLng.longitude, 0), 0);
}
}
![Page 9: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/9.jpg)
Why we use Mocks?
The objective of unit testing is to exercise just one method at a time, but what
happens when that method depends on other things—hard-to-control things
such as the network, or a database.
The solution is the Mock object. It is simply a debug replacement for a real-
world object.
![Page 10: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/10.jpg)
Mockito
Mockito is the way we mock objects in Android. As its developers say:
“Mockito is a mocking framework that tastes really good. It lets you write
beautiful tests with clean & simple API. Mockito doesn't give you hangover
because the tests are very readable and they produce clean verification
errors.”
• https://code.google.com/p/dexmaker/
• System property hack
![Page 11: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/11.jpg)
Mockito and Android
//create Mock of server communication
final WeatherServerRequest weatherServerRequest =
Mockito.mock(WeatherServerRequest.class);
//stub the actual network call and return empty object
ServerResponse serverResponse = new ServerResponse();
Mockito.when(weatherServerRequest.getResponse()).thenReturn(serverResponse);
//create mock of the refresh-able and the observers subject
IRefreshable refreshable = Mockito.mock(IRefreshable.class);
ISubject subject = Mockito.mock(ISubject.class);
runWeatherWorkerThread(refreshable, subject, weatherServerRequest);
//verify if refresh-able start callback is called
Mockito.verify(refreshable).onStartRefresh();
//verify if the observers callback is called
Mockito.verify(subject).updateData(Mockito.anyMapOf(String.class,
ServerResponse.class));
//verify if refresh-able end callback is called
Mockito.verify(refreshable).onEndRefresh();
=+
![Page 12: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/12.jpg)
Activity tests
ActivityInstrumentationTestCase2
This is the class which helps us test our Activities. It has direct reference to the
tested activity and you have the ability to run whole test or just parts of it in the
UI Thread.
@SmallTest
public void test_viewPagerHasAllLocations() throws Throwable {
//Creates the data fetcher mock and injects it to the Activity for every test
createDataFetcherMock();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
//reinitialize activity with new data fetcher
getActivity().init();
}
});
//asserts if the view pager has the same number of items the data fetcher returned
Assert.assertEquals(3, mViewPager.getAdapter().getCount());
}
![Page 13: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/13.jpg)
Robotium
o It is a lot easier to write our automation tests
o Helpful API for executing user actions
o Flexible results assertion
o Hybrid apps are supported
o We can use it in our Activity tests
![Page 14: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/14.jpg)
Robotium in action
@LargeTest
public void test_addNewLocation() throws Throwable {
getInstrumentation().waitForIdleSync();
moveMapToPosition();
getInstrumentation().waitForIdleSync();
//gets the root view of the Activity
View rootView = getActivity().findViewById(android.R.id.content);
//long click in the center of the screen
mSolo.clickLongOnScreen(rootView.getWidth()/2, rootView.getHeight()/2);
getInstrumentation().waitForIdleSync();
//get first weather location
WeatherDataFetcher dataFetcher = getActivity().getDataFetcher();
List<WeatherLocation> weatherLocations = dataFetcher.getLocationsList();
Assert.assertEquals(1, weatherLocations.size());
//check if the location is the right one
WeatherLocation weatherLocation = weatherLocations.get(0);
Assert.assertEquals("Santa Monica, CA", weatherLocation.getLocationName());
//clears DB
dataFetcher.removeLocation(0);
}
![Page 15: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/15.jpg)
Thank you!
Questions?
![Page 16: Unit & Automation Testing in Android - Stanislav Gatsev, Melon](https://reader033.vdocuments.net/reader033/viewer/2022052822/554d2b6fb4c905ab268b4fad/html5/thumbnails/16.jpg)
References
o https://developer.android.com
o https://code.google.com/p/robotium/
o https://github.com/mockito/mockito
o http://blog.gfader.com/2010/10/why-are-automated-tests-so-important.html
o http://media.pragprog.com/titles/utj/mockobjects.pdf
o http://www.embedded.com/design/prototyping-and-
development/4398723/The-mock-object-approach-to-test-driven-
development