Slide 1

Slide 1 text

ςετ࣮ߦ࣌ʹ ෆཁͳॳظԽίʔυΛ࣮ߦ͠ ͳ͍Α͏ʹ͢Δ ,":"$ٕज़෦ ,B[VNBTB/"("%0 QPUBUPUJQT

Slide 2

Slide 2 text

ࣗݾ঺հ w ,B[VNBTB/"("%0 w ,":"$ೖࣾϲ݄ w ʢ౔ʣ/1$+ϑΟδʔΫ ϊʔϏεΫϥεग़৔༧ఆ w 5XJUUFS!L[NTOHE

Slide 3

Slide 3 text

ϓϥίϨ ϓϥίϨ8FEEJOH IUUQTQMBDPMFXFEEJOH %SFTTZCZϓϥίϨ IUUQTESFTTZQMBDPMFXFEEJOH

Slide 4

Slide 4 text

ΞϓϦىಈ࣌ʹॳظσʔλΛߏங͢Δ͜ͱ͕͋Δ ྫʣςετ༻ͷϢʔβάϧʔϓ ؀ڥݻ༗ͷม਺ ֎෦4%,ͷηοτΞοϓ ͳͲ

Slide 5

Slide 5 text

ᶃΞϓϦͷॳظԽॲཧͳͲͰ.PEFMͷৼΔ෣͍͕มΘΒͳ͍Α͏ʹ͍ͨ͠ ॳظԽॲཧ͸ɺ"QQ%FMFHBUFʹॻ͘͜ͱ͕ଟ͍ɻ ςετ࣌͸"QQ%FMFHBUFͷॲཧΛ࣮ߦ͠ͳ͍Α͏ʹ͍ͨ͠

Slide 6

Slide 6 text

ᶄ7JFX΍7JFX$POUSPMMFSͷΠϯελϯε͸ෆཁ σϑΥϧτͩͱɺ6OJUςετ࣌΋6*͕ϩʔυ͞ΕΔ .BJO*OUFSGBDFͷϩʔυ͸ίʔυͰ΋Ͱ͖Δ

Slide 7

Slide 7 text

ᶅςετ༻ͷίʔυ͕"QQ%FMFHBUF಺ʹଘࡏͯ͠͠·͏ let isRunningTest = ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil if isRunningTest { // ςετ࣌ͷॳظԽॲཧ } else { // ϓϩμΫγϣϯ༻ͷॳظԽॲཧ } ςετ༻ͷॳظԽॲཧ͸ผͷ৔ॴʹ෼͚͍ͨ

Slide 8

Slide 8 text

ςετ͕࣮ߦ͞Ε͍ͯΔ͔൑ఆ ςετ࣮ߦ࣌͸5FTU"QQ%FMFHBUFΛ࢖༻ɺͦ͏͡Όͳ͍ͳΒ "QQ%FMFHBUFΛ࢖༻ .BJO*OUFSGBDFͷϩʔυ͸ɺϓϩμΫγϣϯ༻ͷ"QQ%FMFHBUFͰ ॲཧ ɹʢςετ༻ͷ5FTU"QQ%FMFHBUF͸ɺ.BJO*OUFSGBDFΛϩʔυ͠ͳ͍ʣ ͱ͢Ε͹ྑͦ͞͏ɻ

Slide 9

Slide 9 text

5FTU"QQ%FMFHBUFͱ"QQ%FMFHBUFΛ࢖͍෼͚ΒΕΔΑ͏ʹɺςετ࣮ߦ൑ఆΛ NBJOؔ਺ʹॻ͘ɻ 4XJGUͷNBJOؔ਺͸Ͳ͜ʹ͋Δͷ͔ʁ ࣮͸ɺ҉໧తʹએݴ͞Ε͓ͯΓɺNBJOTXJGUΛϓϩδΣΫτʹ௥Ճ͢Δ͜ͱͰ NBJOؔ਺తͳॲཧΛॻ͚Δɻ

Slide 10

Slide 10 text

import UIKit let isRunningTest = ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil let appDelegateClass = isRunningTest ? NSStringFromClass(TestAppDelegate.self) : NSStringFromClass(AppDelegate.self) let args = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer.self, capacity: Int(CommandLine.argc)) UIApplicationMain(CommandLine.argc, args, nil, appDelegateClass) NBJOTXJGUΛϓϩδΣΫτʹ௥Ճɻ ςετ࣮ߦதͳΒɺ5FTU"QQ%FMFHBUFΛUIApplicationMain(_,_,_,_)ͷҾ਺ ʹ౉͢ॲཧΛॻ͘ɻ

Slide 11

Slide 11 text

<5FTU"QQ%FMFHBUFTXJGU> 5FTU"QQ%FMFHBUF͸ɺͱΓ͋͑ͣॲཧͳ͠Ͱ΋0, import UIKit class TestAppDelegate: UIResponder, UIApplicationDelegate { }

Slide 12

Slide 12 text

<"QQ%FMFHBUFTXJGU> .BJO*OUFSGBDFΛϩʔυ͢ΔίʔυΛॻ͘ let storyboard = UIStoryboard(name: "Main", bundle: nil) window = UIWindow() window?.rootViewController = storyboard.instantiateInitialViewController() window?.makeKeyAndVisible()

Slide 13

Slide 13 text

1SPKFDU(FOFSBM%FQMPZNFOU*OGPʹ͋Δ.BJO *OUFSGBDFΛϒϥϯΫʢۭനʣʹ͢Δɻ ·ͨ͸ɺJOGPQMJTUͷ6*.BJO4USPZCPBSE'JMFΛ࡟আɻ

Slide 14

Slide 14 text

<"QQ%FMFHBUFTXJGU> ๨Εͣʹɺ"QQ%FMFHBUFTXJGU͔Β@UIApplicationMainΛ࡟আɻ ʢUIApplicationMain(_,_,_,_)ΛݺΜͰɺσϦήʔτΫϥεΛ౉͢ "UUSJCVUFʣ // @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {

Slide 15

Slide 15 text

·ͱΊ NBJOTXJGUͰςετ࣮ߦதͷ൑ఆΛͯ͠ɺ5FTU"QQ%FMFHBUFΛ࢖͏ ςετ࣮ߦ࣌͸.BJO*OUFSGBDF΋ϩʔυͨ͘͠ͳ͍ͷͰɺJOGPQMJTU͔Β࡟ আ ˠϓϩμΫγϣϯ༻ͷ"QQ%FMFHBUFͰϩʔυ͢ΔΑ͏ʹ͢Δ

Slide 16

Slide 16 text

͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 17

Slide 17 text

ςετ࣮ߦதͷ൑ఆํ๏ʹ͍ͭͯ let isRunningTest = ProcessInfo.processInfo.environment["XCInjectBundleInto"] ! = nil // or let isRunningTest = NSClassFromString("XCTestCase") != nil

Slide 18

Slide 18 text

ͲͪΒͰ൑ఆͨ͠ํ͕Α͍͔ʁ • ProcessInfo.processInfo.environment[“XCInjectBundleInto"] xcodebuild test࣮ߦ࣌ʹඞͣଘࡏ͢Δ؀ڥม਺ • NSClassFromString(“XCTestCase") XCTestCase͕ଘࡏ͠ͳ͍؀ڥͩͱɺਖ਼͘͠൑ఆͰ͖ͳ͍

Slide 19

Slide 19 text

ςετ͕ಋೖ͞Ε͍ͯͳ͍ΞϓϦΛϦϑΝΫλ ˣ .PEFMͷ6OJUςετΛॻ͘ ˣ ෆཁͳॳظԽίʔυΛ࣮ߦ͠ͳ͍Α͏ʹͨ͠

Slide 20

Slide 20 text

ࢀߟ <>'BLF"QQ%FMFHBUF'PS6OJU5FTUJOH*O4XJGU IUUQTNBSDPTBOUBEFWDPNGBLFBQQEFMFHBUFVOJUUFTUJOHTXJGU <>)PXUP&BTJMZ4XJUDI:PVS"QQ%FMFHBUFGPS5FTUJOH IUUQTRVBMJUZDPEJOHPSHBQQEFMFHBUFGPSUFTUT <>9DPEFͰςετ࣮ߦ࣌ʹ"QQ%FMFHBUFΛ෼͚Δ IUUQTRJJUBDPNLFZJUFNTEBCCFBFDE