膨大な数の失敗したテストに対処する方法は?[閉まっている]


22

私はJavaで書かれた古いプロジェクトの開発に取り組んでいます。LOCは1,000万を超え、さらに悪いことに、4000を超える機能テストがあります。

Hudsonによってスケジュールされたテストは、大きなコード変更のたびに狂ったように失敗しています。テストの失敗の検証-製品またはテストに問題がある場合、数か月かかります。何をテストしているかわからないため、古いテストを削除することはできません!

私たちにできることは?そのような量のレガシーテストをどのように進めるのですか?


6
実際の質問には答えがあります。なぜ状況がひどいのか、上司や同僚があなたを不幸にする理由を説明するのではなく、それを改善するために何をしたいのかを説明してください。詳細については、クリックしてくださいここで ...
ブヨ

13
そもそもテストの失敗を許可したのはなぜですか?ところで4000は10 MLOCのために多くのテストことではありません
BЈовић

6
停止、ドロップ、およびロール。
ナビン

13
テストがテストしているものを見つけてください。そして、最初のすべての再訪と不思議地球上でどのように問題を見つけるために数ヶ月かかり、また、あなたの要件はそんなに変わっ方法を見つけるのテスト。テストは、アプリケーションの要件をカプセル化することを目的としています。テストが失敗した場合、要件に従ってコードが実行されていません-誤って記述したか、要件に準拠していないコードがあります。
ダンパントリー

6
コンパイラが1つの '}'が欠落しているために膨大な数のエラーが発生するのを見てきました。これらが過剰な依存関係を持つ機能テストである場合、おそらく同じ種類の問題が働いていますか?
ダンピチェルマン

回答:


37

それらを放棄します。

明らかに多くの労力を費やしたものを手放すのは難しいことを知っていますが、テストはあなたのために機能していません、彼らはあなたに反対しています。テストスイートは、システムが本来行うべきことを実行するという自信を与えることになっています。そうしないと、資産ではなく負債になります。システムまたはテストに問題があるかどうかは関係ありません。テストスイートを実行すると大量のエラーが通知される限り、その目的を果たすことはできません。

ここで必要なのは、エラーなしで実行される新しいテストスイートです。つまり、最初はほとんどカバーされず、実際にはほとんどカバーされません。システムを修正するか、時間をかけてシステムに関する何かを完全に理解するたびに、テストでその知識を調整します。時間が経つにつれて、これにより、将来構築できる新しいセーフティネットが作成されます。古くて理解されていないセーフティネットにパッチを当てることは、ほとんど価値がないタイムシンクです。

古いスイートから新しいスイートにテストを転送することを支持することさえあります。確かに、それらのいくつかは今成功するかもしれませんが、彼らは彼らがテストすることになっているものを正確にテストしているから、または単にいくつかのランダムなショットが常にターゲットに当たるからですか?明らかに、あなたが費やすことができる努力でできることとできないことについて実用的でなければなりません、テストスイートがその仕事をするためにきれいに実行しなければならないという原則に妥協することはできません。


9
あなたの意見には論理が見えません。「テストスイートは、システムが本来の役割を果たしているという自信を与えるはずです。[...]今必要なのは、noで実行される新しいテストスイートです。エラー。」テストが失敗するようなコードに欠陥がある場合、テストを書き直して欠陥のあるコードに合格する必要があるわけではありません。
DBedrenko

13
ヘクターの状況は、コードまたはテストが間違っているかどうかを知らないということです。もしそうなら、彼はコードベースで作業し、いつかテスト、時にはビジネスコードを変更することができました。現状では、問題を修正するのか、それとも実行するのかわからないので、この種のつまらない仕事でも支払いはありません。
キリアンフォス

5
「テストスイートは、システムが何をすべきか(あなたがそうするべきだ)という自信をあなたに与えることになっています。」いいえ、システムがすべきことをするかどうかを教えてくれるはずです。誤信念は、なしよりも悪いです。「必要なのはエラーなしで実行されるテストスイートです」いいえ、彼が必要とするのは、コードの健全性に関する有用な情報を提供するテストスイートです。彼が今持っているのは、何もテストしない光沢のある新しいテストスイートの緑色のライトよりも優れた多くの不可解な警告灯です。彼は一時的に古いテストを無効にする必要がありますが、偽物であると確認していないものは捨てないでください。
ベータ版

4
この答えは信じられないほど悪いアドバイスです!小規模なコード変更で大量のテストに失敗する場合、おそらくコード品質の問題があります。テストは、少なくとも何かを壊したことを通知します。コードを改善する必要があります(テストを使用して慎重にリファクタリングします)。テストを削除するだけでは、何かが壊れているかどうかを知る方法がありません。
ジャックB

4
これはひどいアドバイスです。OPとそのチームが既にコードベースとそのテストを理解できない場合、テストを破棄してやり直すことで、OPの中心的な問題であるコードベースの理解を解決することはできません。テストが書かれたときに機能したと想定できると思うので、彼のチームは各テストがテストしているものを追跡し、ソースを読んで今日のコードベースかテストが間違っているかを判断する必要があります。誤ったガイドがあり、情報に基づいていない/単純なテストでやり直すよりもはるかに簡単です。
SnakeDoc

29

行ってテストを修正します。

あなたの最大の間違いは、テストが失敗することを許可し、明らかにそれをしばらく無視したことです。あなたが持っているのは「レガシーテスト」ではありません-あなたはレガシーコードに取り組んでいます。そして、テストなしで記述されたすべてのコードはレガシーであると考えています。


テストの失敗の検証-製品またはテストに問題がある場合、数か月かかります。古いテストを削除することはできません。テストの内容がわからなかったからです。

明確な要件で作業していないため、組織にはさらに大きな問題があるようです。あなた(または他の誰か)が正しい行動を確認できないことを理解できません。


4
それが理想的なことですが、ここでのテストは非常に悪いので、プログラマは自分がテストしていることすら知らないようです。この場合、WTFテストを削除し、すぐに新しい意味のあるテストを書き始めるのが最善だと思います!最近のプロジェクトでは、正当な理由なしにテストが常に失敗する同僚と同様の問題がありました(テストされるはずのものが間違っていたので失敗しませんでしたが、テストコードは非常に脆く、決定論的でもありませんでした!) 。私は何日も自分ができることを書き直し、残りをゴミ箱に捨てました!
シャウティエ

@Shautieh WTFテストはWTFコードなしでは行かないため、テストを修正することは通常コードをリファクタリングすることを意味します。そして、ランダムに失敗するテストは無能の兆候です。そして、あなたの同僚の監督者は彼らの仕事をしていないことを非難することです。
BЈовић

2
人生は厳しい場合があります:WTFテスト(およびコード)の責任者はチームで最高の給与(私より20%以上多い)を獲得し、プロジェクトの途中で辞めたとき(より高い給料の仕事を見つけたため) )私は彼の開発者のいくつかを
引き継が

@Shautieh:私の同僚はかつて、コードのバグはコードのバグとテストの盲点の2つのバグだと言っていました。テストの失敗を容認する開発者を数える場合、実際には3人であり、そのような無能な人を昇進させるマネージャーを数える場合は4人です。
ベータ版

@Betaは、TDDで時々使用される定義と非常によく似ています。「バグは、まだ書いていないテストです。」
モニカの復元

22

テストは貴重です。少なくとも、彼らは誰かがそれらを書くのに時間を費やすべきだと考えたことを記録しているので、おそらく彼らは誰かに何らかの価値を持っていたと思われます。運が良ければ、チームがこれまでに取り組んだすべての機能とバグの完全な記録が含まれることになります。それらを見るまで、ここでどちらが当てはまるかわかりません。

ほとんどのテストがほとんどの時間をパスした場合は、弾丸を噛んで、失敗したいくつかのテストが何をしようとしていたのかを把握し、次回の仕事がより簡単になるように修正または改善するために時間をかけるだけです。その場合、少数の失敗したテストで何をすべきかについてのアドバイスについては、各テストの意図を決定するセクションに進んでください。

一方で、今は赤のビルドに直面しているかもしれませんし、数百または数千のテストがしばらくパスしていませんでした。ジェンキンスは長い間グリーンになっていませんでした。この時点で、Jenkinsのビルドステータスは役に立たなくなり、チェックインに関する問題の重要なインジケーターは機能しなくなりました。これを修正する必要がありますが、リビングルームの混乱を片付ける間、すべての前進を止める余裕はありません。

必要な考古学を実行しながら健全性を維持し、失敗したテストからどのような値を回復できるかを判断するには、次の手順をお勧めします。

失敗したテストを一時的に無効にします。

あなたの環境に応じてこれを行うことができるいくつかの方法がありますが、それらは明確に説明していないので、特定の方法を本当にお勧めすることはできません。

一部のフレームワークは、予想される障害の概念をサポートしています。もしそうなら、このカテゴリに残っているテストの数のカウントダウンが表示されるので、これは素晴らしいことです。また、いくつかのテストが予期せず合格し始めたら通知されます。

一部のフレームワークはテストグループをサポートしており、Hudsonにテストの一部のみを実行するように指示したり、テストのグループをスキップしたりすることができます。つまり、テストグループを手動で実行して、現在合格しているものがあるかどうかを確認できる場合があります。

一部のフレームワークでは、単一のテストを無視するように注釈を付けたり、マークを付けることができます。この場合、グループとしてそれらを実行することは困難ですが、それらがあなたの気を散らすのを防ぎます。

通常はビルドに含まれないソースツリーにテストを移動できます。

極端な場合、バージョン管理システムのHEADからコードを削除できますが、これにより、3番目のフェーズがいつ完了したかを認識しにくくなります。

目標は、ジェンキンスができるだけ早くグリーンになるようにすることです。そうすれば、できるだけ早く正しい方向に動き始めることができます。

テストの関連性を保ちます。

コードを追加または変更するときに解決して新しいテストを追加し、すべての合格したテストが合格するようにコミットします。

テストは、最初は十分に記述されたテストではなかったなど、さまざまな理由で失敗する場合があります。しかし、Jenkinsをグリーンにしたら、そのように保つことが本当に重要です。

良いテストを書くことに慣れて、テストが失敗し始めたら大したことにしてください。

各テストの目的を決定します。

無効化されたテストを1つずつ確認します。最も頻繁に変更するモジュールに影響を与えるものから始めます。テストの目的と失敗の理由を特定します。

  • コードベースから意図的に削除された機能をテストしますか?その後、おそらく削除できます。

  • まだ誰も気付いていないバグをキャッチしていますか?テストを元に戻し、バグを修正します。

  • それは不当な仮定を行っていたために失敗しましたか(たとえば、ボタンテキストは常に英語であると仮定していましたが、アプリケーションを複数の言語にローカライズしました)。次に、テストを1つのことに焦点を合わせ、できる限り関係のない変更からテストを分離する方法を見つけます。

  • テストはアプリケーション全体に広がり、システムテストを表しますか?次に、メインのJenkinsテストスイートからそれを削除し、実行頻度の低い回帰スイートに追加します。

  • アプリのアーキテクチャは認識されないほど変更されたので、テストでは何も役に立たなくなりましたか?消して。

  • テストは、コードカバレッジ統計を人為的に増やすために追加されましたが、実際には、コードが正しくコンパイルされ、無限ループに陥らないことを確認するだけです。または、テストは、選択したモックフレームワークが指定した結果を返すことを確認するだけです。消して。

この結果、一部のテストは有効になり、一部は変更され、一部は独立した複数のバイトサイズのチャンクに分割され、一部は削除されます。あなたがまだ新しい要件で進歩を遂げている限り、このような技術的負債に対処するための少しの時間を確保することは責任があります。


1
テストが失敗するという理由だけでテストを無効にすることは、本当に悪い考えです!あなたのアドバイスの残りは良いですが、これはそうではありません。理解できないテストは無効にしないでください。テストのポイントは緑色のバーを取得することではなく、機能するソフトウェアを取得することです!
ジャックB

それは問題の規模に依存します。しかし、私は同意します、私は実際にそれを明らかにしていません。
ビルミシェル

「緑であるが、すべての変更が赤くなる」と「赤くなりすぎて、緑がどのように見えるかを忘れてしまった」と区別するための段落を追加しました
ビルミシェル

一部のフレームワークでは、テストを無効化または削除する代わりに、予期される失敗の概念も提供します。これにより、SNRを高めることができます。これは、新しい障害(常に非常に多くの障害がある場合は通知しません)についてより直接的にアラートを受け取ることができますが、既知の障害について通知され、さらに重要な場合には以前に失敗したテストが突然再びパスします。予期しない失敗が読み取られ、予想される失敗がオレンジ色の場合、赤色のテストを最初に緑色にし、オレンジ色のテストを2番目に優先させます。
5gon12eder

11

4000テストは難題です。40回のテストの方が扱いやすいです。管理可能な数のテストをランダムに選択して、実行および分析します。結果を次のように分類します。

  1. 無駄なテスト
  2. 正常に実行される便利なテスト
  3. 失敗する便利なテスト

多くのテストが最初のカテゴリに該当する場合は、現在のテストスイートを破棄し、現在のコードに役立つテストスイートを作成するときが来るかもしれません。

コードの問題を知らせる方法で多くのテストが失敗した場合、失敗したテストを修正して問題を解決する必要があります。1つまたは2つのバグを修正すると、多数のテストが実行される場合があります。


2
実際&簡単な方法を提供するための+(INT)(PI / 3)テストなしが、 -テストスイートを-障害のあるデザインの兆候であるOPによって記載されているように、私はそれに同意しながら、経験則としては、このようなテストのテスト何が問題なのか、テストスイート自体に関するアドバイス(「テストを中止する」、「テストを修正する」、「新しいテストを書く」)はまったく役に立ちません。まさにあなたが言うように:もし4kのテストがあり、それらの3/4の完全にランダムな 40についてはくだらないと役に立たない場合-私はスイート全体をダンプすることをheしません。それらの3/4が実際に有用であれば、コードを改善することに専念します。
vaxquis

7

この文が正しい場合、

テストは...コードが大きく変更されるたびに狂って失敗します。

つまり、「より大きなコード変更」の直前にコードにロールバックすると、テストの多くが再びパスすることを意味します。それを行った後、変更の小さなチャンクを取得し、どのテストが新たに失敗しているかを確認します。これにより、どのコード変更がどのテストの失敗を引き起こしているのかをより適切に特定できます。各テストについて、問題を特定したら、新しいコードに欠陥があるか、テストに欠陥があるかを判断できるはずです。新しいコードに問題がある場合は、特定のバグがすでに修正されている場合に備えて、最新バージョンと比較してください。

最新のコードベースが得られるまで繰り返します。

これは圧倒的な作業のように思えるかもしれませんが、この経路をたどって問題のいくつかを特定し始めると、プロセスが大幅にスピードアップするパターンが出現し始める可能性が非常に高くなります。例えば:

  • 多くのテストが欠陥のある他の何かに依存していることに気づくかもしれません。その1つのピースを修正すると、多くのテストが修正される場合があります。
  • 多くのテストに欠陥があり、修正または削除する必要があることに気付くかもしれません。
  • 特定の開発者がテストを中断させる頻度がはるかに高いことに気付くかもしれません。その開発者は、より多くのトレーニングまたは監督を必要とする場合があります。

3

それらが何をテストしているのかわからない場合は、わかるまで削除してください。テストは流動的なものです。不要になった機能を削除した場合、その機能をテストするテストを変更する必要があります。そのため、テストが何をテストしているのかを知らない限り、それらを使用してコードベースを変更する見込みはありません。

開発者のマシンにテストシステムをセットアップして実行すると、開発者はテストがどの部分とやり取りしているのかを確認し、不足しているこのドキュメントを提供し、正しく変更されていないか、またはより正確にテストします。

つまり、変更時に古いテストが失敗する場合、コードの変更は適切ではありません。これらのテストは、システムがどのように機能するかを教育する手段として使用してください。


1
これが、私がJUnitの@Ignore注釈を好む理由です。テストを保持することはできますが、実行することはできません。次に、それらを再度有効にして、一度に1つずつ修正するだけです。これにより、数千の失敗に圧倒されるのではなく、一度に少数のテストに焦点を絞ることができます。
TMN

1
これは悪いアドバイスです。理解できないテストを削除したり無効にしたりしないでください。あなたがいる場合にのみ行うテストを理解し、あなたはそれが廃止された機能をテストする自信がある、それは無効にするか削除する必要があります。
ジャックB

2

私がする最も重要なことは、テストが何をするべきか、そしてビジネスが動き続けるために必要なものの基本に戻ることです。テストの仕事は、後で修正するのに費用がかかる前に問題を特定することです。その文のキーワードは「高価」だと思います。これらの問題にはビジネスソリューションが必要です。高価な問題が現場に現れていますか?その場合、テストは完全に失敗しています。

あなたの管理者とあなたは現実チェックに来る必要があります。テストのレガシーセットにより、開発コストが急騰していることがわかります。テストを無効にしたため、これらのコストは、不良製品を提供するコストと比較してどうですか?ユーザーが必要とする動作(テストする必要のあるもの)を実際に把握するという面倒なタスクと比較してどうでしょうか。

これらは、仕事のビジネス側に影響を与えるため、ビジネスソリューションを必要とする問題です。あなたは製品を顧客に提供していますが、それはビジネスが非常に興味を持っている境界です。彼らは開発者としてはできないソリューションを特定できるかもしれません。たとえば、2つの製品を提供するのが合理的である場合があります。1つは信頼性を必要とし、新機能を控える「レガシー」製品で、もう1つはより多くの欠点があるが先駆的な「ビジョン」製品です。これにより、2つの独立したテストセットを開発する機会が得られます。1つは4000テスト、もう1つは実行する必要があると思われるテスト(さらに、このプロセスが繰り返されないように文書化する)です。

それから、芸術が始まります:ある枝の進歩が他の枝にも役立つように、この双頭の獣をどのように管理できますか?厳格なテスト要件にもかかわらず、「visonary」ブランチへの更新を「legacy」ブランチに戻すにはどうすればよいですか。「レガシー」ブランチでの継続的な顧客の要求は、最終的に製品を再マージした場合にレガシー顧客が必要とする要件についての理解をどのように改善することができますか?


-3

古いテストを削除することはできません。テストの内容がわからなかったからです。

だからこそ、古いテストを削除する必要があります!彼らが何をしているかわからない場合、失敗は無意味であり、それらを実行することは時間の無駄です。それらを捨ててやり直してください。


2
これは、すでに作成され、トップアンサーで
-gnat

4
失敗は「意味のない」ものではありません。つまり、システムを理解できず、自分が思ったほど理解できないということです。
ベンフォークト

OPがシステムを理解していないと明確に述べているため、ここでの失敗は間違いなく無意味です。
モヘア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.