Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Screenshot your Entire App with Screengrab and ...
Search
Edward Dale
November 03, 2016
Technology
510
0
Share
Screenshot your Entire App with Screengrab and Firebase
Presentation from the GDG Munich Android meetup
Edward Dale
November 03, 2016
More Decks by Edward Dale
See All by Edward Dale
Write your own ProGuard
scompt
1
240
ProGuard
scompt
1
530
Screenshot your Entire App
scompt
1
2k
Reactive In-App Billing on Android
scompt
2
330
Fitness Motion Recognition with Android Wear
scompt
1
500
Android Apps with Mortar and Flow
scompt
7
1.7k
Functional Reactive Programming in the Mobile World
scompt
2
370
Other Decks in Technology
See All in Technology
シンデレラなんかになりたくない!ガラスの靴が割れた時代にどう歩く?
nomizone
0
190
Amazon Bedrock 経由の Claude Cowork を試してみよう・MCP にも繋いでみよう
sugimomoto
0
180
大規模環境でどのように監視を実現する?
yuobayashi
1
140
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
0
420
Gradle×GitHub_ActionsでCI時間を約50%短縮 ジョブ分割の設計と落とし穴 / Cutting CI Time by ~50% with Gradle and GitHub Actions: Job-Splitting Design and Pitfalls
takatty
0
120
【ハノーバーメッセ振り返りイベントat名古屋】データは集約からAI起点の収集に ~組織内・組織間でのデータ連携~
tanakaseiya
0
110
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
280
管理アカウント単一運用からAWS Organizationsに移行するの大変で滅
hiramax
0
230
TypeScript で Platform SDK を作る技術
toiroakr
1
290
TypeScript の型で副作用の実行順序を制御する
yanaemon
2
210
「使われるデータ基盤」を目指してデータアナリストとワークショップをやった話
jackojacko_
2
860
checker.tsにチキンレースを仕掛けてみた:型エラー(TS2589)が発生する境界線を求めて
hal_spidernight
1
200
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
190
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Evolving SEO for Evolving Search Engines
ryanjones
0
200
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
510
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
240
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
140
Visualization
eitanlees
151
17k
We Have a Design System, Now What?
morganepeng
55
8.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Color Theory Basics | Prateek | Gurzu
gurzu
0
310
Transcript
Screenshot your Entire App Edward Dale Freeletics © Edward Dale,
2016 1
Screenshot your Entire App with Screengrab and Firebase Edward Dale
Freeletics © Edward Dale, 2016 2
Find the bug(s) © Edward Dale, 2016 3
© Edward Dale, 2016 4
© Edward Dale, 2016 5
Some things are best verified 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 @MediumTest public class BuyCoachScreenGrab { @Inject DummyUserManager
mUserManager; @Rule public ActivityTestRule<BuyCoachActivity> mActivityRule = new ActivityTestRule<>(BuyCoachActivity.class, false, false); © Edward Dale, 2016 9
Automated localized screenshots of your Android app on every device
Screengrab ▶ Fastlane ▶ Fabric ▶ Twitter Combination of command-line tool and classes used in tests © Edward Dale, 2016 10
Screengrab test @Test public 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 @Test public 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"); } @Test public 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 configuration app_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
Running Screengrab $ ./gradlew clean assembleDebug assembleDebugTest $ screengrab ©
Edward Dale, 2016 14
Firebase Cloud Test Lab for Android Test your app on
devices hosted in a Google datacenter. Combination of command-line tool and classes used in tests Also supports virtual devices © Edward Dale, 2016 15
Firebase Cloud Test Lab for Android Test your app on
devices hosted in a Google datacenter. Combination of command-line tool and classes used in tests Also supports virtual devices $€£¥ © Edward Dale, 2016 16
Firebase test @Test public 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
Screengrab Screengrab.screenshot("buy_coach_male_testimonial"); Firebase ScreenShotter.takeScreenshot("buy_coach_male_testimonial", activity); © Edward Dale, 2016 18
Running Firebase gcloud 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
Screengrab vs Firebase Fight! © 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 suggestion Use both © Edward Dale, 2016 23
Cross-platform test @Test public 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 development Firebase for CI regression testing © Edward Dale, 2016 24
Thanks! Edward Dale (@scompt) Freeletics (We're hiring) © Edward Dale,
2016 25