0

一連の自動化されたテストを含む新しいコードベースを継承しました。私たちは「流れに乗って」、各マージと展開の前にそれらを実行してきました。一部のスタッフは、新しい機能を作成するときにテストのコレクションに追加しています。

私は、ホットポテトのようにこれらのものを削除する必要があることをチームに納得させるために最善を尽くしてきましたが、それについては内部で多くの論争があります.

私が見たところ、問題は次のとおりです。これらのテストの実行には非常に長い時間がかかります (ある開発者の古いマシンで最大 10 分!)。彼らは壊れ続けます - 私はあなたのことを知りませんが、私のソフトウェアが壊れるのが嫌いです. このバグのあるコードをすべて取り除けば、バグの数は少なくとも 10 分の 1 に減ります。新しいものを書いている開発者は、何かをするのに他の開発者の少なくとも 2 倍の時間を費やしています。これはばかげています。私たちはすでに厳しい締め切りで作業しており、少なくともこのプロジェクトでは、進行がさらに遅くなっています。これらの開発者の 1 人が行ったコミットの 1 つを見ていましたが、機能の LOC は 100 をわずかに上回り、テストでは 250 に近い LOC でした!

私の質問は、5 分ごとに壊れるこのバグのある保守不可能なコードをすべて取り除き (実際の機能が壊れ始めた場合に備えて検索と置換を行いたくありません)、開発者に次のように説得する方法です。時間を無駄にするのをやめますか?

4

2 に答える 2

3

テストが壊れ続けるのはなぜですか?なぜそれらはバグが多く、保守できないのですか? それがあなたの問題の根源です。

テストは、ソフトウェアの要件を表す必要があります。それらが壊れ続ける場合は、パブリック インターフェイスを介してコードを呼び出すだけでなく、実装の内部と密接に結合されていることが原因である可能性があります。パブリック インターフェイスを介してコードを駆動できない場合は、通常、コードをよりテストしやすいように設計する必要があることを示しています。これにより、コードがより明確で、より柔軟で、堅牢になる傾向があります。

テストを削除すると、コードベースがまだ機能するかどうかわからなくなります。「バグがある」という理由でテストを削除すると、厄介な質問が残ります。テストにバグがある場合、実際のコードのバグが少ないのはなぜですか?

一方、(レガシー)テストがひどく遅くて厄介な場合、少なくともそれらのいくつかは価値があるよりも面倒かもしれませんが、ケースバイケースでそれらを考慮する必要があります.それらをどのように置き換えるかを考えてください。テストの時間を計って、対象となる特に遅いテストがあるかどうかを確認できます。それらが JUnit テストの場合は、タイミングを自動的に取得します。また、コード カバレッジを測定して、テストが重複しているかどうか、またはサイズと実行時間を考慮して非常に少量のコードベースをカバーしているかどうかを確認することもできます。レガシー コードを扱うトピックに特化した書籍がいくつかあります。

自動化されたテストが適切に行われると、開発が遅くなるのではなく、スピードアップします (ソフトウェアを実際に動作させたいと仮定した場合)。 「機能しているように見える」とは対照的に、機能がいつ機能しているかを明確に知ることができます。

テストのスピードアップが望ましいでしょう。システムをエンドツーエンドで実行している場合、すべてのテストが高速になるわけではありませんが、私は通常、そのような「機能テスト」を、常に実行できるように非常に高速に実行する必要があるきめ細かい単体テストとは別にしています。単体テストの定義と遅いテストの扱い方については、Michael Feathers によるこの投稿を参照してください。

コードが機能するかどうかに関心がある場合、テスト コードは実際のコードと同じくらい重要です。重複を避けるために、正確で明確で、因数分解されている必要があります。比率はコードの種類によって大きく異なりますが、少なくとも実際のコードと同じくらい多くのテスト コードを使用することは完全に正常です。あなたの特定の例が過度であったかどうかは、それを見ずして言うことは不可能です。

更新:他の質問の1 つで、「最新の気の利いたフレームワーク、単体テストと機能テスト、CI、バグ トラッカー、アジャイル ワークフローを環境に導入しました」と答えています。テストについて考えが変わったのですか、それともこの質問は、おそらくストローマンですか? それとも、あなたの質問は本当に「古いテストをすべて破棄して、最初からやり直すべきですか」ですか? (開発者が新しいテストを書いているというあなたのコメントを考えると、そのようには読めません...)

于 2012-10-03T15:34:58.713 に答える
0

テストはテスト フレームワークの一部ですか、それとも本番ロジックに付随する独自のテスト ロジックですか?

自作の場合は、テストを構造化されたフレームワークにリファクタリングするようチームを納得させることができるかもしれません。これが最初に設定されたときはそうではなかったかもしれないが、今ではたくさんあります。

ご存じのように、バグを見つけて修正するのは早ければ早いほどよいのです。自動化されたテストは、まだ簡単に修正できるエラーを発見する方法の 1 つです。テストの準備と維持に余分な開発時間がかかるかもしれませんが、最終顧客以外のすべての人をすり抜けてしまう重大な欠陥 (特に締め切りが関係している場合) とのバランスを取る必要があります。

于 2012-10-03T15:50:47.547 に答える