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
android-app-ui-testing
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
muran001
July 20, 2015
Programming
1.2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
android-app-ui-testing
DevOps勉強会#2 (
https://zawatt.doorkeeper.jp/events/27232
) で発表した資料です。
muran001
July 20, 2015
Other Decks in Programming
See All in Programming
Performance Engineering for Everyone
elenatanasoiu
0
270
初めてのKubernetes 本番運用でハマった話
oku053
0
130
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
共通化で考えるべきは、実装より公開する型だった
codeegg
0
240
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
320
act1-costs.pdf
sumedhbala
0
230
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
580
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
490
Featured
See All Featured
Utilizing Notion as your number one productivity tool
mfonobong
4
420
Typedesign – Prime Four
hannesfritz
42
3.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
610
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
Product Roadmaps are Hard
iamctodd
55
12k
The Language of Interfaces
destraynor
162
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Transcript
"OESPJEΞϓϦͷ6*ςετΛ %FW0QTษڧձ!౦ژ .BTBUPTIJ.VSBLBNJ $JSDMF$*ͰͿΜճ͢
NVSBO .BTBUPTIJ.VSBLBNJ -JWFOTF *OD
2JJUBͬͯ·͢ʂ
ຊͷ͋Β͢͡ UIテスト ͜͜ΒΜ
ΞϓϦͷಈ࡞֬ೝؤுͬͯ·͔͢ʁ
ਓւઓज़Ͱͬͯ·͢ʂʢΩϦο εΫϦʔϯγϣοτࡱͬͯ&YDFMʹʜ
ਖ਼μα͍ɺͦͯ͠πϥ͍
ΠέͯΔΓํͳ͍ͷ͔ʁ
ࣗಈ 6*ςετͰ͠ΐʂʂ ʢ͑
"OESPJEͷ6*ςετ • 3PCPUJVN • &TQSFTTP • 6*"VUPNBUPS • "QQJVN •
ɾɾɾ ΤϛϡϨʔλΛͬͯࣗಈͰಈ࡞֬ೝ
&TQSFTTPͬͨྫ @RunWith(AndroidJUnit4.class) public class EspressoTest extends ActivityInstrumentationTestCase2<TopActivity> { 〜略〜 @Test
public void squareTest() { onView(withId(R.id.result_text)).check(match(withText(“2”))); onView(withId(R.id.square_button)).perform(click()); onView(withId(R.id.result_text)).check(match(withText(“4”))); } 〜略〜 } テスト対象 特定の要素に テスト内容 特定の文字列が表示されている
&TQSFTTPͷ࣮ߦ $ ./gradlew connectedAndroidTest &TQSFTTPͷ݁Ռ֬ೝ $ open app/build/outputs/reports/androidTests/connected/index.html
ෳಉ࣌ςετ (*'Ξχϝʣ BOESPJE BOESPJE BOESPJE
ಛผͷઃఆෆཁɻςετલʹෳΤϛϡϨʔλىಈ͢Δ͚ͩ
Ϩϙʔτྫ
ϨϙʔτΠέͯͳ͍ɹʕ→ᴥ←ʔ
ΠέͯΔϨϙʔτπʔϧ4QPPO ҆৺ͷ4RVBSF
4QPPOͷ͍͍ͱ͜Ζ • σόΠεʢΤϛϡϨʔλʣຖʹϨϙʔτ͚ • ςετͰεΫϦʔϯγϣοτΛࡱΕΔ • εΫϦʔϯγϣοτΛϨϙʔτʹฒͯ͘ΕΔ • εΫϦʔϯγϣοτΛ(*'Ξχϝʹͯ͘͠ΕΔ •
ৄࡉϩάݟ͍͢ • ɾɾɾ
4QPPOͷϨϙʔτྫ̍
4QPPOͷϨϙʔτྫ̎
͜ΕͰΞϓϦ։ൃָ͕͘͠ͳͬͨʁ
͍͍͑ɺͦΕ͕ۤͷ࢝·ΓͰͨ͠
• ෳಉ࣮࣌ߦͯ͠.BDCPPL͕͓ͪΔ • ࣮ߦͷʹϨϙʔτ͕ΫϦΞ͞ΕΔ • εΫϦʔϯϩοΫঢ়ଶͩͱࣦഊ͢Δʢෳղআ໘ʣ • ϩʔΧϧͰ࣮ߦͯ͠ଞͷ։ൃऀͱ݁Ռڞ༗Ͱ͖ͳ͍ʢࣗݾຬʣ • ɾɾɾɾ
6*ςετʹཱ͔ͪͩΔน ࣗͷ1$ͰΖ͏ͱ͢Δͱ
ͦΕ $*ͰղܾͰ͖ͳ͍ͷʁ
+FOLJOT͏ʁ "OESPJE&NVMBUPS1MVHJO͕ෆ҆ఆ ͦͦ+FOLJOTΠέͯͳ͍
ΞϓϦ։ൃͱ͍͑$JSDMF$*Ͱ͠ΐʂ
ਏ͍֨ಆͷ࢝·Γ
֨ಆ̍ ϔουϨεͳΤϛϡϨʔλʔߏங ը໘ͳ͠ͷΤϛϡϨʔλͬͯ࡞ΕΔͷʁ
ΤϛϡϨʔλ࡞ $ echo n | android create avd --force –name
my-android-21 --target android-21 ΤϛϡϨʔλΛϔουϨεىಈ $ emulator -avd circleci-android-21 -no-skin -no-audio -no-window & ҰԠͰ͖Δ͜ͱ͕Θ͔ͬͨ
ΤϛϡϨʔλىಈͪ $ adb shell getprop init.svc.bootanim stopped ىಈྃ ʹϒʔτΞχϝʔγϣϯ͕ऴྃ ʹJOJUTWDCPPUBOJNϓϩύςΟ͕TUPQQFE
#!/bin/bash 〜略〜 STATUS=$(adb shell getprop init.svc.bootanim | tr –d [:space:]) while [ ”$STATUS" != “stopped" ]; do sleep 2 STATUS=$(adb shell getprop init.svc.bootanim | tr -d [:space:]) done BECXBJUGPSEFWJDF͑ͳ͍ͷͰఆظతʹঢ়ଶࢹ TUPQQFEʹͳΔ·Ͱ̎ඵ͓͖ʹ֬ೝ ˠىಈ͖͠Βͳ͍ͱςετΛೖͰ͖ͳ͍
εΫϦʔϯϩοΫղআ $ adb shell input keyevent 82 ͳΜ͔ͨ·ʹ͜Ε͕Ͱ͖ͳ͍߹͕͋Δ͚ͲṖ ΩʔΠϕϯτΛൃߦ͠ϩοΫΛղআ ˠىಈྃͯ͠ϩοΫ͞Εͨ··ͳΒςετೖͰ͖ͳ͍ʢϔουϨε͔ͩΒؾ͖ͮʹ͍͘55
࣮ͦͯ͠ߦͯ͠ΈΔͱɾɾɾ ςετམͪΔ ཧ༝ • ը໘αΠζখ͔͗ͨ͢͞Β • 4%ΧʔυྖҬͳ͔͔ͬͨΒ
ΤϛϡϨʔλʔىಈΛௐ͢Δ $ echo n | android create avd --force –name
my-android-21 --target android-21 -c 50M -s WXGA800 ͜ΕͰແࣄϩʔΧϧڥͰϔουϨεͳςετ͕௨Γ·ͨ͠ ը໘αΠζɺ4%Χʔυ༰ྔΛࢦఆ
֨ಆ̎ $JSDMF$*Ͱ࣮ߦ $JSDMF$*ͰϔουϨεͳςετͰ͖Μͷʁ
DJSDMFZNM࡞ʢͳ͍ͷՃʣ # circle.yml 〜 略 〜 dependencies: pre: - echo y
| android update sdk --no-ui --all --filter "extra-android-m2repository" - echo y | android update sdk --no-ui --all --filter "extra-android-support" - echo y | android update sdk --no-ui --all --filter "extra-google-m2repository” 〜 略 〜 ˠϓϦΠϯετʔϧͯ͠Δͬͯॻ͍ͯ͋Δͷʹೖͬͯͳ͔ͬͨ ϓϦΠϯετʔϧ࣮͞Εͯͳ͔ͬͨͷΛΠϯετʔϧ
ෳΤϛϡϨʔλىಈͪ $ circle-‐android wait-‐for-‐boot ࣮༻ҙ͞Ε͍ͯͨɻͰ̍ ෳ͋Δ߹ɺ શىಈ͔ྃͯ͠Βςετೖ͢Δඞཁ͋Γ
Ͳ͏͢Δʂʁʁ ˠىಈͪεΫϦϓτ࣮͋ͬͨʂʂͰ̍ͷΈରԠͩͬͨɾɾɾ
ෳΤϛϡϨʔλىಈͪ XBJUGPSCPPUΛෳʹରԠͤ͞Δํ๏͋Δʁ ͋ͬͨΒڭ͑ͯ͘Μͳ͍ʁ ͶʔΑLTHʂ ͨͩͷγΣϧεΫϦϓτ͔ͩΒࣗͰվ͠Ζ ࢲ தͷਓ தͷਓʹνϟοτͰ͍߹ΘͤͯΈͨɾɾɾɾ
ʀТʀʆ ŲƄƂŕ ࢲ
ෳΤϛϡϨʔλىಈͪ ํͳ͘࡞ͬͨɾɾɾৄࡉ8&#Ͱ # 複数台の起動と起動完了待ち $ start-emulators # 複数台のスクリーンロック解除
$ unlock-emulators # 複数台の停止 $ stop-emulators
4QPPO࣮ߦ # circle.yml test: override: 〜略〜 - ./gradlew spoon ͜ΕͰແࣄ$JSDMF$*ڥͰςετ͕௨Γ·ͨ͠
$JSDMF$*্ͰϨϙʔτӾཡ օͰڞ༗Ͱ͖ΔɹˍɹϨϙʔτ͕ͣͬͱΔ
֨ಆ $JSDMF$*Ͱෳ࣮ߦ $JSDMF$*ͷੑೳΓΔʁ
ઃఆෳ૿͚ͩ͢ # circle.yml 〜 略 〜 test: pre: - echo n
| android create avd --force --name circleci-android-21 --target android-21 -s WXGA800 - echo n | android create avd --force --name circleci-android-19 --target android-19 -s WXGA800 - emulator -avd circleci-android-21 -no-skin -no-audio -no-window: background: true parallel: true - emulator -avd circleci-android-19 -no-skin -no-audio -no-window: background: true parallel: true - ./start-emulators override: - ./unlock-emulators - ./gradlew spoon –PdisablePreDex post: - ./stop-emulators 〜 略 〜 ˡࣗ࡞ͷΞϨ ˡࣗ࡞ͷΞϨ ˡࣗ࡞ͷΞϨ ˢ̎ىಈ ˢ̍ىಈ ˢ̎࡞ ˢ̍࡞
ཧ༝ • ϝϞϦΓͳ͍ͱڧ੍తʹམͪΔ ࣮ͦͯ͠ߦͯ͠ΈΔͱɾɾɾ ςετམͪΔ
1SF%FYJOHΛແޮԽ 設定はWEBで http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server- performance ϝϞϦઃఆมߋ machine: environment: JAVA_OPTS: "-Xms256m -Xmx512m”
ىಈݮΒ͢ ˠ͕̎ݶքͳײ͡ʢίϯςφ૿͢ͱ͍͚Δ͔ʁʣ
͍ઓ͍ʹউར(๑•̀ŷ•́)و✧
·ͱΊ • ΞϓϦͷ6*ςετϋϚΓͲ͜Ζຬࡌ • ΤϛϡϨʔλʔͷίϚϯυૢ࡞ͱྑ͘ͳΓ·͠ΐ͏ • ͦ͜ΛΓӽ͑Δͱ͕͍ͤͬͯΔ • ΞϓϦͷόʔδϣϯຖ֬ೝΛਓखͰΒͳͯ͘ࡁΉ •
࣮ػΛෳܨ͛Εػछґଘͷ֬ೝͰ͖Δ • 6*ςετ30*Λߟ࣮͑ͭͭ͠Α͏ • ,1*ʹؔͦ͠͏ͳओཁಋઢʹߜͬͯಋೖ͢Δͷ͕͓͢͢Ί