画面スナップショットの自動化ができたので、さっそくAppStoreに申請しようと思ったら、該当シミュレータ中に、良い具合のデータがありませんでした。orz
通常の UnitTest であれば、テストデータ作成用の関数をコールしてテストするのですが、UITestでは、アプリケーションを外部からしか操作できないので、簡単にテストデータを作れません。
Sponsor Link
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 という引数を指定しています。
受け取る側
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 向けということではなく、
アプリが何かしらの情報を保持するものについては、この方法でサンプル用のデータを作るのが良いみたいです。
- アプリ起動の引数を使用して、テスト用に起動させる
- XCUIApplication の launchArguments で引数は指定できる
- application#willFinishLaunchingWithOptions で、引数に応じた処理ができる
Test Driven Developmentって、イテレーションが回り始めると楽しいけど、回し始めるための手順がいろいろあって、大変です。
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link