開発プロジェクトが大きくなってくると、ユニットテスト、UIテストとテストの量がどんどん増えていきます。
特にUIテストは実行に時間がかかるので、Pull Requestが作成・更新されるたびに実行するのは現実的ではないケースもあります。
このため、Pull Requestが作成・更新されたときはユニットテストのみ、developブランチにマージされたときはユニットテストとUIテスト、リリース前の検証ではユニットテスト、UIテスト、スクリーンショットの取得など全てのテストを実行する、といったように開発の段階によって実行するテストを切り替える方針を取ることがあります。
これを実現するには2種類の方法があります。
- Schemeを使用する
- Test Plans(テストプラン)を使用する
本記事では上記を実現するこの2種類の方法について説明します。
実現したいこと
以下の3つのパターンを実現します。
- ユニットテストのみを実行する
- UIテストのみを実行する
- ユニットテスト、UIテスト両方を実行する
Schemeを使用する
Schemeを作成する
Schemeを使って3つのパターンを実現するには、3つのSchemeを作る必要があります。
まずは、Product > Scheme > Manage Schemes...からSchemeの管理画面を開きます。プロジェクトによってはすでに複数のSchemeが作成されているかもしれませんが、ベースとしたいSchemeを選択してEdit...をクリックしてください。
Duplicate SchemeをクリックしてSchemeを複製し、「UITest」という名前をつけましょう。同じ要領で「AllTests」というSchemeも作っておきます。
3つのSchemeが作成された状態にします。
まずはメインのScheme(ここではBambooCIApp
)を編集します。
メインのSchemeではユニットテストのみを実行するようにします。
左からBuildアクションを選択し、Targetsにはメインターゲットとユニットテスト用ターゲットだけになるようにします。
左からTestアクションを選択します。ユニットテスト用ターゲットのEnabledにチェックが入っていることを確認します。
次に、UITest Schemeを編集します。
こちらはメインターゲットとUIテスト用ターゲットだけになるようにします。
TestアクションでUIテスト用ターゲットのEnabledにチェックが入っていることを確認します。
最後にAllTests Schemeを編集します。
こちらはユニットテスト用とUIテスト用の両方のターゲットが含まれるようにします。
テストを実行する
ユニットテストのみを実行したい場合、メインのSchemeを選択し、⌘+Uを押下します。
Test Navigatorを見ると、ユニットテストのみが実行されていることがわかります。
次はUITest Schemeを選択して⌘+Uを押下します。
UIテストのみが実行されています(わかりづらいですが、ユニットテスト用ターゲット(BambooCIAppTests
)のテストはグレーアウトされています)。
最後にAllTests Schemeを選択して⌘+Uを押下します。
Test Plans(テストプラン)を使用する
Test PlansはXcode11で追加された機能で、WWDC2019のセッションでは以下のメリットが紹介されていました。
ここで紹介するのは2つ目のメリットに当たるのかな?(ちょっと違う気もする)
Test Planを作成する
メインのScheme(ここではBambooCIApp
)の編集画面を開きます。
左からTestアクションを選択し、「Convert to use Test Plans...」をクリックします。
「Create Test Plan from scheme」を選択し、「Convert...」をクリックします。ここではファイル名はデフォルトのまま保存します。
BambooCIApp.xctestplanというファイルが作成されました。
次に、UIテストのみを実行するTest Planを作成します。Test Planは一つのSchemeに複数紐付けることができるので、Schemeを使った方法で解説したようにテストの実行単位ごとに複数のSchemeを作成する必要がないのです。
メインのSchemeの編集画面を開き、+ボタン > Create empty Test Plan...をクリックします。UITest.xctestplanという名前で保存しましょう。
UITest.xctestplanを選択し、Testsタブを開きます。左下の+ボタンをクリックし、UIテスト用ターゲット(BambooCIAppUITests
)を選択してAddをクリックします。
同じ要領で、メインのSchemeの編集画面からAllTests.xctestplanを作成しましょう。こちらはユニットテスト用とUIテスト用両方のターゲットが含まれるようにします。
テストを実行する
Test Navigatorを開くと、Schemeに紐づくTest Planが選択できるようになっています。まずはDefaultのTest Planでテストを実行してみましょう。⌘+Uを押下します。
ユニットテストのみが実行されました。
UITest、AllTestsを選択して⌘+Uをした結果は以下の通りです。それぞれ、UIテストのみ、ユニットテストとUIテスト両方が実行されています。
まとめ
実行対象のテストを管理する方法について、Schemeを使う方法とTest Planを使う方法についてご紹介しました。
チームで運用することを考えた場合、xctestplanファイルにテストに関する情報が集まっているので管理がしやすいなと思いました。
また、今回紹介したテスト対象の管理という文脈ではどちらを使う方法でもそれほど違いはないかもしれませんが、Test Planでは同じテストを言語設定を変えて複数実行できるなど、Schemeでは実現できないこともできたりするので、そのあたりは今後自分が使うことになったら記事にしようと思います。