🥚
iOS開発におけるUnitTestについての超基本
はじめに
iOS開発に使用されるテストについて学び始めたので、初学者向けにごく基本的な概要をまとめました
UnitTest(単体テスト)とは
- 開発において何度も行われる小さなテストのこと
- 単体テストは自己完結型のメソッド。特定の引数を使用してテスト対象の関数を呼び出し、帰ってきた結果を検証する
- 1つのテストでは、必ず1つの機能だけを検証する。1つの単体テストで複数の機能を検証するのはNG
- iOS開発で単体テストを作成するには、XCTestというフレームワークを使うのが良い。テストにクリアすると緑のチェックボックス✅が、クリアしないと赤いバツマーク❌が出る
- 単体テストはダミーのオブジェクトを使用するため、依存関係は生じない。また、ネットワーク接続やデータベース操作は実行しない(これらを実行するテストは統合テスト)。これらの理由から、高速で実行することができる。
Testの種類
「Unit Tests(単体テスト) - Integration Tests(統合テスト) - UI Tests」の順で行われる
- Unit Tests
- すべてのテストの前に実行される、最小単位のテスト。ダミーのオブジェクトを使用することで、依存関係を持たせない
- ネットワークに接続やデータベース操作を実行しない
- 高速で実行される
- 開発中は複数のテストが頻繁に実行される
- Integration Tests
- ダミーのオブジェクトが使用されず、依存関係が生じた状態で行うテスト(HTTPリクエストを送信したり、データベース操作する)
- 外部システムと通信する必要があるため、単体テストよりも実行が遅くなる
- UItests
- UIがちゃんと表示されるかのテスト
- デバイス上でアプリを実行し、ユーザーの動作をシミュレートして、アプリが期待通りに動作するかどうかをテストする
ユニットテストのF.I.R.S.T.の原則
F.I.R.S.T.の原則を守ることで、ユニットテストの品質と効果性を高め、開発プロセス全体をスムーズに進めることができる
- F(Fast)
- 早く動く必要がある
- ネットワークに接続やデータベース操作を実行しない
- I(Independent)
- 互いに独立している、依存関係がない
- 一つのテストが失敗しても、他のテストには影響を与えないようにすることで、問題の特定が容易になる
- R(Repeatable)
- 反復可能でなければならない
- 複数回実行しても、別の環境で実行しても、同じ結果が得られる
- S(Self-validating)
- 自己検証。単体テストが成功したか失敗したかを知るために、開発者は何もすべきではない
- 単体テストは、テスト対象の関数の結果を検証し、それ自体が合格か不合格かを決定する
- 人間が結果をチェックする必要がないので、テストの結果の解釈が一貫する
- T(Thorough & Timely)
- 徹底したテスト駆動開発
- アプリの機能の開発中に単体テストを作成する
- コードを実稼働環境にプロモートする前に、コードを単体テストでカバーする
テスト駆動開発
テスト駆動開発とは
- 非テスト駆動開発は、コードを書いた後にテストを作る
- テスト駆動開発は、コードを書く前にテストを先に書く
テスト駆動開発のライフサイクル(Red->Green->Refactor->Repeat)
- Red:失敗するテストの作成
- 最初に新しい機能や修正をテストするためのテストケースを書く。この時点では、実際の機能や修正は実装されていないため、テストは失敗する。
- Green:テストを通過する最小限のコードの実装
- テストケースが通過するための最小限のコードを作成する。完璧な実装よりもテストを成功させることが重要
- Refactor:リファクタリング
- 単体テストのコードとアプリのコードをクリーンアップして、見た目も動作も良くする。このテストが通ることを確認しながら、コードの改善をおこなうこと。再利用および改善できるコードがあるかどうかを確認
- Repeat: 前の3つの機能を繰り返して実装する
Discussion