画面スナップショットの自動化ができたので、さっそくAppStoreに申請しようと思ったら、該当シミュレータ中に、良い具合のデータがありませんでした。orz
通常の UnitTest であれば、テストデータ作成用の関数をコールしてテストするのですが、UITestでは、アプリケーションを外部からしか操作できないので、簡単にテストデータを作れません。
Sponsor Link
UITest向けデータ生成
UnitTest向けであれば、CoreData を使うアプリケーションであれば、InMemoryでManagedObjectContextを作ることで、簡単にクリーンな環境を作ることができ、テストできます。

しかし、UITest では、アプリの内部にアクセスできないので、外部から、アプリ内のAPIを使って、テスト用データを作るというのができません。
以前は、アプリ内にデータクリアボタンを作ったこともあったんですが、あまりスマートではありません.
起動引数で切り分ける
iOSアプリケーションに引数なんてあるの?って感じだと思いますが、普通に、引数を渡せました。
XCUIApplication には、 launchArguments というプロパティがあり、このプロパティ経由で渡すことができます。
渡す側
1 2 3 4 5 |
let app = XCUIApplication() app.launchArguments.append("SnapshotTest") // (1) 引数指定 app.launch() |
受け取る側
1 2 3 4 5 6 7 8 9 10 11 |
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 } |
UITest向けのテストデータの作り方
最初は、CoreData 向けに調べてたんですが、結局、とくに、CoreData 向けということではなく、
アプリが何かしらの情報を保持するものについては、この方法でサンプル用のデータを作るのが良いみたいです。
- アプリ起動の引数を使用して、テスト用に起動させる
- XCUIApplication の launchArguments で引数は指定できる
- application#willFinishLaunchingWithOptions で、引数に応じた処理ができる
Test Driven Developmentって、イテレーションが回り始めると楽しいけど、回し始めるための手順がいろいろあって、大変です。
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link