Macアプリで User Defaults によって自動的に表示される機能があります。例えば、自動ソフトウェアアップデートや使用許諾ダイアログなどなどです。アプリの初回起動時にだけ表示するみたいなものも、アプリが初回起動時なのかを判断するための情報を User Defaults に保存しています。
UI Testingと組み合わせると、これらが非常に邪魔になることがあります。逆にテストするために必ず表示させたいということもあります。つまり、テストケースによって表示・非表示を制御したいというケースが出てきました。これは言い換えれば、UITestingのテストケースコードから、テスト対象のアプリが参照する User Defaults を編集したいということです。
defaults を使う方法
最初に試したのは defaults を使う方法です。 defaults は User Defaults の値取得や値の書き込みを行うプログラムです。
defaults をUITestingのコードのsetup で行えば User Defaults の内容を自由に制御できるのでテストされる側のアプリの状態を制御できそうと考えました。
UITestingはSandbox環境で動作する
実際に実装してみると defaults を使う方法は機能しませんでした。理由は、UITesting のテストコードはテストされるアプリ内ではなく、UITestingのヘルパープログラム上で実行されます。このヘルパープログラムはSandbox環境で動いているので、テスト対象のアプリの設定ファイルを読み書きすることができません。そのため、defaults をテストコードから起動させてもテスト対象のアプリの User Defaults を書き換えることはできません。
コマンドライン引数を使う方法
本来はテスト対象のアプリは環境設定に依存するべきではないのだと思いますが、UITestingの場合は外部からの操作に応答するテストなので、アプリを実行して、マウスやキーボードイベントを起こしてアプリを自動的に動かすため、依存してしまう部分が生まれてしまいました。
そこでとった方法が、次のような方法です。
- ユーザーデフォルトの設定や特定の機能を作動させないなどをコマンドライン引数で指定できるようにする
- UITestingのコードでアプリを起動するときに、テストケースに合わせてコマンドライン引数を指定して、特定の設定で起動できるようにする
設定項目が多岐にわたるものについては、専用のパラメータファイルを用意し、パラメータファイルから設定を読み込む機能をアプリ側に作りました。
コマンドライン引数でパラメータファイルを指定できるようにし、テストケースに合わせた設定をできるようにしました。