私の最後のプロジェクトでは、ほぼ 100% cc で単体テストを行った結果、バグはほとんどありませんでした。
ただし、単体テストはホワイト ボックスにする必要があるため (必要な結果を得るには内部関数をモックする必要があるため、テストではコードの内部構造を知る必要があります)、関数の実装を変更するたびに、テストも変更。
関数のロジックは変更せず、実装のみを変更したことに注意してください。
非常に時間がかかり、間違った方法で作業しているように感じました。すべての適切な OOP ガイドライン (具体的にはカプセル化) を使用したため、実装を変更するたびに、残りのコードを変更する必要はありませんでしたが、単体テストを変更する必要がありました。
彼らが私たちに仕えるのではなく、私たちが試練に仕えているように感じました。
これを防ぐために、単体テストはブラック ボックス テストにすべきだと主張する人もいました。
ドメイン全体の 1 つの大きなモックを作成し、すべてのクラスのすべての関数のスタブを 1 か所で作成し、それをすべての単体テストで使用すれば、それが可能になります。
もちろん、特定のテストで特定の内部関数を呼び出す必要がある場合 (DB への書き込みを確認するなど)、スタブをオーバーライドできます。
したがって、関数の実装を変更するたびに (ヘルプ関数の呼び出しを追加または置換するなど)、メインの大きなモックを変更するだけで済みます。一部の単体テストを変更する必要がある場合でも、以前よりもはるかに少なくなります。
アプリが特定の場所で DB に書き込むことを確認するだけでなく、特に期待しない限り、他の場所の DB にアプリが書き込まれないことを確認する必要があるため、単体テストはホワイト ボックスでなければならないと主張する人もいます。に。これはもっともな意見ですが、ブラック ボックス テストの代わりにホワイト ボックス テストを書くことに時間をかける価値はないと思います。
結論として、2つの質問:
ブラック ボックス ユニット テストの概念についてどう思いますか?
そのコンセプトを実現する方法についてどう思いますか? もっと良いアイデアはありますか?