Timers Tech Blog

カップル専用アプリ「Pairy」, 子育て夫婦アプリ「Famm」を運営している Timers inc. の公式Tech Blogです。

Xcode 9からテストが大幅に進化します! #wwdc2017

どうも!引き続きWWDCの4日目に参加中のiOSチームのかっくんです。
先ほど What’s New in Testing というセッションを聴講してきて良い感じに進化していたのでシェアしたいと思います。

異なるアプリを跨いでUIテスト

これまでは1つのアプリケーションしか開けませんでしたが、 XCUIApplication から複数のアプリを開いてテストを実行する事が出来る様になりました!

class XCUIApplication {
  init(bundleIdentifier: String)
  init(url: URL)
}

アプリを切り替える時は activate() メソッドを実行すれば切り替えられる様です。

それに伴い state というプロパティが増えました。

class XCUIApplication {
  enum State {
    //The application's current state is not known.
    case unknown
    //The application is not running.
    case notRunning
    //The application is running in the background, but is suspended.
    case runningBackgroundSuspended
    //The application is running in the background.
    case runningBackground
    //The application is running in the foreground.
    case runningForeground
  }
}

異なるアプリもそうですが Extension でも利用出来るそうなので、利用シーンは多そうですね!

Closureでテストをまとめる事が出来る様になりました

一つのテストの中でたくさんのコードを書いているとどの部分がどういうテストをしているのか分かり辛くなる事がありますね。
そういう事を回避する為に、QuickとNimbleを利用する事もあったのでは無いでしょうか?

これからはClosureで処理を囲む事で一つの処理をまとめる事が出来ます。

XCTContext.runActivity(named: "hogehoge") { activity in
  // some tests
}

また、XcodeのReport Navigatorの中にもActivityの名前が表示される様になるので便利です。

スクリーンショットの撮影

これまでもXcodeはテスト事にスクリーンショットを撮ってくれていましたが、好きなタイミングだったり、要素毎に撮影する事が出来ませんでした。
その為にFastlaneのSnapshotを利用している人もいたのでは無いでしょうか?
次のメソッドを利用するだけで好きなタイミングで画面のスクリーンショットを撮影する事が出来る様になります。

XCUIScreen.screenshot

次の様にすれば要素のスクリーンショットを撮る事が出来ます。

XCUIElement.screenshot

撮影した物はActivityのAttachmentsに渡す必要がある様です。

画面のスクリーンショットを撮影する例

XCTContext.runActivity(named: "Take screen shot") { activity in
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    activity.add(attachment)
}

また、Schemeの設定から自動的にスクリーンショットを撮影したり、テストが成功した時にはスクリーンショットを削除するオプションや、テストが成功した時にはAttachmentsを削除するオプションもある様です。

まとめ

この様にXcode 9で痒い所に手が届く様になってきて嬉しい限りですね!
引き続きWWDCで色々情報をウォッチしたいと思います。


積極採用中!!

子育て家族アプリFamm、カップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings