Slide 1

Slide 1 text

ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017೥2݄23೔ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 1

Slide 2

Slide 2 text

ࣗݾ঺հ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 2

Slide 3

Slide 3 text

ࠤ౻߶࢜(@hatakenokakashi) SIاۀͷอकӡ༻͔ΒɺελʔτΞοϓͷCTOΛܦͯɺ MAMORIOגࣜձࣾʹ2݄͔ΒiOSΤϯδχΞΛ͍ͯ͠·͢ɻ RailsͱJavaScript(ES6)ͱGolangͱ༑ୡʹͳΔͷ͕ࠓ೥ͷ໨ඪɻ ίʔώʔͱϛϯτςΟ͕޷͖ɻ ϒϩάɿhttp://blog.personal-factory.com/ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 3

Slide 4

Slide 4 text

ςετͭΒ͍ͬ͢ΑͶ! ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 4

Slide 5

Slide 5 text

։ൃ͸ͲΜͲΜਐΉ ͦͷͨͼʹશ୺຤Λςετ͠ͳ͖Ό͍ ͚ͳ͍ɻ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 5

Slide 6

Slide 6 text

ͦ͜ʹཱͪ͸͹͔Δ໰୊ • ୺຤༻ҙ͕େม • ૿େ͢Δςετ޻਺ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 6

Slide 7

Slide 7 text

Ͳ͏͠Α͏(´ɾТɾʆ) ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 7

Slide 8

Slide 8 text

ͦ͜ͰԞ͞Μʂ Device Farmͷग़൪Ͱ͢ʂ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 8

Slide 9

Slide 9 text

Device FarmͬͯԿʁ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 9

Slide 10

Slide 10 text

Device Farm • AWSͷεϚϑΥ&WebΞϓϦ޲͚ςετࣗಈԽαʔϏε • iOSɺAndroid֤୺຤֤OSόʔδϣϯΛऔΓἧ͑Δ • ࠷ॳͷ߹ܭ250෼·Ͱແྉɻޙ0.17 USD/෼ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 10

Slide 11

Slide 11 text

๛෋ͳ୺຤छྨ&OSόʔδϣϯ • iPhone4s-iPhone7PlusͷiOS7.1͔ΒiOS10·Ͱ • iPad2/iPad miniୈҰੈ୅/iPad Pro • Android΋΄΅ओཁͳ୺຤ΛͦΖ͍͑ͯΔʢͨͩ͠άϩʔόϧ൛) • Android୺຤͸೔ຊ͸ΩϟϦΞ͕ΧελϚΠζ͍ͯ͠ΔͷͰ஫ ҙʂ https://aws.amazon.com/jp/device-farm/device-list/ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 11

Slide 12

Slide 12 text

ͲΜͳςετ͕Ͱ͖Δ͔ʁ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 12

Slide 13

Slide 13 text

Fuzz • DeviceFarmʹ༧Ί༻ҙ͞Ε͍ͯΔϑϨʔϜϫʔΫ • σλϥϝʹUIΞΫγϣϯΛ࣮ߦ͢Δɻ • ϞϯΩʔςετͱͯ͠ΞϓϦ͕མͪͳ͍͔Ͳ͏͔νΣοΫͰ ͖Δɻ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 13

Slide 14

Slide 14 text

Appium • Java JUnitɺJava TestNGɺPython • iOS/AndroidʹରԠ͢ΔςετϑϨʔϜϫʔΫɻ • Appiumࣗମ͸༷ʑͳݴޠͰಈ͚͘ͲDeviceFarmͰ͸ରԠ͠ ͍ͯΔͷ͸JavaͱPythonͷΈɻ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 14

Slide 15

Slide 15 text

Calabash • Xamarin͕ࣾϝϯςϯφεΛ͍ͯ͠ΔΦʔϓϯιʔεςετϑ ϨʔϜϫʔΫ • iOS/AndroidʹରԠ • RubyͰಈ͘ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 15

Slide 16

Slide 16 text

UI Automation(Xcode7·Ͱ) • Xcodeʹ͍ͭͯ͘ΔInstrumentsʹ෇ଐ͢ΔςετϑϨʔϜϫ ʔΫ • iOSʹରԠ • JavaScriptͰiOSΞϓϦͷUIΛૢ࡞Ͱ͖Δɻ • Xcode8͔Β͸Instruments͔Β࡟আ͞Ε࢖༻Ͱ͖ͳ͍ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 16

Slide 17

Slide 17 text

XCTest (XCUI ͓Αͼ KIF ΛؚΉ) • Xcodeʹ෇ଐ͢ΔiOSΞϓϦͷςετϑϨʔϜϫʔΫ • Ϣχοτςετ͕XCTest • UIςετΛ͢Δʹ͸XCUI ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 17

Slide 18

Slide 18 text

AndroidͷςετϑϨʔϜϫʔΫ • Instrumentation • UI Automator • JUnit • Espresso • Robotium ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 18

Slide 19

Slide 19 text

ࢼͯ͠ΈΔ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 19

Slide 20

Slide 20 text

XCUIͰ࢖ͬͯΈΔ 1. ΞϓϦΛϏϧυ͢Δ 2. XCUIΛϏϧυ͢Δ 3. Payload.ipaϑΝΠϧΛͭ͘Δ 4. Device FarmʹΞϓϦͱςετΛొ࿥࣮͠ߦ 5. ςετ݁ՌΛΈΔ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 20

Slide 21

Slide 21 text

ΞϓϦΛϏϧυ͢Δ XcodeͷProduct -> ArchiveͰΞʔΧΠ ϒ OrganaizerϖʔδͰExport ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 21

Slide 22

Slide 22 text

Save for Development DeploymentΛ બ୒ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 22

Slide 23

Slide 23 text

Device SupportΛExport one app for all compatible devicesʹબ୒ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 23

Slide 24

Slide 24 text

XCUIͰςετίʔυΛॻ͘ import XCTest class MAMORIOUITests: XCTestCase { override func setUp() { super.setUp() continueAfterFailure = false XCUIApplication().launch() } func test1Tutorial() {} } ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 24

Slide 25

Slide 25 text

XCUIΛϏϧυ͢Δ Product > Build For > Testing ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 25

Slide 26

Slide 26 text

[UITestName]-Runner.appΛऔಘ ϏϧυύεΛݟΔ /Users//Library/ Developer/Xcode/DerivedData/ -xxxxxxxxxxxxxxxxx/ Build/Products/Debug-iphoneos/ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 26

Slide 27

Slide 27 text

ιʔεҰཡͷ Products >ɹ[APPNAME].app ΛӈΫϦοΫͰFinderΛ։͍ͯ΋ྑ͍ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 27

Slide 28

Slide 28 text

Payload.ipaϑΝΠϧΛͭ͘Δ 1. PayloadσΟϨΫτϦΛ࡞Γ[UITestName]-Runner.appΛೖΕ Δɻ 2. ͦͷޙʹzipͰPayloadσΟϨΫτϦΛѹॖ͢Δɻ 3. Payload.zipΛPayload.ipaʹϦωʔϜ͢Δɻ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 28

Slide 29

Slide 29 text

mkdir Payload mv [UITestName]-Runner.app Payload zip Payload.zip Payload mv Payload.zip Payload.ipa ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 29

Slide 30

Slide 30 text

Device FarmʹΞϓϦͱςε τΛొ࿥࣮͠ߦ Create a new project ΛΫϦοΫ Create a new run ΛΫϦοΫ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 30

Slide 31

Slide 31 text

ΞϓϦͷipaϑΝΠϧ ΛΞοϓϩʔυ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 31

Slide 32

Slide 32 text

XCTest UIΛબΜͰ Payload.ipaΛΞοϓ ϩʔυ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 32

Slide 33

Slide 33 text

DeviceΛબͼ·͢ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 33

Slide 34

Slide 34 text

DeviceͷৄࡉΛ͠·͢ ϩέʔγϣϯΛJapanʹ͢Ε͹͍͍ͱࢥ ͏ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 34

Slide 35

Slide 35 text

DeviceͷλΠϜΞ΢ τઃఆΛ͢Δ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 35

Slide 36

Slide 36 text

ςετ݁ՌΛΈΔ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 36

Slide 37

Slide 37 text

DEMO DeviceFarmͷίϯιʔϧ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 37

Slide 38

Slide 38 text

XCUIͷઆ໌ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 38

Slide 39

Slide 39 text

XCUIͷઆ໌ • XCUIApplicationͰΞϓϦऔಘͯ͠ • XCUIElementQueryͰUI෦඼Λݕࡧ ͯ͠ • XCUIElementͰλοϓͳͲUIૢ࡞Λ ͢Δ let app = XCUIApplication() app.buttons["startButton"].tap() ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 39

Slide 40

Slide 40 text

XCUIElementQueryͰݕࡧ Ͱ͖ΔΑ͏ʹ accessibilityIdentifierΛઃఆ͠·͠ΐ ͏ɻ Storyboard͸͜Ε ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 40

Slide 41

Slide 41 text

ίʔυ͸ͪ͜Β let title : UILabel = UILabel.init(frame:CGRect(x:0 ,y:0, width:100, height:90)) title.isAccessibilityElement = true title.accessibilityIdentifier = "logoutLabel" ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 41

Slide 42

Slide 42 text

XCUIͰTips 1. γεςϜΞϥʔτͷλοϓํ๏(ϓογϡ௨஌ڐՄɺϩέʔγ ϣϯڐՄ) 2. webαΠτͷදࣔ(openͰ։͘ͱ໭Εͳ͍ɻwebViewͰදࣔ ͠Α͏) 3. XCUIͷςετ࣮ߦॱ(ϝιου໊ͷιʔτ) 4. Device Farmͷ࣮ߦॱ(ϝιου࣮૷ͷԼ͔Β࣮ߦ͞ΕΔ) ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 42

Slide 43

Slide 43 text

γεςϜΞϥʔτͷλοϓํ ๏(ϓογϡ௨஌ڐՄɺϩέʔ γϣϯڐՄ) ͜Ε͸ͩΊ let app = XCUIApplication() let notifiAlert = app.alerts["“MAMORIO”͸௨஌Λૹ৴͠·͢ɻΑΖ͍͠Ͱ͔͢?"] let comfirmButton = notifiAlert.buttons["ڐՄ"] if comfirmButton.exists { comfirmButton.tap() } ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 43

Slide 44

Slide 44 text

addUIInterruptionMonitor ϝιουΛ࣮ߦ͢Δඞཁ͕͋Δ //͜Ε͕ඞཁ addUIInterruptionMonitor(withDescription: "notificationAlert", handler: { alert in if alert.buttons["ڐՄ"].exists { alert.buttons["ڐՄ"].tap() return true } if alert.buttons["Allow"].exists { alert.buttons["Allow"].tap() return true } return false }) app.tap() ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 44

Slide 45

Slide 45 text

webαΠτͷදࣔ UIApplicationͷopenͰSafariΞϓϦΛ։͘ͱ໭Εͳ͍ɻ func linkURL(string :String) { if let url = URL(string:string) { if #available(iOS 10.0, *) { UIApplication.shared.open(url) } else { UIApplication.shared.openURL(url) } } } ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 45

Slide 46

Slide 46 text

WebViewͰදࣔ͠Α͏ɻ if let url = URL(string:string) { if let rootViewController = self.keyWindow?.rootViewController { let safariViewController = SFSafariViewController.init(url: url) rootViewController.present(safariViewController, animated: true, completion: nil) } } ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 46

Slide 47

Slide 47 text

XCUIͷςετ࣮ߦॱ XCTestCaseͷςετͷ࣮ߦॱ͸ϝιου໊ͷঢॱɻ ॳճىಈ΍Ϣʔβʔొ࿥ͳͲ࣮ߦॱ͕େࣄʹͳΔ৔߹ʹؾΛͭ ͚Δɻ func test4PasswordReset(){} func test3RegisterUser(){} func test2TemporaryLogin(){} func test1Tutorial() {} ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 47

Slide 48

Slide 48 text

Device Farmͷ࣮ߦॱ ϝιου࣮૷ॱͷԼ͔Β࣮ߦ͞ΕΔɻ ϝιου໊ͷঢॱͰ͸ͳ͍ͷͰ஫ҙʂ func test4PasswordReset(){} func test3RegisterUser(){} func test2TemporaryLogin(){} func test1Tutorial() {} ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 48

Slide 49

Slide 49 text

Α͍ςετϥΠϑΛա͝ ͠·͠ΐ͏✨ ΈΜͳ࢖͓͏ʂ AWS Device Farm 2017/2/23 49