Presentation from the GDG Munich Android meetup
Screenshotyour Entire AppEdward DaleFreeletics© Edward Dale, 2016 1
View Slide
Screenshotyour Entire Appwith Screengraband FirebaseEdward DaleFreeletics© Edward Dale, 2016 2
Find the bug(s)© Edward Dale, 2016 3
© Edward Dale, 2016 4
© Edward Dale, 2016 5
Some thingsare bestverified visually!Screenshot© Edward Dale, 2016 6
Screenshots are useful for• Acceptance testing• Edge case• Localization• Multiple devices• Regression testing© Edward Dale, 2016 7
Screenshot testing tools• Espresso tests• Dependency injection• Dependency mocking• Screengrab• Firebase Cloud Test Lab for Android© Edward Dale, 2016 8
Espresso test setup@MediumTestpublic class BuyCoachScreenGrab {@InjectDummyUserManager mUserManager;@Rulepublic ActivityTestRule mActivityRule =new ActivityTestRule<>(BuyCoachActivity.class,false, false);© Edward Dale, 2016 9
Automated localized screenshots of your Android app onevery deviceScreengrab ▶ Fastlane ▶ Fabric ▶ TwitterCombination of command-line tool and classes used in tests© Edward Dale, 2016 10
Screengrab test@Testpublic void testTestimonialMale() {when(mUserManager.getUser().getGender()).thenReturn(Gender.MALE);mActivityRule.launchActivity(new Intent());onView(withId(R.id.feature_pager_videos)).perform(scrollTo());Screengrab.screenshot("buy_coach_male_testimonial");}© Edward Dale, 2016 11
Screengrab test@Testpublic void testTestimonialMale() {when(mUserManager.getUser().getGender()).thenReturn(Gender.MALE);mActivityRule.launchActivity(new Intent());onView(withId(R.id.feature_pager_videos)).perform(scrollTo());Screengrab.screenshot("buy_coach_male_testimonial");}@Testpublic void testTestimonialFemale() {when(mUserManager.getUser().getGender()).thenReturn(Gender.FEMALE);mActivityRule.launchActivity(new Intent());onView(withId(R.id.feature_pager_videos)).perform(scrollTo());Screengrab.screenshot("buy_coach_female_testimonial");}© Edward Dale, 2016 12
Screengrab configurationapp_package_name 'com.freeletics.debug'app_apk_path 'Freeletics-debug.apk'tests_apk_path 'Freeletics-debug-androidTest.apk'locales ['en-US', 'fr-FR', 'it-IT', 'de-DE','pt-PT', 'es-ES', 'tr-TR', 'ja-JA']use_tests_in_classes ['com.freeletics.coach.view.BuyCoachScreenGrab']© Edward Dale, 2016 13
RunningScreengrab$ ./gradlew clean assembleDebug assembleDebugTest$ screengrab© Edward Dale, 2016 14
Firebase Cloud Test Lab forAndroidTest your app on devices hosted in a Google datacenter.Combination of command-line tool and classes used in testsAlso supports virtual devices© Edward Dale, 2016 15
Firebase Cloud Test Lab forAndroidTest your app on devices hosted in a Google datacenter.Combination of command-line tool and classes used in testsAlso supports virtual devices$€£¥© Edward Dale, 2016 16
Firebase test@Testpublic void testTestimonialMale() {when(mUserManager.getUser().getGender()).thenReturn(Gender.MALE);Activity activity = mActivityRule.launchActivity(new Intent());onView(withId(R.id.feature_pager_videos)).perform(scrollTo());ScreenShotter.takeScreenshot("buy_coach_male_testimonial", activity);}© Edward Dale, 2016 17
ScreengrabScreengrab.screenshot("buy_coach_male_testimonial");FirebaseScreenShotter.takeScreenshot("buy_coach_male_testimonial", activity);© Edward Dale, 2016 18
Running Firebasegcloud beta test android run--type instrumentation--app Freeletics-debug.apk--test Freeletics-debug-androidTest.apk--device-ids Nexus6--os-version-ids 21--locales en-US,fr-FR,it-IT,de-DE,pt-PT,es-ES,tr-TR,ja-JA--orientations portrait--test-targets "class com.freeletics.coach.view.BuyCoachScreenGrab"Also possible to stick this in a YML configuration file.© Edward Dale, 2016 19
ScreengrabvsFirebaseFight!© Edward Dale, 2016 20
Screengrab• ✅ Free• ✅ No waiting for a free device• ❌ Limited by your devices© Edward Dale, 2016 21
Firebase• ✅ Easy to setup a test matrix• ✅ Fits well with a CI system• ❌ Have to wait your turn• ❌ Costs money• $5/hour for real device• $1/hour for virtual device© Edward Dale, 2016 22
My suggestionUse both© Edward Dale, 2016 23
Cross-platform test@Testpublic void testTestimonialMale() {when(mUserManager.getUser().getGender()).thenReturn(Gender.MALE);Activity activity = mActivityRule.launchActivity(new Intent());onView(withId(R.id.feature_pager_videos)).perform(scrollTo());ScreenShotter.takeScreenshot("buy_coach_male_testimonial", activity);Screengrab.screenshot("buy_coach_male_testimonial");}Screengrab for daily developmentFirebase for CI regression testing© Edward Dale, 2016 24
Thanks!Edward Dale (@scompt)Freeletics (We're hiring)© Edward Dale, 2016 25