単体テストの実装方法は理解していますが、それらをいつ使用するかを理解するのに苦労しています。
基本的なリマインダー アプリがあるとします。ユーザーはリマインダーを追加/編集/削除し、それらをテーブルビューで表示できます。アプリのどの部分に対して単体テストを設定する必要がありますか?
単体テストの実装方法は理解していますが、それらをいつ使用するかを理解するのに苦労しています。
基本的なリマインダー アプリがあるとします。ユーザーはリマインダーを追加/編集/削除し、それらをテーブルビューで表示できます。アプリのどの部分に対して単体テストを設定する必要がありますか?
理想的な世界の答えは、あなたが書いたコードのすべての行がユニットテストされるべきであると言うでしょう。
しかし、それを少し忘れて、現実の世界に戻りましょう。重要であり、別の防御線を持つことは価値のあるコードのテストを作成します。言い換えれば、1つのフィールドに値を割り当てるだけのコンストラクターをテストすることは非常に理にかなっていますか?ほとんどの場合、そうではありません。クライアントが提供する複雑なXMLからアカウントデータを抽出する単体テストパーサーを使用する価値はありますか?おそらくそうだ。
この違いはどこから来るのですか?2つの主な理由:
なぜ区別するのですか?なぜこれをテストし、それをテストしないのですか?(理想的な世界の答えが示唆するように)単純にすべてをテストする方が簡単ではないでしょうか?
いいえ。時間とお金の制約のためです。コードを書くには両方が必要です。そして、誰かがあなたの製品の配達を待つのに一定の時間しかないと同じように、誰かがあなたの製品に喜んで支払うのは一定の金額だけです。一部のテストは、それだけの価値がありません(ここでも、コンストラクターのコード例)。単体テストは 収穫逓減の影響を受けないことを忘れないでください(80%のコードベースをテストでカバーすると、開発時間が20%余分にかかり、後でデバッグ/メンテナンスにかかる時間を20%節約できますが、さらに10%を実行すると、2倍の時間がかかる可能性がありますそれでも、はるかに少ないゲインが得られます)。
繰り返しになりますが、おそらく「どこに線がありますか?」と尋ねたいと思うでしょう。「わかりました。このコードの単体テストは実際には必要ありません」と決めるのはいつですか。残念ながら、この種の判断には経験が伴います。コードを書き、コードを読み、他の人(おそらくより経験豊富な開発者)が何をして学ぶかを見てください。
いくつかの一般的なアドバイス(ユニットテストの対象)を与えるとすると、それらは次のようになります。
リマインダーをどこかに、おそらく plist に保存していると仮定します。Reminder オブジェクトを生成して格納し、データを取得して、最終的に使用可能な Reminder クラス オブジェクトを生成する単体テストを作成できます。
そうすれば、いくつかのことがわかります。
A: リマインダーの生成は機能しています
B: データを保存する方法は機能しています
C: Data から Reminder オブジェクトへの移動は機能しています
ただし、アプリの実際の「機能」を単体テストできると期待するべきではありません。タッチ イベントやナビゲーション コントロールなど。これらは、まったく別の議論である受け入れテストに任せるべきです。
書いたすべてのコードをテストします。本当にかっこよくなりたいなら、まずテストを書いてください。モデルまたはコントローラーにメソッドがある場合は、そのテストも必要です。
コードについて詳しく知らなければ、アドバイスするのは難しいです。しかし、コントローラー ( などRemindersController
) とモデル ( などReminder
) があるように思えます。これは、私が始める基本的な概要です。
リマインダーコントローラー
リマインダー
initWithMessage:atTime:
メッセージを設定する必要がありますinitWithMessage:atTime:
時間を設定する必要がありますどのタイプのテストをいつ作成するかを選択する際には、次の原則に従います。
エンドツーエンドのテストを書くことに集中してください。単体テストよりもテストごとにより多くのコードをカバーするため、費用対効果の高いテストを得ることができます。これらをシステム全体の基本的な自動検証にします。
複雑なロジックのナゲットに関する単体テストの記述にドロップダウンします。単体テストは、エンド ツー エンド テストのデバッグが困難な場合や、適切なコード カバレッジのために記述するのが面倒な場合に役立ちます。
テスト対象の API が安定するまで待ってから、いずれかのタイプのテストを作成してください。実装とテストの両方をリファクタリングする必要はありません。
Rob Ashton がこのトピックに関するすばらしい記事を書いています。私はこの記事を参考にして、上記の原則を明確に説明しました。