クラス/モジュール/パッケージ/などの内部/プライベートコンポーネントをどの程度単体テストしますか?それらをすべてテストしますか、それとも外部とのインターフェースをテストするだけですか?これらの内部の例は、プライベートメソッドです。
例として、1つの中央プロシージャから呼び出されるいくつかの内部プロシージャ(関数/メソッド)を持つ再帰降下パーサーを想像してください。外の世界への唯一のインターフェイスは中央の手順であり、文字列を受け取り、解析された情報を返します。他のプロシージャは文字列のさまざまな部分を解析し、中央プロシージャまたは他のプロシージャから呼び出されます。
当然、外部文字列をサンプル文字列で呼び出し、手で解析した出力と比較して、外部インターフェイスをテストする必要があります。しかし、他の手順はどうですか?それらを個別にテストして、サブストリングが正しく解析されることを確認しますか?
私はいくつかの議論を考えることができます:
長所:
- より多くのテストが常に優れており、これはコードカバレッジの向上に役立ちます
- 一部の内部コンポーネントは、外部インターフェイスに入力を与えることにより、特定の入力(エッジケースなど)を与えるのが難しい場合があります。
- より明確なテスト。内部コンポーネントに(修正された)バグがある場合、そのコンポーネントのテストケースは、バグがその特定のコンポーネントにあったことを明確にします
短所:
- リファクタリングは非常に苦痛で時間がかかります。何かを変更するには、外部インターフェースのユーザーが影響を受けていない場合でも、ユニットテストを書き直す必要があります
- 一部の言語およびテストフレームワークでは許可されていません
あなたの意見は?