Slide 1

Slide 1 text

Firebase(Test(Lab 5ͭͷ"ps @Horie1024 2016/9/28(potato-ps(#33 ©"VASILY,"Inc.,"2016 1

Slide 2

Slide 2 text

About&Me • Ryosuke)Horie)@Horie1024 • →)ͷௗͷΞΠίϯͰ͢ • VASILY,)Inc. • Android)Developer • iQONͱ͍͏ΞϓϦΛ։ൃ͍ͯ͠·͢ɻ ©"VASILY,"Inc.,"2016 2

Slide 3

Slide 3 text

ൃදͷྲྀΕ • Firebse(Test(Labͱ͸ʁ( • -ps঺հ ©"VASILY,"Inc.,"2016 3

Slide 4

Slide 4 text

Firebase(Test(Labͱ͸ʁ ©"VASILY,"Inc.,"2016 4

Slide 5

Slide 5 text

Firebase(Test(Lab • Google'I/O'2016ͰFirebaseͷҰػೳͱͯ͠ެ։ • چCloud'Test'Lab • Ϋϥ΢υϕʔεͷAndroidΞϓϦͷςετج൫ • Googleͷσʔληϯλʔ্ͰՔಇ͢Δ୺຤ͰςετΛ࣮ߦ ©"VASILY,"Inc.,"2016 5

Slide 6

Slide 6 text

ར༻ํ๏ • FirebaseͷϓϩδΣΫτΛ࡞੒ • ՝ۚ • BlazeϓϥϯΛબ୒ • ࠨΧϥϜͷϝχϡʔ͔Βར༻Մೳ, ©"VASILY,"Inc.,"2016 6

Slide 7

Slide 7 text

࣮ߦՄೳͳςετ • Roboςετ • ςετίʔυෆཁͳE2Eςετ • ΞϓϦͷUIߏ଄Λղੳɾ୳ࡧ͠Ϣʔβʔͷૢ࡞ΛγϛϡϨʔτ • Instrumenta1onςετ • Espresso • Robo1um • UI3Automator32.0 ©"VASILY,"Inc.,"2016 7

Slide 8

Slide 8 text

ςετͷ࣮ߦํ๏ • Web%UI(Firebase%console) • Android%Studio • CLI • Pre;launch%report(RoboςετͷΈ) • Play΁ͷα,%βͰͷAPKΞοϓϩʔυ࣌ʹࣗಈ࣮ߦ ©"VASILY,"Inc.,"2016 8

Slide 9

Slide 9 text

ςετ݁Ռͷ֬ೝ • ϩά • εΫϦʔϯγϣοτ • ಈը • Cloud'Storageʹอଘ ©"VASILY,"Inc.,"2016 9

Slide 10

Slide 10 text

!psͷ঺հ ©"VASILY,"Inc.,"2016 10

Slide 11

Slide 11 text

1.#Roboςετͷڍಈ ©"VASILY,"Inc.,"2016 11

Slide 12

Slide 12 text

Roboςετͷڍಈ • Roboςετ͸Monkey*testͱԿ͕ҧ͏ͷ͔ʁ • ࣗಈͰγϛϡϨʔτ͞ΕΔૢ࡞͸ςετ࣮ߦຖʹҟͳΔͷ͔ʁ ©"VASILY,"Inc.,"2016 12

Slide 13

Slide 13 text

Roboςετͷڍಈ • Monkey(testͱ͸ڍಈ͕ҟͳΔ • ࣮ߦͷ౓ʹϥϯμϜͳૢ࡞͕ߦΘΕΔΘ͚Ͱ͸ͳ͍ • RoboςετͰγϛϡϨʔτ͞ΕΔૢ࡞ʹ͸࠶ݱੑ͕͋Δ • σόΠεͷઃఆ౳ͷύϥϝʔλ͕ಉ͡ͳΒ͹ৗʹಉ͡ ©"VASILY,"Inc.,"2016 13

Slide 14

Slide 14 text

2.#RoboςετͰͷೝূॲཧ ©"VASILY,"Inc.,"2016 14

Slide 15

Slide 15 text

RoboςετͰͷೝূॲཧ • Roboςετ͸αΠϯΠϯ΍ϩάΠϯը ໘ΛಥഁͰ͖ͳ͍ • ೝূʹGoogleΞΧ΢ϯτΛ࢖༻͔ͭ௥ ՃͷΞΫγϣϯΛཁٻ͠ͳ͍ͳΒಥഁ Մೳ ©"VASILY,"Inc.,"2016 15

Slide 16

Slide 16 text

RoboςετͰͷೝূॲཧ • System(PropertyͰΞϓϦ͕TestLabͰ࣮ߦத͔Λ൑ผ • TestLabͷ৔߹ͷΈαΠϯΠϯɺϩάΠϯΛεΩοϓͳͲՄೳ String testLabSetting = Settings.System.getString(context.getContentResolver(), "firebase.test.lab"); if ("true".equals(testLabSetting)) { // Test LabͰͷ࣮ߦதʹߦ͏ॲཧ } ©"VASILY,"Inc.,"2016 16

Slide 17

Slide 17 text

3.#CLI͔Βͷ࣮ߦ ©"VASILY,"Inc.,"2016 17

Slide 18

Slide 18 text

CLOUD&SDKΛΠϯετʔϧ • h#ps:/ /cloud.google.com/sdk/ • gcloudίϚϯυϥΠϯπʔϧΛ࢖༻ ©"VASILY,"Inc.,"2016 18

Slide 19

Slide 19 text

Roboςετͷ࣮ߦ $ gcloud beta test android run \ --type robo \ --app app-debug-unaligned.apk \ --device-ids Nexus5 \ --os-version-ids 21 \ --locales ja_JP \ --orientations portrait \ --timeout 90s ©"VASILY,"Inc.,"2016 19

Slide 20

Slide 20 text

Instrumenta*onςετͷ࣮ߦ $ gcloud beta test android run \ --type instrumentation \ --app app-debug-unaligned.apk \ --test app-debug-test-unaligned.apk \ --device-ids Nexus5 \ --os-version-ids 21 \ --locales ja_JP \ --orientations portrait ©"VASILY,"Inc.,"2016 20

Slide 21

Slide 21 text

4.#ςετઃఆͷ؅ཧ ©"VASILY,"Inc.,"2016 21

Slide 22

Slide 22 text

ςετઃఆͷ؅ཧ • ͜ͷ··ͩͱಡΈʹ͍͘ $ gcloud beta test android run \ --type robo \ --app app-debug-unaligned.apk \ --device-ids Nexus5 \ --os-version-ids 21 \ --locales ja_JP \ --orientations portrait \ --timeout 90s ©"VASILY,"Inc.,"2016 22

Slide 23

Slide 23 text

YAMLͰ؅ཧ robo-test: type: robo app: app-debug-unaligned.apk device-ids: Nexus5 os-version-ids: 21 locales: ja_JP orientations: portrait timeout: 90s ©"VASILY,"Inc.,"2016 23

Slide 24

Slide 24 text

YAMLͰ؅ཧͨ͠৚݅Λࢦఆ࣮ͯ͠ߦ • ৚݅ͷ੾Γସ͑΋؆୯ $ gcloud beta test android run test_settings.yaml:robo-test ©"VASILY,"Inc.,"2016 24

Slide 25

Slide 25 text

5.#CIγεςϜͱͷ࿈ܞ ©"VASILY,"Inc.,"2016 25

Slide 26

Slide 26 text

CIγεςϜ͔ΒTest'LabΛ࣮ߦ͢Δʹ͸ʁ • ඞཁͳAPIͷ༗ޮԽ • CIͷϏϧυͰͷgcloudπʔϧͷೝূ • gcloudπʔϧͰͷςετ࣮ߦ ©"VASILY,"Inc.,"2016 26

Slide 27

Slide 27 text

ඞཁͳAPIͷ༗ޮԽ • GCPͷAPIϚωʔδϟʔ͔Β༗ޮԽ • Google+Cloud+Tes0ng+API • Cloud+Tool+Results+API ©"VASILY,"Inc.,"2016 27

Slide 28

Slide 28 text

gcloudπʔϧͷೝূ • αʔϏεΞΧ΢ϯτͷ࡞੒ • GCPͷAPIϚωʔδϟʔ'→'ೝূ৘ใ • FirebaseͷϓϩδΣΫτ໊Λબ୒ • αʔϏεΞΧ΢ϯτ࡞੒ • ΞΧ΢ϯτΩʔΛJSONͰμ΢ϯϩʔ υ ©"VASILY,"Inc.,"2016 28

Slide 29

Slide 29 text

gcloudπʔϧͷೝূ • ΞΧ΢ϯτΩʔΛbase64Τϯίʔυ͠؀ڥม਺ʹొ࿥ $ base64 ©"VASILY,"Inc.,"2016 29

Slide 30

Slide 30 text

gcloudπʔϧͷೝূ • CIͰͷϏϧυதʹσίʔυ͠ϑΝΠϧʹॻ͖ग़͠ $ echo $CLIENT_SECRET | base64 --decode > ${HOME}/client-secret.json ©"VASILY,"Inc.,"2016 30

Slide 31

Slide 31 text

gcloudπʔϧͷೝূ • client(secret.jsonΛ࢖༻͠ೝূ $ gcloud auth activate-service-account --key-file ${HOME}/client-secret.json ©"VASILY,"Inc.,"2016 31

Slide 32

Slide 32 text

gcloudπʔϧͰͷςετ࣮ߦ • CircleCIͰͷྫ test: override: - ./gradlew assembleDebug - echo "y" | sudo /opt/google-cloud-sdk/bin/gcloud beta test android run test_settings.yaml:robo-test ©"VASILY,"Inc.,"2016 32

Slide 33

Slide 33 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ ©"VASILY,"Inc.,"2016 33