約2000行のコードベースのコードベースの唯一のメンテナーです。大きくはありませんが、時間が経つにつれてコードが保守しづらくなり、上司は私にコードを最初から書き直す時間を与えることに同意しました。
コードが維持および拡張するのが非常に悪夢になったので、今度は正しいことをしたいと思い、初日から単体テストを書くことを考えました(現在のコードにはテストがありません)。しかし、これについてはよくわかりません。
一方では、コードベースのサイズが2000行または1500行のコードを超えることはないと思います。一方、このアプリはしばらく使用されていると推定されますが、少なくとも6か月は使用します。
だから問題は:コードベースのサイズ正当化ユニットテストを書くこと?このサイズのプロジェクトの単体テストはやりすぎですか?それとも、より大きなプロジェクトの単体テストを記述する理由がここにも当てはまりますか?
I amは、コードベースの単体テストカバレッジを持つことの大きな利点を認識していることに注意してください。これがこのような小さなアプリにとってはやり過ぎなのかどうか疑問に思っています。
小さなコードベースのテストを書くのはやり過ぎですか?
絶対にありません。
コードベースは私たちを成長させる方法を持っています。このプレーはすでに実際に行われています。数百のLoCが数千に成長しました。数千は簡単に数万に成長します。
壊れたウィンドウ理論? について聞いたことがありますか?==テストから始めると、機能が拡張され、バグが修正されるにつれて、より多くのテストが記述される可能性が高くなります。それらがそこにない場合、人々はそれらを後で書くことはほとんどありません(言うまでもなく、彼らは後で書くことが難しくなり、多くのケースをカバーしません)。
したがって、はい、テストを記述しますが、コードを最初から完全に書き直すことを再検討することをお勧めします。 Michael Feather's Working With Working with Legacy Code のコピーを手に取り、テストbeforeおよびwhileあなたはそれに変更を加えています。これは小さなプロジェクトですが、それができない/できないことを意味するわけではありません Netscapeと同じ運命にあります。
ユニットテストを実行して、コードの正確さ(*)を確認します。
(*)確実にするために:数学的な意味ではなく、口語的な意味で。
コードの正確さの問題は、5行のコード、2000行のコード、または200000行のコードがあるかどうかに関係なく当てはまります。
つまり、バイナリ検索ルーチンは10行です。あなたはそれをユニットテストしないのはおかしいでしょう。
したがって、選択はあなた次第です。 (いわば。)
「小さなコードベース」を「正確さが重要ではない」と解釈する場合は、何もテストしないでください。しかし、この2つを同等にするものは何もありません。
正確さが重要な場合は、少なくともアプリケーションの正確性にとって重要であり、単にアプリケーションを実行するだけではテストが困難な部分をテストすることをお勧めします。そして、それらは常に存在します。 (以下のコメントでそれについてより多くの議論。)
いいえ、小さなものをテストし、大きなものをテストします。教科書から直接コピーしたものもテストします。
Java.util.Arraysのソートを作成したJoshua Bloch 追跡された Java標準ライブラリの1つ、および約20年間の教科書実装。
これは非常に微妙なため、分割統治アルゴリズムの実装の大部分に影響を与える可能性があります(2006年の時点で、これがおそらくもう当てはまらないというのは素晴らしいファンタジーです)。
できることはすべてテストしてください。
単体テストについて考える前に、コードが「維持および拡張するための悪夢」である理由を調べる必要があります。
文書化されていない変更が多数あり、問題が発生している可能性があります。書き換えによって、現在実装されているがドキュメントに記載されていないこのコードへのパッチが無視されないことを100%確実に確認する必要があります。あなたのコードが何をする必要があるかを正確に理解するまで、あなたのユニットテストは100%役に立たないでしょう。
また、ソフトウェアの書き直しに関しては article を試してください。
次に、「コードベースのどのサイズが単体テストを「正当化」するのか」という質問について具体的に説明します。他の答えがテストしたように、ユニットテストのためにやり過ぎは決してありません。
通常は1行だけの正規表現でさえ、単体テストが必要です。私の正規表現の単体テストは少なくとも10の異なる入力であり、それらを明確に破るためにさらに時間が費やされています。
エンジニアリング、ビジネス全般、または生活全般における重要な決定はすべて、費用便益分析から得られるものです。成功の秘訣は、最大限の効率を達成することです。私たちは皆、限られたリソースしか持っておらず、品質を犠牲にしたくありません。 「彼らから恩恵を受けるものだけのためのテストを開発しなさい。」私たちは専門家として、そのような価値を生み出す判断を下すために報酬を受け取ります。
単純な公式はありません。不可解な数学計算を行う10行の関数は、おそらくユニットテストの恩恵を受けるでしょう。書式設定された出力ステートメントの1,000行のセットはおそらく機能しません。
同じことが、ユニットあたりのテストのnumberにも当てはまります。一部のユニットは、40の異なるテストケースの恩恵を受ける可能性があります。他の人は4以下の恩恵を受けるかもしれません。
標準化された試験を受けることを考えてください。すべての回答を2回、3回以上チェックすることは理にかなっていますか?試験が1時間で終了しても4時間割り当てられている場合、各解答を8回確認する価値はありますか? 8回目のチェックで何個のエラーが検出されると思いますか?ある時点で、それを1日と呼び、試験を提出します。