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
みんな使おう! AWS Device Farm
Search
Sato Takeshi
February 23, 2017
Technology
1
760
みんな使おう! AWS Device Farm
GEEK GARAGE iOS vol1
https://geekgarage.connpass.com/event/50929/
の資料です。
Sato Takeshi
February 23, 2017
Tweet
Share
More Decks by Sato Takeshi
See All by Sato Takeshi
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
240
Swift愛好会 の 思い出
satotakeshi
0
77
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
2.9k
Meet passkeys
satotakeshi
2
330
What's new in Vision
satotakeshi
0
1.5k
Swift Concurrency入門
satotakeshi
11
5k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
380
Xcodegenを個人アプリに導入
satotakeshi
3
740
SwiftUIで作る開閉式メニュー
satotakeshi
2
2.9k
Other Decks in Technology
See All in Technology
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.5k
わたしがEMとして入社した「最初の100日」の過ごし方 / EMConfJp2025
daiksy
14
4.9k
システム・ML活用を広げるdbtのデータモデリング / Expanding System & ML Use with dbt Modeling
i125
1
320
急成長する企業で作った、エンジニアが輝ける制度/ 20250227 Rinto Ikenoue
shift_evolve
0
130
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
2
1.5k
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
2.6k
Autonomous Database Serverless 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
17
45k
OPENLOGI Company Profile for engineer
hr01
1
20k
Perlの生きのこり - エンジニアがこの先生きのこるためのカンファレンス2025
kfly8
2
270
コンピュータビジョンの社会実装について考えていたらゲームを作っていた話
takmin
1
590
OPENLOGI Company Profile
hr01
0
60k
4th place solution Eedi - Mining Misconceptions in Mathematics
rist
0
140
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
370
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
RailsConf 2023
tenderlove
29
1k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Site-Speed That Sticks
csswizardry
4
400
Visualization
eitanlees
146
15k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Building an army of robots
kneath
303
45k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Transcript
ΈΜͳ͓͏ʂ AWS Device Farm 20172݄23 ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23
1
ࣗݾհ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 2
ࠤ౻߶࢜(@hatakenokakashi) SIاۀͷอकӡ༻͔ΒɺελʔτΞοϓͷCTOΛܦͯɺ MAMORIOגࣜձࣾʹ2݄͔ΒiOSΤϯδχΞΛ͍ͯ͠·͢ɻ RailsͱJavaScript(ES6)ͱGolangͱ༑ୡʹͳΔͷ͕ࠓͷඪɻ ίʔώʔͱϛϯτςΟ͕͖ɻ ϒϩάɿhttp://blog.personal-factory.com/ ΈΜͳ͓͏ʂ AWS Device Farm
2017/2/23 3
ςετͭΒ͍ͬ͢ΑͶ! ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 4
։ൃͲΜͲΜਐΉ ͦͷͨͼʹશΛςετ͠ͳ͖Ό͍ ͚ͳ͍ɻ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 5
ͦ͜ʹཱ͔ͪΔ • ༻ҙ͕େม • ૿େ͢Δςετ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23
6
Ͳ͏͠Α͏(´ɾТɾʆ) ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 7
ͦ͜ͰԞ͞Μʂ Device Farmͷग़൪Ͱ͢ʂ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 8
Device FarmͬͯԿʁ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 9
Device Farm • AWSͷεϚϑΥ&WebΞϓϦ͚ςετࣗಈԽαʔϏε • iOSɺAndroid֤֤OSόʔδϣϯΛऔΓἧ͑Δ • ࠷ॳͷ߹ܭ250·Ͱແྉɻޙ0.17 USD/ ΈΜͳ͓͏ʂ
AWS Device Farm 2017/2/23 10
๛ͳछྨ&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
ͲΜͳςετ͕Ͱ͖Δ͔ʁ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 12
Fuzz • DeviceFarmʹ༧Ί༻ҙ͞Ε͍ͯΔϑϨʔϜϫʔΫ • σλϥϝʹUIΞΫγϣϯΛ࣮ߦ͢Δɻ • ϞϯΩʔςετͱͯ͠ΞϓϦ͕མͪͳ͍͔Ͳ͏͔νΣοΫͰ ͖Δɻ ΈΜͳ͓͏ʂ AWS
Device Farm 2017/2/23 13
Appium • Java JUnitɺJava TestNGɺPython • iOS/AndroidʹରԠ͢ΔςετϑϨʔϜϫʔΫɻ • Appiumࣗମ༷ʑͳݴޠͰಈ͚͘ͲDeviceFarmͰରԠ͠ ͍ͯΔͷJavaͱPythonͷΈɻ
ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 14
Calabash • Xamarin͕ࣾϝϯςϯφεΛ͍ͯ͠ΔΦʔϓϯιʔεςετϑ ϨʔϜϫʔΫ • iOS/AndroidʹରԠ • RubyͰಈ͘ ΈΜͳ͓͏ʂ AWS
Device Farm 2017/2/23 15
UI Automation(Xcode7·Ͱ) • Xcodeʹ͍ͭͯ͘ΔInstrumentsʹଐ͢ΔςετϑϨʔϜϫ ʔΫ • iOSʹରԠ • JavaScriptͰiOSΞϓϦͷUIΛૢ࡞Ͱ͖Δɻ •
Xcode8͔ΒInstruments͔Βআ͞Ε༻Ͱ͖ͳ͍ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 16
XCTest (XCUI ͓Αͼ KIF ΛؚΉ) • Xcodeʹଐ͢ΔiOSΞϓϦͷςετϑϨʔϜϫʔΫ • Ϣχοτςετ͕XCTest •
UIςετΛ͢ΔʹXCUI ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 17
AndroidͷςετϑϨʔϜϫʔΫ • Instrumentation • UI Automator • JUnit • Espresso
• Robotium ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 18
ࢼͯ͠ΈΔ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 19
XCUIͰͬͯΈΔ 1. ΞϓϦΛϏϧυ͢Δ 2. XCUIΛϏϧυ͢Δ 3. Payload.ipaϑΝΠϧΛͭ͘Δ 4. Device FarmʹΞϓϦͱςετΛొ࣮͠ߦ
5. ςετ݁ՌΛΈΔ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 20
ΞϓϦΛϏϧυ͢Δ XcodeͷProduct -> ArchiveͰΞʔΧΠ ϒ OrganaizerϖʔδͰExport ΈΜͳ͓͏ʂ AWS Device Farm
2017/2/23 21
Save for Development DeploymentΛ બ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23
22
Device SupportΛExport one app for all compatible devicesʹબ ΈΜͳ͓͏ʂ AWS
Device Farm 2017/2/23 23
XCUIͰςετίʔυΛॻ͘ import XCTest class MAMORIOUITests: XCTestCase { override func setUp()
{ super.setUp() continueAfterFailure = false XCUIApplication().launch() } func test1Tutorial() {} } ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 24
XCUIΛϏϧυ͢Δ Product > Build For > Testing ΈΜͳ͓͏ʂ AWS Device
Farm 2017/2/23 25
[UITestName]-Runner.appΛऔಘ ϏϧυύεΛݟΔ /Users/<UserName>/Library/ Developer/Xcode/DerivedData/ <App Name>-xxxxxxxxxxxxxxxxx/ Build/Products/Debug-iphoneos/ ΈΜͳ͓͏ʂ AWS Device
Farm 2017/2/23 26
ιʔεҰཡͷ Products >ɹ[APPNAME].app ΛӈΫϦοΫͰFinderΛ։͍ͯྑ͍ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 27
Payload.ipaϑΝΠϧΛͭ͘Δ 1. PayloadσΟϨΫτϦΛ࡞Γ[UITestName]-Runner.appΛೖΕ Δɻ 2. ͦͷޙʹzipͰPayloadσΟϨΫτϦΛѹॖ͢Δɻ 3. Payload.zipΛPayload.ipaʹϦωʔϜ͢Δɻ ΈΜͳ͓͏ʂ AWS
Device Farm 2017/2/23 28
mkdir Payload mv [UITestName]-Runner.app Payload zip Payload.zip Payload mv Payload.zip
Payload.ipa ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 29
Device FarmʹΞϓϦͱςε τΛొ࣮͠ߦ Create a new project ΛΫϦοΫ Create a
new run ΛΫϦοΫ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 30
ΞϓϦͷipaϑΝΠϧ ΛΞοϓϩʔυ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 31
XCTest UIΛબΜͰ Payload.ipaΛΞοϓ ϩʔυ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 32
DeviceΛબͼ·͢ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 33
DeviceͷৄࡉΛ͠·͢ ϩέʔγϣϯΛJapanʹ͢Ε͍͍ͱࢥ ͏ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 34
DeviceͷλΠϜΞ τઃఆΛ͢Δ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 35
ςετ݁ՌΛΈΔ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 36
DEMO DeviceFarmͷίϯιʔϧ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 37
XCUIͷઆ໌ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 38
XCUIͷઆ໌ • XCUIApplicationͰΞϓϦऔಘͯ͠ • XCUIElementQueryͰUI෦Λݕࡧ ͯ͠ • XCUIElementͰλοϓͳͲUIૢ࡞Λ ͢Δ let
app = XCUIApplication() app.buttons["startButton"].tap() ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 39
XCUIElementQueryͰݕࡧ Ͱ͖ΔΑ͏ʹ accessibilityIdentifierΛઃఆ͠·͠ΐ ͏ɻ Storyboard͜Ε ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23
40
ίʔυͪ͜Β 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
XCUIͰTips 1. γεςϜΞϥʔτͷλοϓํ๏(ϓογϡ௨ڐՄɺϩέʔγ ϣϯڐՄ) 2. webαΠτͷදࣔ(openͰ։͘ͱΕͳ͍ɻwebViewͰදࣔ ͠Α͏) 3. XCUIͷςετ࣮ߦॱ(ϝιου໊ͷιʔτ) 4.
Device Farmͷ࣮ߦॱ(ϝιου࣮ͷԼ͔Β࣮ߦ͞ΕΔ) ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 42
γεςϜΞϥʔτͷλοϓํ ๏(ϓογϡ௨ڐՄɺϩέʔ γϣϯڐՄ) ͜ΕͩΊ let app = XCUIApplication() let notifiAlert
= app.alerts["“MAMORIO”௨Λૹ৴͠·͢ɻΑΖ͍͠Ͱ͔͢?"] let comfirmButton = notifiAlert.buttons["ڐՄ"] if comfirmButton.exists { comfirmButton.tap() } ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 43
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
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
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
XCUIͷςετ࣮ߦॱ XCTestCaseͷςετͷ࣮ߦॱϝιου໊ͷঢॱɻ ॳճىಈϢʔβʔొͳͲ࣮ߦॱ͕େࣄʹͳΔ߹ʹؾΛͭ ͚Δɻ func test4PasswordReset(){} func test3RegisterUser(){} func test2TemporaryLogin(){}
func test1Tutorial() {} ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 47
Device Farmͷ࣮ߦॱ ϝιου࣮ॱͷԼ͔Β࣮ߦ͞ΕΔɻ ϝιου໊ͷঢॱͰͳ͍ͷͰҙʂ func test4PasswordReset(){} func test3RegisterUser(){} func test2TemporaryLogin(){}
func test1Tutorial() {} ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 48
Α͍ςετϥΠϑΛա͝ ͠·͠ΐ͏✨ ΈΜͳ͓͏ʂ AWS Device Farm 2017/2/23 49