テストを書く理由は2つあります。
- 期待される行動を主張する
- 行動の退行を防ぐ
(1)期待される行動の主張:
期待される動作を主張するときは、コードが期待どおりに機能することを確認する必要があります。これは事実上、あらゆる種類のコードを実装するときに開発者が実行するルーチンの手動検証を行う自動化された方法です。
- 私が書いたものはうまくいきましたか?
- このループは実際に終了しますか?
- 思った順番でループしているのでしょうか?
- これはnull入力に対して機能しますか?
これらは私たち全員が頭の中で答える質問です。通常、私たちは頭の中でコードを実行しようとします。それが機能するように見えることを確認してください。これらの場合、コンピュータに明確な方法でそれらに答えさせることがしばしば役に立ちます。したがって、それを主張する単体テストを作成します。これにより、コードに自信が持てるようになり、欠陥を早期に発見でき、実際にコードを実装することもできます。
必要と思われる場所でこれを行うことをお勧めします。理解するのが少し難しい、または重要なコード。些細なコードでもその恩恵を受けることができます。それはすべてあなた自身の自信についてです。それを行う頻度と進む距離は、あなた自身の満足度に依存します。自信を持って「はい」と答えられるようになったら停止します。これで問題なく動作しますか?
この種のテストでは、可視性やインターフェースなどは気にせず、コードが機能することだけを気にします。そうです、質問に「はい」と答えるためにテストする必要があると感じた場合は、プライベートメソッドと保護されたメソッドをテストします。
(2)行動の退行の防止に関する見解:
動作するコードを入手したら、このコードを将来の損傷から保護するためのメカニズムを導入する必要があります。誰もあなたのソースと設定に二度と触れないのであれば、これは必要ありませんが、ほとんどの場合、あなたや他の人があなたのソフトウェアのソースと設定に触れます。この内部のいじりは、作業コードを壊す可能性が非常に高いです。
この損傷から保護する方法として、ほとんどの言語にメカニズムがすでに存在します。可視性機能は1つのメカニズムです。プライベートメソッドは分離され、隠されています。カプセル化は、他のコンパートメントを変更しても他のコンパートメントに影響を与えないように、物事をコンパートメント化するもう1つのメカニズムです。
このための一般的なメカニズムは、境界へのコーディングと呼ばれます。コードの一部の間に境界を作成することにより、境界の内側のすべてを境界の外側のものから保護します。境界は相互作用のポイントになり、物事が相互作用する契約になります。
これは、境界のインターフェイスを壊したり、期待される動作を壊したりすることによって境界を変更すると、それに依存する他の境界が損傷し、場合によっては壊れることを意味します。そのため、これらの境界を対象とし、セマンティックと動作が変化しないことを表明する単体テストを用意することをお勧めします。
これはあなたの典型的なユニットテストであり、TDDまたはBDDについて言及するときにほとんどの人が話します。重要なのは、境界を強化し、変化から保護することです。プライベートメソッドは境界ではないため、このためにプライベートメソッドをテストする必要はありません。保護されたメソッドは制限された境界であり、私はそれらを保護します。それらは世界にさらされていませんが、それでも他のコンパートメントまたは「ユニット」にさらされています。
これをどうする?
これまで見てきたように、パブリックメソッドとプロテクトメソッドをユニットテストするのには十分な理由があります。インターフェイスが変更されないと主張するからです。また、実装が機能することを主張するために、プライベートメソッドをテストする正当な理由もあります。では、それらすべてをユニットテストする必要がありますか?
はいといいえ。
まず第一に、可視性に関係なく、コードが機能することを確信できるように、ほとんどの場合に機能するという明確な証拠が必要だと思われるすべてのメソッドをテストします。次に、それらのテストを無効にします。彼らはそこで仕事をしました。
最後に:境界のテストを作成します。システムの他のユニットで使用される各ポイントのユニットテストを行います。このテストがセマンティックコントラクト、メソッド名、引数の数などを表明していることを確認してください。また、テストがユニットの使用可能な動作を表明していることを確認してください。テストでは、ユニットの使用方法と、ユニットで何ができるかを示す必要があります。これらのテストを有効にして、すべてのコードプッシュで実行されるようにします。
注:最初のテストセットを無効にした理由は、リファクタリング作業を実行できるようにするためです。アクティブなテストはコード結合です。それはそれがテストしているコードの将来の変更を防ぎます。これは、インターフェースと相互作用コントラクトにのみ必要です。