開発中に失敗すると予想されるユニット/回帰テストをどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/155911

  •  03-07-2019
  •  | 
  •  

質問

ソフトウェア開発中に、コードベースに既知の問題であるバグがある場合があります。テストが適切に記述されている場合、これらのバグにより回帰/単体テストが失敗します。

テストの失敗をどのように管理すべきかについて、チーム内で絶え間ない議論があります:

  1. 失敗したテストケースは、REVISITまたはTODOコメントでコメントアウトします。

    • 利点新しいの不具合がいつ導入されたかは常に把握しており、既に認識している不具合ではありません。
    • 短所:コメントアウトされたテストケースの再確認を忘れる場合があります。これは、欠陥が亀裂をすり抜けることができることを意味します。
  2. 失敗したテストケースのままにします。

    • 利点:欠陥を修正することを忘れないでください。スクリプトの失敗により、欠陥が存在することが常に思い出されるからです。
    • 短所:障害ノイズのために新しい欠陥が導入された場合、検出が困難です。

この点に関して、ベストプラクティスとは何かを検討したいと思います。個人的には、スクリプトが成功しているかどうかを判断するには、トライステートソリューションが最適だと思います。たとえば、スクリプトを実行すると、次のように表示されます。

  • 合格率:75%
  • 失敗率(予想):20%
  • 失敗率(予想外):5%

基本的に、(何らかの欠陥のために)失敗すると思われるテストケースをメタデータでマークします。これにより、テストの終了時に失敗結果が表示されますが、予期しない新しい失敗があるかすぐにわかります。これは、上記の2つの提案の最良の部分を占めるようです。

これを管理するためのベストプラクティスはありますか?

役に立ちましたか?

解決

テストケースはそのままにしておきます。私の経験では、次のようなコードを使用してコードをコメントアウトします

// TODO:  fix test case

実行と似ています:

// HAHA: you'll never revisit me

真剣に、出荷に近づくにつれて、コード内のTODOを再訪したいという欲求は薄れがちです。特に、コードの他の部分の修正に集中しているため、単体テストなどの場合はそうです。

おそらく「トライステート」でテストを終了します。溶液。ただし、できるだけ早くこれらのケースを修正することを強くお勧めします。定期的なリマインダーに関する私の問題は、人々がそれらを見た後、彼らはそれらにつやを出し、「ええ、私たちは常にそれらのエラーを取得します...」と言う傾向があることです

適切な場合-一部のコードでは、「スキップ可能なアサート」の概念を導入しています。 -問題があることを知らせるためにそこにあると断言しますが、テスターがそれらを過ぎて残りのコードに移動できるようにします。私たちは、QAが「ああ、そうだ、断言できる」と言って、スキップ可能だと言われたことがわかりました。バグは報告されませんでした。

私が提案しているのは、テストケースがすぐに発見したバグを修正するという別の方法があるということです。そうしない実際的な理由があるかもしれませんが、その習慣を身に付けることは、長期的にはより有益になる可能性があります。

他のヒント

バグをすぐに修正します。

すぐに実行するには複雑すぎる場合、おそらく単体テストには単位が大きすぎます。

単体テストを失い、バグデータベースに欠陥を置きます。そのようにして、可視性があり、優先順位を付けることができます。

私は通常、PerlとPerlのTest :: *モジュールを使用して、TODOブロックを挿入できます:

TODO: {
  local $TODO = "This has not been implemented yet."

  # Tests expected to fail go here
}

テスト実行の詳細な出力では、$ TODOのメッセージがTODOブロック内の各テストの合否レポートに追加され、失敗が予想される理由を説明します。テスト結果の要約については、すべてのTODOテストが成功したものとして扱われますが、実際に成功した結果を返すものがある場合、要約もそれらをカウントアップし、予想外に成功したテストの数を報告します。

したがって、私の推奨事項は、同様の機能を持つテストツールを見つけることです。 (または、テスト対象のコードが別の言語である場合でも、テストにPerlを使用します...)

次のことを行いました。テストに階層を配置します。

例:3つのことをテストする必要があります。

  • ログインをテストします(ログイン、ユーザー名の取得、「最終ログイン日」またはその他の既知のものの取得など)
  • データベース取得のテスト(指定された" schnitzelmitkartoffelsalat"-タグの検索、最新のタグの検索)
  • Webサービスのテスト(接続、バージョン番号の取得、単純なデータの取得、詳細なデータの取得、データの変更)

括弧内に記載されているように、すべてのテストポイントにはサブポイントがあります。これらを階層的に分割します。最後の例を見てください:

3. Connect to a web service
    ...
3.1. Get the version number
    ...
3.2. Data:
    3.2.1. Get the version number
    3.2.2. Retrieve simple data
    3.2.3. Retrieve detailed data
    3.2.4. Change data

ポイントが失敗した場合(開発中)正確なエラーメッセージを1つ与える。つまり3.2.2。失敗しました。その後、テストユニットは3.2.3のテストを実行しません。および3.2.4。 。このようにして、「3.2.2 failed」という1つの(正確な)エラーメッセージが表示されます。したがって、プログラマーは(最初に)その問題を解決し、3.2.3を処理しません。および3.2.4。これはうまくいかないからです。

これは、問題を明確にし、最初に何をする必要があるかを明確にするのに大いに役立ちました。

無視属性を使用して、これらを残す傾向があります(これは NUnit を使用しています)-テスト実行の出力にテストが記載されています、それは目に見える、願わくばそれを忘れないことを意味する。 「無視」に問題/チケットIDを追加することを検討してください。メッセージ。そのようにして、根底にある問題が熟していると見なされたときに解決されます-失敗したテストをすぐに修正するのは良いことですが、時が来るまで小さなバグが待たなければならないことがあります。

明示的属性を検討しました。再コンパイルせずに実行できるという利点がありますが、「理由」を取りません。引数、および実行するNUnitのバージョンでは、テストは出力にunrunとして表示されません。

「TODO」を生成するTODOウォッチャーが必要だと思います。コードベースからのコメント。 TODOはテストメタデータです 。既知の障害メッセージの前にある1行であり、非常に簡単に関連付けることができます。

TODOは良いです。それらを使用します。実際に定期的にバックログに入れることで、積極的に管理します。

#5、Joelの"コードを改善する12のステップ" はバグを修正しています新しいコードを書く前に:

  

コードを初めて実行しようとすると、コードにバグがある場合、すべてのコードがまだ新鮮であるため、すぐに修正できます。

     

数日前に書いたコードでバグを見つけた場合、それを見つけるのに時間がかかりますが、書いたコードを読み直すと、すべてを覚えて、できるようになります妥当な時間でバグを修正します。

     

しかし、数か月前に書いたコードにバグを見つけた場合、おそらくそのコードについて多くのことを忘れてしまっているでしょうし、修正するのはずっと難しいでしょう。そのときまでに、誰かのコードを修正している可能性があり、休暇中にアルバにいる可能性があります。その場合、バグの修正は科学のようなものです:ゆっくり、整然と、細心の注意を払う必要があり、どのように治療法の発見には時間がかかります。

     

そして、すでに出荷されているコードのバグを見つけた場合、それを修正するために信じられないほどの費用が発生します。

ただし、失敗したテストを本当に無視したい場合は、使用するテストフレームワークで[無視]属性またはそれに相当するものを使用します。 MbUnitのHTML出力では、失敗したテストの赤と比較して、無視されたテストは黄色で表示されます。これにより、新たに失敗したテストに簡単に気付くことができますが、既知の失敗したテストを追跡することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top