単体テストアンチパターンカタログ


203

アンチパターン:実際のアンチパターンを単純な悪い習慣、悪い習慣、悪い考えから正式に区別するには、少なくとも2つの重要な要素が存在する必要があります。

  • 最初は有益であるように見えるが、最終的には有益な結果よりも悪い結果をもたらす、繰り返される行動パターン、プロセスまたは構造
  • 明確に文書化され、実際の実践で実証され、再現可能なリファクタリングされたソリューション。

「実際に」一度見たTDDアンチパターンに投票してください。
James Carrによるブログ投稿テスト駆動開発yahoogroupに関する関連ディスカッション

名前のないものを見つけた場合は、投稿してください。アンチパターンごとに1つの投稿をして、投票が何かにカウントされるようにしてください。

私の既得権は、トップnのサブセットを見つけることです。そうすれば、近い将来、ランチボックスのミーティングで話し合うことができます。


アーロン、あなたはこの問題をすべて解決しているようです:)スクロールを少なくするために、タグラインまたはスローガンをコメントとして追加するのは良い考えでしょうか?何と言いますか?
岐阜

1
これはかなり上手くいきます。今後もよろしくお願いします。最も有益なSO投稿の1つIMHO
Gishu

2
+1このスレッドが大好きです!!! そして、これらのほとんどはとても真実で優勢です!
Chii

素敵なスレッドですが、なぜこのコミュニティwikiなのですか?
平凡な2009

2
Cozそれは一種の世論調査です-あなたが最も一般的なタイプのアンチパターンを投稿したcozだけで担当者を収穫したくないでしょう;)
Gishu

回答:


70

セカンドクラスの市民 -テストコードは、複製されたコードを多く含む本番コードほどリファクタリングされていないため、テストを維持することが困難です。


67

フリーライド/ピギーバック-James Carr、Tim Ottinger 別の/明確な機能/機能
をテストするための新しいテストケースメソッドを記述するのではなく、新しいアサーション(およびそれに対応するアクション、つまりAAAからのActステップ)が既存のテストケースに沿って動作します。 。


15
ええ、それは私の好きなものです。私はいつもそれをします。ああ...待って...これは悪いことだとあなたは言った。:-)
ギドイズム

1
これがアンチパターンであるかどうかはわかりません。すべての不変条件はtrue、可能なすべてのミューテーター呼び出しの後でなければなりません。したがってtrue、テストするミューテーターと入力データのすべての組み合わせの後にすべての不変条件があることを確認する必要があります。ただし、重複を減らし、現在テストの失敗を引き起こしていないものも含め、すべての不変条件を確認する必要があります。したがって、それらすべてを検証関数に入れ、すべてのテストで使用します。コードが変更され、別の不変条件が追加されます。もちろん、関数にも入れます。しかし、それはフリーライダーです。checkInvariants()
Raedwald、2011年

2
@Raedwald-時間の経過とともに、テス​​ト名はテストするすべてのものと一致しなくなりました。また、テストの絡み合いによりスラッシングが発生しています。障害は、障害の正確な原因を示すものではありません。たとえば、このテストの標準的な例は、すべてのアレンジステップの不透明なスーパーセットのようなものを読み取ります>>行為>>アサートA >>アクトもう少し>>アサートB >>アクトもう少し>>アサートC.理想的には、AとCが壊れていると、2つのテストエラーが表示されます。上記のテストでは、1つしか表示されず、次にAを修正し、次の実行で、Cが壊れていることがわかります。今.. 5-6個別のテストが一緒に融合想像
Gishu

1
「テスト名は、テストするすべてのものと一致しなくなりました」テストが元々存在していたポスト条件に基づいて名前が付けられた場合のみ。メソッド名、設定状態、入力データ(メソッド引数)の組み合わせに名前を付けても問題ありません。
Raedwald、2011年

「失敗は失敗の正確な原因を指摘しない」アサーションの失敗が失敗の原因を示すことはありません。そのためには、実装の詳細を掘り下げる必要があります。回帰障害のデバッグ、いくつかのTDD作業の開発状態に関する知識。
Raedwald、2011年

64

ハッピーパス

テストは、境界や例外をテストすることなく、ハッピーパス(つまり、期待される結果)を維持します。

JUnitアンチパターン


原因:誇張された時間制約または露骨な怠惰。リファクタリングされたソリューション:誤検知を取り除くためのテストを書く時間を取ってください。後者の原因には鞭が必要です。:)
スポーク2008

59

ローカルヒーロー

実行するために記述された開発環境に固有の何かに依存するテストケース。その結果、テストは開発ボックスに合格しますが、他の場所で実行しようとすると失敗します。

隠された依存関係

ローカルヒーローと密接に関連する単体テスト。テストを実行する前に、既存のデータをどこかに入力しておく必要があります。そのデータが入力されていなかった場合、テストは失敗し、開発者には何が必要か、またはその理由はほとんど示されません。使用しているデータの出所がどこにあるかを見つけるために、何エーカーものコードを掘り下げることを強制します。


残念なことに、特定のプロダクションシステムで常に同期されていない曖昧で多様な.iniファイルに依存する古代の.dllでこれを何度も見ました。はぁ。


これは、WOMPC開発者の頭字語の良い例です。「私のPCで動作します!」(通常、テスターを背負わせると言われています。)
Joris Timmermans

58

チェーンギャング

特定の順序で実行する必要があるいくつかのテスト。つまり、1つのテストがシステムのグローバル状態(グローバル変数、データベース内のデータ)を変更し、次のテストがそれに依存します。

これはデータベーステストでよく見られます。でロールバックを実行する代わりにteardown()、テストは変更をデータベースにコミットします。別の一般的な原因は、グローバル状態への変更が、テストが失敗した場合にクリーンアップするtry / finallyブロックにラップされないことです。


これは単純に厄介です。.ブレークテストは独立した概念でなければなりません。しかし、私はそれについて複数の場所で読みました。「人気のあるTDD」はかなりめちゃくちゃだと思います
岐阜

56

嘲笑は
時には良い、と便利なことができあざけります。しかし、時々、開発者は自分自身を失い、テストされていないものをあざけるために努力することができます。この場合、単体テストには非常に多くのモック、スタブ、および/または偽物が含まれているため、テスト対象のシステムはまったくテストされていません。代わりに、モックから返されるデータがテスト対象です。

出典:James Carrの投稿。


2
これは、テスト対象のクラスの依存関係が多すぎることが原因であると思います。リファクタリングされた代替手段は、分離できるコードを抽出することです。
スポーク2008

@スポイケ; クラスの役割に本当に依存する階層化アーキテクチャーを使用している場合。一部の層は他の層よりも多くの依存関係を持つ傾向があります。
krosenvold 2008

私は最近、尊敬されるブログで、モックリポジトリから返されるモックエンティティ設定の作成を見ました。WTF?そもそも、実際のエンティティをインスタンス化するだけではどうでしょう。私自身、モック化されたインターフェースに火傷を負っただけで、私の実装がNotImplementedExceptionsをスローしていました。
トーマス・アイド2009年

40

サイレントキャッチャー -ケリー?
例外がスローされた場合にパスするテスト。実際に発生する例外が、開発者が意図したものとは異なる場合でも。
参照:シークレットキャッチャー

[Test]
[ExpectedException(typeof(Exception))]
public void ItShouldThrowDivideByZeroException()
{
   // some code that throws another exception yet passes the test
}

それはトリッキーで危険です(つまり、実行するたびに常に爆発するコードをテストしたと思い込ませます)。そのため、例外クラスとメッセージ内でユニークなものの両方について具体的に説明しようとしています。
Joshua Cheek、

34

インスペクター
100%のコードカバレッジを達成するためにカプセル化に違反するユニットテストですが、オブジェクトで何が行われているのかを十分に理解しているため、リファクタリングを試みると既存のテストが中断され、変更をユニットに反映する必要があります。テスト。


'メンバー変数を公開せずにテストするにはどうすればいいですか... 単体テストのためだけですか?'


2
原因:ホワイトボックステストへの不合理な依存。Pex on .NETのようなテストを生成するためのツールがあります。リファクタリングされたソリューション:代わりに動作をテストし、境界値を本当にチェックする必要がある場合は、自動化ツールに残りを生成させます。
スポーク2008

1
Moqが登場する前は、モックを手書きするためにモックフレームワークを放棄する必要がありました。テストを実際の実装に関連付けるのは簡単すぎて、リファクタリングを不可能に近づけました。違いはわかりませんが、Moq以外では、このような間違いをすることはほとんどありません。
Thomas Eyde 2009年

34

過剰なセットアップ -James Carr
テストを開始するためにも、大規模なセットアップが必要なテスト。場合によっては、数百行のコードを使用して、1つのテスト用に環境を準備し、いくつかのオブジェクトが関係しているため、すべてのセットアップの「ノイズ」が原因で、何がテストされているかを実際に確認することが困難になる場合があります。(Src:James Carrの投稿


通常、過度のテストセットアップは、a)構造化されていないコード、またはb)モックが不十分であることを示しています。
トファーハント2014

まあすべての状況が異なる可能性があります。カップリングが高いことが原因である可能性があります。しかし、通常は過剰仕様の場合であり、シナリオ内のすべてのコラボレーターを指定(模擬期待)します。これにより、テストが実装に結合され、脆弱になります。コラボレーターへの呼び出しがテストの付随的な詳細である場合、それはテストに含めるべきではありません。これは、テストを短くて読みやすくするのにも役立ちます。
岐阜市2014年

32

肛門プローブ

次のようなタスクを実行するためにめちゃくちゃ、違法、またはその他の不健全な方法を使用する必要があるテスト:JavaのsetAccessible(true)を使用してプライベートフィールドを読み取るか、クラスを拡張して保護されたフィールド/メソッドにアクセスするか、アクセスするために特定のパッケージにテストを配置する必要がありますグローバルフィールド/メソッドをパッケージ化します。

このパターンが見られる場合、テスト中のクラスはデータの隠蔽を使いすぎています。

これとインスペクターの違いは、テスト中のクラスが、テストする必要があるものでさえも隠そうとすることです。したがって、目標は100%のテストカバレッジを達成することではなく、何でもテストできるようにすることです。プライベートフィールドのみを持つクラス、run()引数なしのメソッド、ゲッターがまったくないクラスを考えてみてください。ルールを破ることなくこれをテストする方法はありません。


Michael Borgwardtによるコメント:これは実際にはテストのアンチパターンではなく、テストされるコードの欠陥に対処するのは実用的です。もちろん、これらの欠陥を修正することをお勧めしますが、サードパーティのライブラリの場合はそれができない場合があります。

Aaron Digulla:同意します。たぶん、このエントリはアンチパターンではなく「JUnit HOWTO」wikiに本当に適しています。コメント?


これはインスペクターと同じではありませんか?
岐阜

1
うーん..この行「テスト中のクラスは、テストする必要があるものも隠そうとします」は、クラスとテストの間の権力闘争を示しています。テストする必要がある場合..何らかの方法でパブリックに到達可能でなければなりません..クラスの動作/インターフェイスを介して..これはどういうわけかカプセル化違反の匂い
Gishu

2
npellow:Maven2にはプラグインがありますね。
アーロンディグラ2008

1
これは実際にはテストのアンチパターンではなく、テストされるコードの欠陥に対処するのが実用的です。もちろん、これらの欠陥を修正することをお勧めしますが、サードパーティのライブラリの場合はそれができない場合があります。
Michael Borgwardt、

1
IDK、それはある種の副作用がなければなりません。副作用をテストします。サードパーティのAPIのテストについて何を意味するのかわからないので、テストできる独自のコードでラップして、正しく使用されていることを確認してから、サードパーティのAPIに対してそのコードを統合テストする必要があります。サードパーティのコードを単体テストしません。
Joshua Cheek、

26

名前のないテスト -Nick Pellow

バグトラッカーの特定のバグを再現するために追加され、その作者が自身の名前を正当化しないと考えるテスト。既存の不足しているテストを拡張する代わりに、testForBUG123という新しいテストが作成されます。

2年後、そのテストが失敗した場合、テストの意図を理解するために、まずバグトラッカーでBUG-123を試してみる必要があるかもしれません。


7
仰るとおり。「TestMethod」と呼ばれるテストよりも少し役立つ
NikolaiDante 2008

8
バグトラッカーが変わらない限り、あなたは古いトラッカーとその問題識別子を失う...のでPROJECT-123もはや手段は何も....
ちー

25

スローポケ

実行速度が非常に遅い単体テスト。開発者がそれを開始するとき、彼らはトイレに行く時間、煙をつかむ時間、さらに悪いことに、一日の終わりに家に帰る前にテストを開始する時間があります。(Src:James Carrの投稿

別名、必要以上に頻繁に実行されないテスト


一部のテストは、その性質上、ゆっくり実行されます。これらを他の頻度で実行しないことを決定した場合は、少なくともCIサーバーでできるだけ頻繁に実行するようにしてください。
Chris Vest

これは明白な質問ですが、これを修正する最も一般的な方法は何ですか?
トファーハント2014

これは最初は有益だと思いますか?
Kev

1
@TopherHuntいくつかの高価な依存関係(つまり、ファイルシステム、データベース)があるため、通常、テストは遅くなります。問題は、問題が見つかるまで依存関係を分析し、依存関係を呼び出しスタックにプッシュすることです。依存関係を修正することで、生徒がユニットテストスイートを77秒から0.01秒に変更したケーススタディを作成しました。github.com
Joshua Cheek

20

バタフライ

現在の日付を含む構造のように、常に変化するデータを含む何かをテストする必要があり、結果を固定値に限定する方法はありません。醜い部分は、この値をまったく気にしないことです。値を追加せずにテストを複雑にするだけです。

その翼のバットは、世界の反対側にハリケーンを引き起こす可能性があります。-エドワード・ローレンツ、バタフライエフェクト


ここでのアンチパターンとは:このようなテストはどのようなものですか?修正はありますか?System.DateTime.Nowより単純な、またはより確定的な単体テストを行う以外に、テスト対象のコードにのような依存関係を除外するための議論の余地のある利点はありますか?
Merlyn Morgan-Graham

1
Javaでは、例としてtoString()、メソッドを上書きしないオブジェクトを呼び出します。これにより、メモリアドレスに依存するオブジェクトのIDがわかります。またはtoString()、オブジェクトの主キーが含まれており、テストを実行するたびに変更されます。これを修正するには、3つの方法があります。1。テストするコードを変更します。2。regexpを使用してテスト結果の可変部分を削除します。3。強力なツールを使用してシステムサービスを上書きし、予測可能な結果を​​返します。
アーロンディグラ2013年

このアンチパターンの根本的な原因は、テスト対象のコードがそれをテストするのにどれほどの労力が必要かを気にしていないことです。したがって、開発者の気まぐれは他の場所で問題を引き起こす蝶の羽です。
アーロンディグラ2013年

19

ちらつきテスト(出典:Romilly Cocking)

特定の時間ではなく、たまに失敗するテストで、通常はテスト内の競合状態が原因です。通常、JMSなどの非同期なものをテストするときに発生します。

おそらく、「待機して参照」アンチパターンと「スリーパー」アンチパターンのスーパーセットです。

ビルドは失敗しました。まあ、もう一度ビルドを実行してください。-匿名の開発者


@Stuart-これを説明する必見のビデオは「Car Stalled-Try Now!」です。videosift.com/video/… このパターンは、「今すぐ試す」または単に「The Flakey Test」と呼ぶこともできます
npellow

1
私はかつて適切な配布を保証するPRGNのテストを書いたことがあります。時々、それはランダムに失敗するでしょう。図を行きます。:-)
Chris Vest

1
これは良いテストではないでしょうか?テストが失敗した場合は、問題の原因を突き止める必要があります。私は9pと真夜中の間に失敗したテストについて誰かと戦った。彼はそれがランダム/断続的であると述べました。最終的には、タイムゾーンを処理するバグが原因でした。図を行きます。
トレントン

@クリスチャンベストハンセン:あなたはそれをシードできませんでしたか?
Andrew Grimm

@trenton単に無視するのではなく(ほとんどの場合、開発者は回避できるため)、追跡するのが面倒かどうかをテストするのは良いテストにすぎません。
シェパードは2013年

19

成り行きを見守る

セットアップコードを実行し、テスト中のコードが期待どおりに機能したかどうかを「確認」する前に、特定の時間「待機」する必要があるテスト。Thread.sleep()または同等のものを使用するtestMethodは、間違いなく「待機して参照」テストです。

通常、テストが、電子メール、http要求などのシステム外部のイベントを生成したり、ディスクにファイルを書き込んだりするコードをテストしている場合に、これが表示されることがあります。

このようなテストは、低速のマシンまたは過負荷のCIサーバーで実行すると失敗するため、ローカルヒーローになる可能性もあります。

Wait and SeeアンチパターンをThe Sleeperと混同しないでください。


うーん..まあ私はこのようなものを使用します。マルチスレッドコードを他にどのようにテストできますか?
岐阜

@Gishu、本当に同時に実行されている複数のスレッドを単体テストしたいですか?私はrun()メソッドが単独で行うことは何でもユニットテストしようとしています。これを行う簡単な方法は、ユニットテストのstart()ではなく、run()を呼び出すことです。
npellow 2008

@Gishuは、CountDownLatches、Semaphores、Conditionsなどを使用して、次のレベルに進むことができるときにスレッドに互いに通知します。
Chris Vest

例:madcoderspeak.blogspot.com/2008/11/…Brew button evt。オブザーバーは一定間隔でポーリングを行い、変更されたイベントを発生させています。この場合、テストが終了する前にポーリングスレッドが実行されるように遅延を追加します。
岐阜

漫画のリンクが壊れていると思います。
Andrew Grimm

17

不適切に共有されたフィクスチャ -Tim Ottinger
テストフィクスチャ内のいくつかのテストケースは、セットアップ/ティアダウンを使用しないか、必要としません。新しいテストフィクスチャを作成する開発者の慣性によるものもあります...もう1つテストケースをパイルに追加する方が簡単です。


1
また、テスト中のクラスがやりすぎている可能性もあります。
マイク2

16

巨人

ユニットテストは、テスト対象のオブジェクトを有効にテストしていますが、数千行におよび、多数のテストケースを含むことができます。これは、テスト中のシステムが神オブジェクト(ジェームズカーの投稿)であることを示している可能性があります。

これの確実な兆候は、数行を超えるコードにまたがるテストです。多くの場合、テストは非常に複雑なので、独自のバグや不安定な動作のバグが含まれ始めます。


15

私が見たとき、私はそれを信じていますいくつかの点滅のGUI
アン不健康な固定/固定観念ただ実際のユーザーのように'は、そのGUIを介してアプリケーションをテストすると

GUIを介してビジネスルールをテストすることは、恐ろしい形の結合です。GUIを介して数千のテストを記述し、その後GUIを変更すると、数千のテストが失敗します。
むしろ、GUIを介してGUIのものだけをテストし、それらのテストを実行するときに、GUIを実際のシステムではなくダミーシステムに結合します。GUIを使用しないAPIでビジネスルールをテストします。-ボブ・マーティン

「あなたは見ることは信じることであることを理解しなければなりませんが、信じることは見ることであることも知っています。」- デニスウェイトリー


1
GUIのフラッシュが間違っていると思われる場合は、GUIを起動するjUnitテストを作成し、ユーザーの操作を続行する必要がある人を見かけました。それはテストスイートの残りをぶら下げました。テストの自動化はこれで終わりです。
スポーク2008

同意しません。GUIのテストは難しいですが、エラーの原因にもなります。それらをテストしないのは単に面倒です。
レイ

3
ここでのポイントは、GUIをテストするのではなく、GUIだけを介してテストするべきではないということです。GUIなしで「ヘッドレス」テストを実行できます。GUIをできるだけ薄くします-MVPのフレーバーを使用します-その後、まったくテストしないで済むようになります。常に薄いGUIレイヤーにバグが発生していることに気付いた場合は、テストでカバーしてください。しかし、ほとんどの場合、努力する価値はありません。GUIの「配線」エラーは通常、修正が簡単です...
Gishu

@Spoike:ガイド付き手動テストは悪くありませんし、jUnit(または他のユニットテストフレームワーク)を使用してユニットテストではない自動テストを実行することもありません。それらを同じプロジェクトに入れたり、単体テストのように処理したりしないでください(たとえば、常に実行したり、すべてのビルドの後に実行したりしないでください)。
Merlyn Morgan-Graham

1
@ MerlynMorgan-Graham同意します。GUIをテストするべきではないという意味ではありません。ガイド付き手動テストと自動テストを混在させることは問題ないというチームメンバーの確信は、私を不安にさせました。後で気づきましたが、TDDに慣れていないすべての人が使用をやめるのに最適な方法でした。TDDプロセスを実行する場合、機能テスト(揮発性)と単体テスト(安定しているはず)を混在させるのは好ましくありません。
スポーク、2013年

14

スリーパー、別名ベスビオ山 -Nick Pellow

将来の特定の日時にFAILになる予定のテスト。これは多くの場合、DateオブジェクトまたはCalendarオブジェクトを使用するコードをテストする際の不正な境界チェックが原因で発生します。場合によっては、真夜中などの特定の時刻に実行すると、テストが失敗することがあります。

「スリーパー」を「待機して参照」アンチパターンと混同しないでください

そのコードは2000年よりずっと前に置き換えられます -1960年の多くの開発者


私はむしろこれを休眠中の火山と呼びたいです:)。しかし、私はあなたが何を話しているかを知っています...たとえば、執筆時にテストの将来の日付として選択された日付は、その日付の現在/過去の日付になります行く..テストを破る これを説明するために、例を投稿してください。
岐阜

@ギシュ-+1。私は同じことを考えていましたが、2つの間で決めることができませんでした。これを少し明確にするために、タイトルを更新しました;)
npellow

11

死んだ木

スタブが作成されたが、実際にはテストが記述されていないテスト。

私は実際にこれを製品コードで見ました:

class TD_SomeClass {
  public void testAdd() {
    assertEquals(1+1, 2);
  }
}

私はそれについてどう考えるべきかさえ知りません。


8
:)-プロセスコンプライアンスバックドアとしても知られています。
岐阜

1
最近、この例が繰り返しリファクタリングされたテストとテスト対象メソッドにありました。数回繰り返した後、テストはテスト対象メソッドの呼び出しになりました。メソッドがvoidを返すようになったため、アサートするアサーションはありませんでした。つまり、基本的に、テストはメソッドが例外をスローしないことを確認するだけでした。それが実際に役立つか正しく動作するかどうかは関係ありませんでした。コードレビューでそれを見つけて、「それで...ここで何をテストしているのですか?」
Marvo、2015

11

今日これで少し得た:

ウェットフロア
テストはどこかに保持されるデータを作成しますが、テストは終了時にクリーンアップしません。これにより、後続のテスト実行でテスト(同じテスト、または場合によっては他のテスト)が失敗します。

私たちの場合、テストでは、最初にテストを実行したユーザーからのアクセス許可を使用して、「temp」ディレクトリにファイルが残っています。別のユーザーが同じマシンでテストしようとしたとき:ブーム。James Carrのサイトのコメントで、Joakim Ohlroggeはこれを「ずさんな労働者」と呼び、「寛大な残り物」のインスピレーションの一部でした。自分の名前の方が好きです(侮辱的でなく、より親しみやすい)。


junitのtemporary-folder-ruleを使用して、床が濡れないようにすることができます。
DaveFar 2011

この種は、継続的インテグレーションのアンチパターンに関連しています。CIでは、すべての開発者が自分の作業スペースとリソースを持っている必要があり、ビルドマシンも独自の環境である必要があります。その後、パーミッションの問題のようなものを避ける(または多分あなたは、彼らが唯一の生産に上げるようにそれらを隠してしまう。)
Marvo

11

カッコウ -フランクカーバー
テストケースに他の何人かと一緒に座って、テストケースの他のテストと同じ(長くなる可能性がある)セットアッププロセスを享受しますが、セットアップからのアーティファクトの一部またはすべてを破棄します独自のものを作成します。
の高度な症状:不適切に共有されたフィクスチャ


10

シークレットキャッチャー -フランクカーバー
アサーションがないため、一見するとテストを行っていないように見えるテスト。しかし、「悪魔は詳細にあります」..テストは実際には例外がスローされることに依存しており、テストフレームワークが例外をキャプチャしてユーザーに失敗として報告することを期待しています。

[Test]
public void ShouldNotThrow()
{
   DoSomethingThatShouldNotThrowAnException();
}

2
私の意見では、これは実際には有効なテストになる可能性があります-特に回帰テストとして。
IljaPreuß

もう一度申し訳ありませんが、サイレントキャッチャーと混同してしまいました...単体テストでは、「これは機能するはずです」と言うのではなく、何をテストするかについて明確に意図を述べる必要があります。国)
岐阜

1
この種類のテストでは、少なくとも例外をキャッチして変数に割り当てています。次に、nullではないと断言します。
トーマス・アイド2009年

4
一部のフレームワークには、Assert.DoesNotThrow(SomeDelegateType act)このような場合に特に使用できるスタイルアサーションがあります。これは、コンストラクターがnull以外の値を返したときに成功し、コンストラクターがスローしたときに失敗するテストケースよりも総計が少ないことがわかります。コンストラクターがnullを返すことはありません。(注:コンストラクターがnull以外の値を返すことが保証されている言語にのみ適用されます)
Merlyn Morgan-Graham

10

環境破壊者

さまざまな「要件」について、環境変数/ポートを使用および設定する「ユニット」テストがその環境に流出し始めます。これらのテストのうち2つを同時に実行すると、「利用できないポート」の例外などが発生します。

これらのテストは断続的に行われ、開発者は「もう一度実行する」などと言ってしまいます。

私が見た1つの解決策は、使用するポート番号をランダムに選択することです。これは競合の可能性を減らしますが、明らかに問題を解決しません。したがって、可能であれば、コードをモックして、共有できないリソースを実際に割り当てないようにしてください。


@gcrain ..テストは確定的でなければなりません。IMOより良いアプローチが...それは常に利用可能だということを正確なテストの前と後にテストし、クリーンアップのための「よく知られたイン・チームのポートを使用することです
Gishu

1
@gishu-問題は、これらのポートの使用を処理するsetup()およびteardown()メソッドがないことではありません。問題は、たとえば、CIサーバーを実行していて、テストの複数のバージョンが同時に実行され、同じハードコードされたテスト中のポート番号を使用しようとしている
gcrain

10

チューリングテスト

非常に巧妙なデータフロー分析を使用して、テスト対象のクラスから多数のアサートを収集する高価なツールによって自動的に生成されたテストケース。開発者をコードが十分にテストされているという誤った自信に陥らせ、高品質のテストを設計および維持する責任から解放します。マシンがあなたのためにテストを書くことができるなら、なぜそれがその指を引き出してアプリ自体を書くことができないのですか?

バカこんにちは。-世界で最もスマートなコンピューターから新しい弟子(古いAmigaコミックまで)。


10

40フィートポールテスト

テストしようとしているクラスに近づきすぎることを恐れて、これらのテストは、数え切れないほどの抽象化レイヤーとチェックしているロジックからの数千行のコードによって隔てられた距離で動作します。そのため、それらは非常に壊れやすく、興味のあるクラスとの間の壮大な旅で発生するあらゆる種類の副作用の影響を受けます。


9

ドッペルゲンガー

何かをテストするには、テスト中のコードの一部を同じ名前とパッケージの新しいクラスにコピーする必要があり、クラスパスマジックまたはカスタムクラスローダーを使用して、最初に表示されることを確認する必要があります(そのため、コピーが選択されます)アップ)。

このパターンは、テストからは制御できない、異常な量の隠れた依存関係を示しています。

私は彼の顔を見た…私の顔!鏡のようでしたが、血が凍りました。


7

母編 -フランクカーバー
実際のテストケースが必要とするよりもはるかに多くを行う一般的な設定。たとえば、テストが何かの存在または不在についてのみアサートするときに、明らかに重要で一意の値が入力されたあらゆる種類の複雑なデータ構造を作成します。
高度な症状:不適切に共有されたフィクスチャ

私はそれが何をするのかわからない...念のためにとにかくそれを追加しています。-匿名の開発者


7

すべてをテストする

これが今まで言及されていなかったとは信じられませんが、テストは単一責任の原則を破るべきではありません。

私はこれに何度も遭遇しました。このルールに違反するテストは、定義上、維持するのが悪夢です。


6

ラインヒッター

一見すると、テストはすべてをカバーし、コードカバレッジツールはそれを100%で確認しますが、実際のテストでは、出力分析なしでコードのみをヒットします。

カバレッジ対到達可能コード

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