UITest実行時に端末に保存されているUserDefaultを削除する

以前UITest前にUserDefaultを初期化するためにXCUITestでアプリを削除するという記事を書きましたが、もっと簡単にUserDefaultの値を削除する方法を見つけたのでまとめます。

UITest

UITestはE2Eテストで別アプリからアプリの操作を行っているようなものです。その為UITestからUserDefaultの値を直接削除することはできまん。

その為、コマンドライン引数をsetup()で設定し、起動引数をAppDelegateで受け取りUserDefaultの値を削除します。

override func setUp() {
        super.setUp()
        continueAfterFailure = false
        let app = XCUIApplication()
        
        //コマンドライン引数を設定
        app.launchArguments.append("--uitesting")
    }

AppDelegate

アプリケーションの起動時にコマンドライン引数をチェックを行いUserDefaultの値を削除しています。

func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]?) -> Bool {
   if CommandLine.arguments.contains("--uitesting") {
        let userDefaults = UserDefaults.standard
        if let domain = Bundle.main.bundleIdentifier {
            userDefaults.removePersistentDomain(forName: domain)
        }
    }
    
    // ...Finish setting up your app
    
    return true
}

UserDefaultに限らずデータベースなどの初期化も行えると思います。なによりアプリを削除するより手軽で良いですね。