I considered what how to controll state in UI Test interactively. This is summary of my idea.
XCUITestʹ͓͚Δঢ়ଶ੍ޚʹ͍ͭͯߟ͑Δ
View Slide
XCUITestͱXCTestʹؚ·ΕΔUI Testingͷ௨শςετରͷΞϓϦʹର͠ɺϢʔβͱಉͷૢ࡞Λߦ͏UIςετͷͨΊͷػೳ
ঢ়ଶʹ͍ͭͯUIςετΑΓϢʔβʹ͍ۙܗͰςετରΞϓϦΛϒϥοΫϘοΫεతʹૢ࡞͢ΔͨΊɺ෦͔ΒมϝιουʹΞΫηε͍͢͠୯ମςετʹൺΔͱঢ়ଶΛ࡞Γʹ͍͘ͱݴ͑·͢ɻ
ঢ়ଶ੍ޚͷྫ(XCTest)XCUIApplicationͷlaunchArgumentslaunchEnvironmentΛͬͯىಈ࣌ʹઃఆΛ༩͑Δlet app = XCUIApplication()app.launchArguments.append("loggedIn")app.launchArguments.append(contentsOf: ["-key", "abc111222333"])app.launchArguments.append(contentsOf: ["-skipLogin", "YES"])app.launchEnvironment["TestMode"] = "UITest"
ঢ়ଶ੍ޚͷྫ(Target Application)ςετରͷΞϓϦͰProcessInfoͷarguments,environment͔ΒΛऔΓग़ͯ͠༻͠·͢ɻProcessInfo.processInfo.arguments.contains("loggedIn")UserDefaults.standard.string(forKey: "key")UserDefaults.standard.bool(forKey: "skipLogin")ProcessInfo.processInfo.environment["TestMode"]
ىಈ࣌ʹҰׅͰ༩͑Δ͔͠ͳ͍
!ىಈޙʹΕͳ͍ͩΖ͏͔ʁ
ྫ͑͜Μͳ෩ʹςετ͔ΒΛૹΓɺඞཁͳΒςετର͔Βड͚औΔ
͔݁Β
ग़དྷ·ͨ͠
Darwin notifications
Darwin notificationsͱʁCϕʔεͷAPIͰɺΞϓϦؒΛ·͍ͨͰ௨ΛૹΔ͜ͱ͕ՄೳͰ͢!MMWormholeͳͲʹΘΕ͓ͯΓɺWatchExtensionͷ։ൃΛͨ͠ࣄ͕͋Δਓฉ͍ͨ͜ͱ͕͋Δ͔͠Ε·ͤΜɻ
!ྑͦ͞͏
Darwin notificationsͷΠϝʔδ
Darwin notificationsͷ੍ݶ௨ͷΈΛૹΓ·͢ɻNotificationͷΑ͏ʹuserInfoͳͲ͕͋Γ·ͤΜσʔλΛΓऔΓ͢ΔͷͰ͋ΕԿ͔ผͷΈ͕ඞཁʹͳΓ·͢!
͋͞Ͳ͏͠Α͏ʁ
UIPasteboard
UIPasteboardΞϓϦؒͷใ࿈ܞͱͯ͠ڞ௨Ͱѻ͑ΔϦιʔεͱͯ͠ݕ౼ͨ͠தͰ͍উख͕ྑͦ͞͏ͳͷͱͯ͠UIPasteboardΛͬͯΈΔ͜ͱʹ͠·ͨ͠ɻ
Telepathy
Telepathy (Ծ)
Sample Code(XCTest)let exp = XCTestExpectation(description: "normal")Telepathy.ask(with: "normal") { message inexp.fulfill()}wait(for: [exp], timeout: 5)
Sample Code(Target Application)Telepathy.listen { (message) inif message == "foo" {// something}Telepathy.answer()}
࣮ݱग़དྷ·ͨ͠Ͷʁ
ऴΘΓʹTelepathy·ͩΞΠσΟΞݕূஈ֊Ͱະެ։ͷϥΠϒϥϦͰ͢ɻ࣮ફʹ͋ͨΓ༗ޮͳϢʔεέʔεͳͲΛࡧͯ͠Δ࠷தͳͷͰ͝ҙݟ͍͚ͨͩΔͱ͍Ͱ͢ɻ
Ҏ্