[TDD] iOSアプリのUITestでのテスト用データの作り方

TDD

     
⌛️ < 1 min.
UIテスト用にテストデータをセットアップする方法を説明します。

画面スナップショットの自動化ができたので、さっそくAppStoreに申請しようと思ったら、該当シミュレータ中に、良い具合のデータがありませんでした。orz

通常の UnitTest であれば、テストデータ作成用の関数をコールしてテストするのですが、UITestでは、アプリケーションを外部からしか操作できないので、簡単にテストデータを作れません。

UITest向けデータ生成

UnitTest向けであれば、CoreData を使うアプリケーションであれば、InMemoryでManagedObjectContextを作ることで、簡単にクリーンな環境を作ることができ、テストできます。

SwiftUIとCoreDataを使用するアプリのUnitTest環境構築

しかし、UITest では、アプリの内部にアクセスできないので、外部から、アプリ内のAPIを使って、テスト用データを作るというのができません。

以前は、アプリ内にデータクリアボタンを作ったこともあったんですが、あまりスマートではありません.

起動引数で切り分ける

iOSアプリケーションに引数なんてあるの?って感じだと思いますが、普通に、引数を渡せました。

XCUIApplication には、 launchArguments というプロパティがあり、このプロパティ経由で渡すことができます。

渡す側

引数指定


let app = XCUIApplication()
app.launchArguments.append("SnapshotTest")  // (1) 引数指定
app.launch()

上記の (1) の行で、SnapshotTest という引数を指定しています。

受け取る側

example code


func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    self.coreDataStack.loadPersistentStores(completionHandler: {_,_ in })
    if ProcessInfo.processInfo.arguments.contains("SnapshotTest") { // (1) 引数チェック
        // clear and create some data
        self.coreDataStack.deleteAllObjects()
        self.coreDataStack.createDataForSnapshot()
    }
    return true
}

おそらく、AppDelegateのwillFInishLaunchingWithOptionsが、良いタイミングだと思いますが、その中で上記のように”ProcessInfo.processInfo.arguments.contains(“SnapshotTest”)”として、引数に含まれているかをチェックでき、その結果を使って処理することができます。

UITest向けのテストデータの作り方

最初は、CoreData 向けに調べてたんですが、結局、とくに、CoreData 向けということではなく、
アプリが何かしらの情報を保持するものについては、この方法でサンプル用のデータを作るのが良いみたいです。

UITest 用テストデータの作り方
  • アプリ起動の引数を使用して、テスト用に起動させる
  • XCUIApplication の launchArguments で引数は指定できる
  • application#willFinishLaunchingWithOptions で、引数に応じた処理ができる

Test Driven Developmentって、イテレーションが回り始めると楽しいけど、回し始めるための手順がいろいろあって、大変です。

説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です