本番環境でバグが見つかった場合、意図的にビルドを中断する必要がありますか?


410

エンドユーザーが本番環境で深刻なバグを見つけた場合、そのバグをカバーするために失敗した単体テストを追加し、バグが修正されるまで意図的にビルドを壊すことは理にかなっています。これに対する私の論理的根拠は、ビルドがずっと失敗していたはずだったが、自動化されたテストカバレッジが不十分だったためではなかったということです。

私の同僚の何人かは、失敗した単体テストはチェックインすべきではないという意見に異議を唱えています。通常のTDDプラクティスの観点からはこの観点に同意しますが、生産バグは異なる方法で処理する必要があると思います。既知の欠陥で成功するビルド?

他の誰かがこのシナリオを処理するための実証済みの戦略を持っていますか?意図的にビルドを壊すことは他のチームメンバーを混乱させる可能性があることを理解していますが、それはブランチの使用方法に完全に依存します。


75
+1; 非常に挑発的な質問。両面が見えます。
カールマナスター

28
「ビルド」という用語を使用して「テスト」を含めますが、これは普遍的な理解ではありません。
ジェイバズジ

19
TDDを実行する場合、失敗したテストを記述し、コード修正してからチェックインします。したがって、ビルドの破損を回避できます。
dietbuddha

7
同じロジックで、問題を修正するまでクライアントのライブインスタンスをシャットダウンする必要があります。いいえ、ビルドを壊さないでください。バグを処理する開発者に単体テストとコードの変更を一緒に追加させます。プロセス全体をシャットダウンする必要はありません。
サノスパパタナシオ

回答:


412

私たちの戦略は次のとおりです。

失敗したテストをチェックインし@Ignore("fails because of Bug #1234")ますが、注釈を付けます。

そうすれば、テストはそこにありますが、ビルドは壊れません。

もちろん、バグdbで無視されたテストに注意するため@Ignore、テストが修正されると削除されます。これは、バグ修正の簡単なチェックとしても機能します。

失敗したテストでビルドを中断するポイントは、何らかの形でチームにプレッシャーをかけることではなく、問題を警告することです。問題が特定され、バグDBに登録されると、ビルドごとにテストを実行しても意味がありません。失敗することはわかっています。

もちろん、バグはまだ修正されているはずです。しかし、修正をスケジュールすることはビジネス上の決定であり、したがって開発者の関心事ではありません... 。


150
+1 「修正をスケジュールすることはビジネス上の決定」で頭を打つと思います-開発者としては、バグがビルドを壊すかどうかを判断するのは私の判断ではありません。
MattDavey

22
これは非常に賢明な解決策だと思います。特に、次の人がマイナーコードをチェックインすると、突然「失敗したテスト」という通知が表示され、自分がやったことだと思います。
ホルガー

14
「私にとって、バグがバグDBに登録されると、それはもはや私の問題ではありません」... +1
ジェイクバーガー

20
@anonトヨタを除く。ラインワーカーは欠陥に気付き、アンドンコードを引っ張るとプラント全体が停止し、管理が終了し、問題が修正されるまでラインは再起動されません。Google Andon Cord。それは新しい概念ではありません。参照:startuplessonslearned.com/2008/09/...
クリストファーマハン

4
@AndresJaanTack:これはもちろんあなたの方法論に依存しますが、一般的には同意しません。少なくともビジネス環境では、仕事のスケジューリングはビジネス上の決定であり、それにはバグ修正含まれます。時々、新しい機能(または特定の日付にリリース)が(マイナーな)バグを修正するよりも価値がある場合があります。その場合、バグ修正は延期する必要があります。「今すぐバグを修正する」ことは、より重要な作業を遅らせるため、そのような状況では不適切です。
-sleske

106

なぜビルドが既知の欠陥で成功するのを許可したいのですか?

時々、時間的な制約があるからです。または、バグが非常に小さいため、単体テストと修正に必要な数日間、製品の出荷を遅らせる価値はありません。

また、バグを見つけるたびに意図的にビルドを壊すことのポイントは何ですか?見つかった場合は、チーム全体に影響を与えずに修正します(または修正する担当者に割り当てます)。バグの修正を忘れないようにするには、バグ追跡システムで非常に重要としてマークする必要があります。


私はあなたの意見を見て、一般的には同意します-しかし、この場合、本番
環境に移行

3
私の答えの2番目の段落を参照してください。
アルセニムルゼンコ

8
私は理解しています、あなたの最初の段落でポイントが要約されていると思います-バグの深刻さを判断するのは開発者次第ではありません、またはそれがショーストッパーであるかどうかは、より広いビジネスの決定です。
MattDavey

4
問題は、このバグの優先順位は何ですか?OMG FIX IT NOWである可能性があります。しかし、すべてのバグがそのスペクトルの同じ場所でヒットするわけではありません。
ザカリーK

55

テストを行って、問題を(再)導入しないことを確認します。失敗したテストのリストは、バグ追跡システムに代わるものではありません。POVには、テストの失敗がバグを示すだけでなく、開発プロセスの失敗を示す(不注意から依存関係の特定の誤りまで)という妥当性があります。


20
「失敗したテストのリストはバグ追跡システムの代替ではありません」 +1、非常に良い点:)
MattDavey

1
以前のバグ修正の一部として、回帰単体テストにコードベースを入力することをお勧めします。
Yrkを含む

6
@yarek:回帰テストはいつでもコードベースに入ることができ、バグが修正されるまで無視する必要があります。私は通常、問題を診断しながら開発します。これは、デバッグの補助としても使用できるためです。
sleske

これは、CIが単に「Blame Driven Development」に移行する職場で「ビルドを壊す」ことが有害な部分になる理由の良い例です。私は、PHBが「不注意」について口論を始めた多くの会議に出席しました。このような環境では、ビルドを壊したものを意図的にチェックインすることはほとんどありません。そうしないと、PHBが混乱します。ビルドを壊し、恥の円錐を着る。なんてくだらない練習だ。
ウォーレンP

@WarrenP、時には他の問題もありますが、明確にしましょう、不注意がビルドが壊れる最初の理由です。何かがビルドを壊すことがわかっているなら、なぜそれをチェックインするのですか?
AProgrammer

23

「ビルドを中断する」とは、ビルドが正常に完了しないようにすることを意味ます。失敗したテストはそれを行いません。これは、ビルドに既知の欠陥があることを示していますが、これは正確です。

ほとんどのビルドサーバーは、テストのステータスを経時的に追跡し、追加されてから失敗したテストと回帰(異なるテストに合格し、以前は成功していなかった)に異なる分類を割り当て、また、回帰が起こった。


12
これは常に正しいとは限りません。多くの場合、チームは失敗したテストを壊れたビルドと見なします。ほとんどのアジャイルチームでは、テストの失敗は、ラインを停止する場合です。チーム全体が問題を攻撃して解決します。私はあなたの投稿を取り上げて、応答があなたの慣行に基づいていなければならないことを意味すると思います。その場合、それは完全に正確です。
ビルK

2
ビルドが失敗したことを意味するために、失敗したテストを常に考慮します。
ジョンサンダース

@JohnSaunders:しかし、それはそれが意味するものではありません。私の答えで言ったように、それは「ビルドに既知の欠陥がある」という意味です。
ベンフォークト

1
@hoはテストがなかったと言った?どこで入手できますか?バグを発見した後の私の最初のステップは、ビルドの成功を妨げることではなく、詳細なバグレポートを作成することです。バグが修正されるとき、最初に失敗する単体テストがあるはずです。
ジョンサンダース

1
失敗したテストをすぐに作成しても問題はほとんどありません。ビルド時に実行される一連のテストにチェックインしたくないだけです。また、バグを修正する開発者がそのテストを無視できるようにしたいです。私が働いたほとんどの場所で、バグレポートを作成する人々はユニットテストを作成しません。
ジョンサンダース

16

失敗したテストを追加する必要があると主張しますが、明示的に「失敗したテスト」としてではありません。

@BenVoigtが答えで指摘しているようにテストの失敗は必ずしも「ビルドを壊す」とは限りません。用語はチームごとに異なる可能性があると思いますが、コードはコンパイルされたままで、製品はテストに失敗しても出荷できます。

この状況で自問すべきことは、

テストの目的は何ですか?

誰もがコードについて気分を良くするためだけにテストが存在する場合、コードについて誰もが気分を悪くするためだけに失敗したテストを追加しても、生産的ではないようです。しかし、そもそもテストの生産性はどの程度ですか?

私の主張は、テストはビジネス要件の反映であるべきだということです。だから、「バグ」は要件が適切に満たされていないことを示しているが発見された場合、あるテストが適切または完全にビジネス要件を反映していないことを示し。

それが最初に修正されるバグです。「失敗したテストを追加する」のではありません。あなたはしている修正テストがビジネス要件をより正確に反映します。コードがそれらのテストに合格しない場合、それは良いことです。それはテストが仕事をしていることを意味します。

コードを修正する優先順位は、ビジネスによって決定されます。しかし、テストが修正されるまで、その優先順位を本当に決定できますか?ビジネスは、何が失敗しているか、どのように失敗しているか、そしてなぜ失敗しているのかを正確に把握して、優先順位を決定する必要があります。テストはこれを示す必要があります。

完全にパスしないテストを持つことは悪いことではありません。既知の問題の重要なアーティファクトを作成し、それに応じて優先順位を付けて処理します。完全にはないテスト持つテストを、しかし、問題となっています。テスト自体の価値に疑問を投げかけます。

別の言い方をすれば... ビルドは既に壊れています。あなたが決めているのは、その事実に注意を喚起するかどうかです。


1
あなたの主張は間違っています。ユニットテストは必ずしもビジネス要件に直接マップされるわけではありませんが、機能テストまたはエンドツーエンドテストはおそらくそうですが、OPはユニットテスト/ TDDについて話していました。
ジョンブキャナン

@JohnBuchanan:検証するためのテストは何ですか?(つまり、要件を満たしているということです。)述べているように、単体テスト以外にも他の形式のテストがあります。しかし、そのソフトウェアがビジネスのニーズを満たしていることを検証しない単体テストの価値を見逃しています。
デビッド

1
@JohnBuchanan-彼は「テストはビジネス要件を反映している」とは言わず、「SHOULD BE」と言った。それは本当ですが、議論の余地があります。これは必ずしもそうではないと主張するのは正しいことです。ビジネス要件に対応しない単体テストを書く人もいますが、そうするのは間違っています。デビッドの主張が間違っていると主張したいなら、あなたがそう思う理由について何か言うことができます。
ダウッドイブンカリーム

13

テスト自動化チームでは、テストの欠陥ではなく製品の欠陥が原因で失敗する限り、失敗したテストをチェックインします。そうすれば、開発チームがそれを壊したという証拠が得られます。ビルドを壊すことは非常に嫌われますが、それは完全にコンパイル可能であるが失敗するテストをチェックインすることと同じではありません。


4
@MattDaveyのアイデアは素晴らしいものだと思います。過去にそれについて議論しました。私はいつも抵抗の石の壁に出会いました-「あなたは決してビルドを壊さないでください!」。この状況でビルドが既に壊れているという考えは、人々が理解することは不可能に思えます。悲しいことに、これは良いアイデア(自動テストとクリーンビルド)が、信者がルールを知っているが理由は知らない貨物カルトの実践に発展した別のケースです。
トムアンダーソン

3
私が思いついたアイデアの1つは、QAチーム(テストを書くのに十分な技術を持っている場合)が失敗したバグのテストを作成し、チェックインすることを許可する必要があるということです。機能の追加よりもバグ修正の優先順位を付けます。これは開発を行う正しい方法です。
トムアンダーソン

ただし、これらはビルド中に実行される単体テストであってはなりません。ご使用の環境にQAのテスト管理システム(Microsoft Test Managerなど)が含まれている場合、1つ以上のテストケースを追加してバグにリンクする必要がありますが、これはビルドの成功を妨げません-単にテストになりますバグが「完了」とみなされる前に合格しなければならないケース。
ジョンサンダース

7

バグが修正されるまで失敗することがわかっているテストを作成するのは良い考えです。それがTDDの基礎です。

ビルドを壊すのは悪い考えです。どうして?なぜなら、それが修正されるまで何も進むことができないからです。基本的に、開発の他のすべての側面をブロックします。

例1
アプリケーションが大きく、コンポーネントが多数ある場合はどうなりますか?それらのコンポーネントが、独自のリリースサイクルで他のチームによって作業されている場合はどうなりますか?タフ!彼らはあなたのバグ修正を待つ必要があります!

例2
最初のバグを修正するのが難しく、優先順位の高い別のバグを見つけた場合はどうなりますか?2番目のバグのビルドも中断しますか?これで、両方が修正されるまでビルドできません。人為的な依存関係を作成しました。

テストに失敗するとビルドが停止する論理的な理由はありません。これは、開発チームが、既知のバグを含むビルドをリリースすることの長所と短所を比較検討する必要がある決定です(おそらく、経営陣との議論で)。これはソフトウェア開発では非常に一般的であり、ほとんどすべての主要なソフトウェアは少なくともいくつかの既知の問題とともにリリースされます。


5

テストが果たすべき役割と、採用されたビルドシステム/プロセスに結果がどのように影響するかによって異なります。ビルドを壊すことについての私の理解はベンのものと同じであり、同時に、既存のテストを壊すコードを意図的にチェックインするべきではありません。これらのテストが「後で」行われた場合、他の人への不必要な混乱を減らすためにそれらを無視することは「大丈夫」かもしれませんが、失敗したテストを無視するこのプラクティスを見つけます(テストが合格するように見える)単体テストの場合)、そのようなテストを赤でも緑でもないことを示す方法がない限り。


「このようなテストを赤でも緑でもないことを示す方法がない限り」記録のために:ほとんどの単体テストフレームワークは、赤、緑、無視されたテストを区別します。少なくともJUnitとTestNGは報告します(「xxテスト、x失敗、x無視」を報告します)。
sleske

理想的である@sleske、私はちょうど無視して障害が自動的に成功に変わりないことを確認したい
prusswan

黄色のビルドはありませんか?(レッド/グリーン/イエロー)ハドソン/ジェンキンス、クルーズコントロール、その他すべての大物で?
ウォーレンP

@Warren Pの人々は正しくテストを無視するとき、それは動作しますが、一部は緑のそれらを作ることにより、テストを無視
prusswan

5

もちろんバグに依存しますが、一般に、手動または自動テストで特定されなかった何かがうまくいかなかった場合、それはカバレッジにギャップがあることを意味します。私は間違いなく根本原因を突き止め、問題の上に単体テストケースを平手打ちすることをお勧めします。

メンテナンスブランチからのホットフィックスが計画されている本番の問題である場合、修正がメインラインで機能し、開発者が熱心なマージ競合解決で誤って修正を吹き飛ばすことができないことも確認する必要があります。 。

さらに、リリースポリシーに応じて、新しく更新された単体テストの存在は、開発者が単に問題を変更するのではなく、実際に問題を修正したことを確認するのに役立ちます[(問題またはテスト?)]新しい単体テストの要件を修正します。


5

ビルドに失敗することがわかっているテストを追加する際の問題の1つは、ビルドが失敗することを期待しているため、チームが失敗したテストを無視する傾向があることです。ビルドシステムに依存しますが、テストの失敗が常に「何かが壊れた」ことを意味しない場合、テストの失敗に注意を払うのは簡単です。

あなたのチームがその考え方に入るのを助けたくありません。

そのため、テスト追加する必要があるが、バグが修正されるまで、自動ビルドの目的ために「無視」としてマークすることに同意します。


1
テストソフトウェアは、何かが新しく壊れたときと、以前に失敗したテストを知らせます。
ベンフォークト

4

何らかの方法でバグをテストとして「チェックイン」する必要があると思いますが、修正したときに再び発生せず、何らかの方法でそれを優先するので、ビルド(/テスト)を壊さないことが最善だと思います。その理由は、その後ビルドを破壊するコミットが、破壊されたテストの背後に隠されるからです。したがって、このバグの壊れたテストをチェックインすることにより、チーム全体がこのバグを修正するために作業を脇に置くことを要求します。それが起こらない場合、そのように追跡可能でないコミットを壊すことになってしまうかもしれません。

したがって、保留中のテストとしてコミットし、保留中のテストを持たないようにチームで優先することをお勧めします。


4

別のオプションは、失敗したテストをソース管理システムの別のブランチにチェックインすることです。あなたの慣習に応じて、これは実行可能かどうかが異なります。些細ではないバグの修正など、進行中の作業のために新しいブランチを開くことがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.