Slide 1

Slide 1 text

"OESPJEΞϓϦͷ6*ςετΛ  %FW0QTษڧձ!౦ژ  .BTBUPTIJ.VSBLBNJ $JSDMF$*ͰͿΜճ͢

Slide 2

Slide 2 text

NVSBO .BTBUPTIJ.VSBLBNJ -JWFOTF *OD

Slide 3

Slide 3 text

2JJUB΍ͬͯ·͢ʂ

Slide 4

Slide 4 text

ຊ೔ͷ͋Β͢͡     UIテスト ͜͜Β΁Μ

Slide 5

Slide 5 text

ΞϓϦͷಈ࡞֬ೝؤுͬͯ·͔͢ʁ

Slide 6

Slide 6 text

ਓւઓज़Ͱ΍ͬͯ·͢ʂʢΩϦο εΫϦʔϯγϣοτࡱͬͯ&YDFMʹʜ

Slide 7

Slide 7 text

ਖ਼௚μα͍ɺͦͯ͠πϥ͍

Slide 8

Slide 8 text

ΠέͯΔ΍Γํ͸ͳ͍ͷ͔ʁ

Slide 9

Slide 9 text

ࣗಈ 6*ςετͰ͠ΐʂʂ  ʢ਒͑੠

Slide 10

Slide 10 text

"OESPJEͷ6*ςετ •  3PCPUJVN •  &TQSFTTP •  6*"VUPNBUPS •  "QQJVN •  ɾɾɾ  ΤϛϡϨʔλΛ࢖ͬͯࣗಈͰಈ࡞֬ೝ

Slide 11

Slide 11 text

&TQSFTTP࢖ͬͨྫ @RunWith(AndroidJUnit4.class) public class EspressoTest extends ActivityInstrumentationTestCase2 { 〜略〜 @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”))); } 〜略〜 } テスト対象   特定の要素に テスト内容   特定の文字列が表示されている

Slide 12

Slide 12 text

&TQSFTTPͷ࣮ߦ $ ./gradlew connectedAndroidTest &TQSFTTPͷ݁Ռ֬ೝ $ open app/build/outputs/reports/androidTests/connected/index.html

Slide 13

Slide 13 text

ෳ਺ಉ࣌ςετ (*'Ξχϝʣ  BOESPJE   BOESPJE   BOESPJE  ಛผͷઃఆෆཁɻςετલʹෳ਺ΤϛϡϨʔλىಈ͢Δ͚ͩ

Slide 14

Slide 14 text

Ϩϙʔτྫ

Slide 15

Slide 15 text

ϨϙʔτΠέͯͳ͍ɹʕ→ᴥ←ʔ

Slide 16

Slide 16 text

ΠέͯΔϨϙʔτπʔϧ4QPPO ҆৺ͷ4RVBSF੡ 

Slide 17

Slide 17 text

4QPPOͷ͍͍ͱ͜Ζ •  σόΠεʢΤϛϡϨʔλʣຖʹϨϙʔτ෼͚ •  ςετ಺ͰεΫϦʔϯγϣοτΛࡱΕΔ •  εΫϦʔϯγϣοτΛϨϙʔτʹฒ΂ͯ͘ΕΔ •  εΫϦʔϯγϣοτΛ(*'Ξχϝʹͯ͘͠ΕΔ •  ৄࡉϩά΋ݟ΍͍͢ •  ɾɾɾ

Slide 18

Slide 18 text

4QPPOͷϨϙʔτྫ̍

Slide 19

Slide 19 text

4QPPOͷϨϙʔτྫ̎

Slide 20

Slide 20 text

͜ΕͰΞϓϦ։ൃָ͕͘͠ͳͬͨʁ

Slide 21

Slide 21 text

͍͍͑ɺͦΕ͕ۤ೰ͷ࢝·ΓͰͨ͠

Slide 22

Slide 22 text

•  ෳ਺ಉ࣮࣌ߦͯ͠.BDCPPL͕͓ͪΔ •  ࣮ߦͷ౓ʹϨϙʔτ͕౎౓ΫϦΞ͞ΕΔ •  εΫϦʔϯϩοΫঢ়ଶͩͱࣦഊ͢Δʢෳ਺୆ղআ໘౗ʣ •  ϩʔΧϧͰ࣮ߦͯ͠΋ଞͷ։ൃऀͱ݁Ռڞ༗Ͱ͖ͳ͍ʢࣗݾຬʣ •  ɾɾɾɾ 6*ςετʹཱͪ͸͔ͩΔน ࣗ෼ͷ1$Ͱ΍Ζ͏ͱ͢Δͱ

Slide 23

Slide 23 text

ͦΕ $*ͰղܾͰ͖ͳ͍ͷʁ

Slide 24

Slide 24 text

+FOLJOT࢖͏ʁ "OESPJE&NVMBUPS1MVHJO͕ෆ҆ఆ ͦ΋ͦ΋+FOLJOTΠέͯͳ͍

Slide 25

Slide 25 text

ΞϓϦ։ൃͱ͍͑͹$JSDMF$*Ͱ͠ΐʂ

Slide 26

Slide 26 text

ਏ͍֨ಆͷ࢝·Γ

Slide 27

Slide 27 text

֨ಆ̍  ϔουϨεͳΤϛϡϨʔλʔߏங ը໘ͳ͠ͷΤϛϡϨʔλͬͯ࡞ΕΔͷʁ

Slide 28

Slide 28 text

ΤϛϡϨʔλ࡞੒ $ echo n | android create avd --force –name my-android-21 --target android-21 ΤϛϡϨʔλΛϔουϨεىಈ $ emulator -avd circleci-android-21 -no-skin -no-audio -no-window & ҰԠͰ͖Δ͜ͱ͕Θ͔ͬͨ

Slide 29

Slide 29 text

ΤϛϡϨʔλىಈ଴ͪ $ 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ʹͳΔ·Ͱ̎ඵ͓͖ʹ֬ೝ ˠىಈ͖͠Βͳ͍ͱςετΛ౤ೖͰ͖ͳ͍

Slide 30

Slide 30 text

εΫϦʔϯϩοΫղআ $ adb shell input keyevent 82 ͳΜ͔ͨ·ʹ͜Ε͕Ͱ͖ͳ͍৔߹͕͋Δ͚ͲṖ ΩʔΠϕϯτΛൃߦ͠ϩοΫΛղআ ˠىಈ׬ྃͯ͠΋ϩοΫ͞Εͨ··ͳΒςετ౤ೖͰ͖ͳ͍ʢϔουϨε͔ͩΒؾ͖ͮʹ͍͘55

Slide 31

Slide 31 text

࣮ͦͯ͠ߦͯ͠ΈΔͱɾɾɾ   ςετམͪΔ ཧ༝ •  ը໘αΠζখ͔͗ͨ͢͞Β •  4%ΧʔυྖҬͳ͔͔ͬͨΒ

Slide 32

Slide 32 text

ΤϛϡϨʔλʔىಈΛௐ੔͢Δ $ echo n | android create avd --force –name my-android-21 --target android-21 -c 50M -s WXGA800 ͜ΕͰແࣄϩʔΧϧ؀ڥͰϔουϨεͳςετ͕௨Γ·ͨ͠ ը໘αΠζɺ4%Χʔυ༰ྔΛࢦఆ

Slide 33

Slide 33 text

֨ಆ̎  $JSDMF$*Ͱ࣮ߦ $JSDMF$*ͰϔουϨεͳςετͰ͖Μͷʁ

Slide 34

Slide 34 text

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” 〜 略 〜 ˠϓϦΠϯετʔϧͯ͠Δͬͯॻ͍ͯ͋Δͷʹೖͬͯͳ͔ͬͨ ϓϦΠϯετʔϧ࣮͸͞Εͯͳ͔ͬͨ΋ͷΛΠϯετʔϧ

Slide 35

Slide 35 text

ෳ਺୆ΤϛϡϨʔλىಈ଴ͪ   $  circle-­‐android  wait-­‐for-­‐boot   ࣮͸༻ҙ͞Ε͍ͯͨɻͰ΋̍୆෼ ෳ਺୆͋Δ৔߹ɺ શ୆ىಈ׬͔ྃͯ͠Βςετ౤ೖ͢Δඞཁ͋Γ Ͳ͏͢Δʂʁʁ ˠىಈ଴ͪεΫϦϓτ࣮͸͋ͬͨʂʂͰ΋̍୆෼ͷΈରԠͩͬͨɾɾɾ

Slide 36

Slide 36 text

ෳ਺୆ΤϛϡϨʔλىಈ଴ͪ   XBJUGPSCPPUΛෳ਺୆ʹରԠͤ͞Δํ๏͋Δʁ ͋ͬͨΒڭ͑ͯ͘Μͳ͍ʁ ͶʔΑLTHʂ ͨͩͷγΣϧεΫϦϓτ͔ͩΒࣗ෼Ͱվ଄͠Ζ ࢲ தͷਓ தͷਓʹνϟοτͰ໰͍߹ΘͤͯΈͨɾɾɾɾ ʀТʀʆ ŲƄƂŕ ࢲ

Slide 37

Slide 37 text

ෳ਺୆ΤϛϡϨʔλىಈ଴ͪ   ࢓ํͳ͘࡞ͬͨɾɾɾৄࡉ͸8&#Ͱ # 複数台の起動と起動完了待ち $ start-emulators # 複数台のスクリーンロック解除 $ unlock-emulators # 複数台の停止 $ stop-emulators

Slide 38

Slide 38 text

4QPPO࣮ߦ # circle.yml test: override: 〜略〜 - ./gradlew spoon ͜ΕͰແࣄ$JSDMF$*؀ڥͰςετ͕௨Γ·ͨ͠

Slide 39

Slide 39 text

$JSDMF$*্ͰϨϙʔτӾཡ օͰڞ༗Ͱ͖ΔɹˍɹϨϙʔτ͕ͣͬͱ࢒Δ

Slide 40

Slide 40 text

֨ಆ  $JSDMF$*Ͱෳ਺࣮ߦ $JSDMF$*ͷੑೳ଍ΓΔʁ

Slide 41

Slide 41 text

ઃఆ͸ෳ਺෼૿΍͚ͩ͢ # 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 〜 略 〜 ˡࣗ࡞ͷΞϨ ˡࣗ࡞ͷΞϨ ˡࣗ࡞ͷΞϨ ˢ̎୆໨ىಈ ˢ̍୆໨ىಈ ˢ̎୆໨࡞੒ ˢ̍୆໨࡞੒

Slide 42

Slide 42 text

ཧ༝ •  ϝϞϦ଍Γͳ͍ͱڧ੍తʹམͪΔ ࣮ͦͯ͠ߦͯ͠ΈΔͱɾɾɾ   ςετམͪΔ

Slide 43

Slide 43 text

1SF%FYJOHΛແޮԽ 設定はWEBで http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server- performance ϝϞϦઃఆมߋ machine: environment: JAVA_OPTS: "-Xms256m -Xmx512m” ىಈ୆਺ݮΒ͢ ˠ̎୆͕ݶքͳײ͡ʢίϯςφ૿΍͢ͱ͍͚Δ͔΋ʁʣ

Slide 44

Slide 44 text

௕͍ઓ͍ʹউར(๑•̀ŷ•́)و✧

Slide 45

Slide 45 text

·ͱΊ •  ΞϓϦͷ6*ςετ͸ϋϚΓͲ͜Ζຬࡌ •  ΤϛϡϨʔλʔͷίϚϯυૢ࡞ͱ஥ྑ͘ͳΓ·͠ΐ͏ •  ͦ͜Λ৐Γӽ͑Δͱ޾͕ͤ଴͍ͬͯΔ •  ΞϓϦͷόʔδϣϯຖ֬ೝΛਓखͰ΍Βͳͯ͘ࡁΉ •  ࣮ػΛෳ਺ܨ͛Ε͹ػछґଘͷ֬ೝ΋Ͱ͖Δ •  6*ςετ͸30*Λߟ࣮͑ͭͭ૷͠Α͏ •  ,1*ʹؔ܎ͦ͠͏ͳओཁಋઢʹߜͬͯಋೖ͢Δͷ͕͓͢͢Ί