単体テストをどのように単体テストしますか?[閉まっている]


89

私はMVCStoreFrontアプリでRob ConnerysのWebキャストを見ていて、彼が次のような日常的なものでさえもユニットテストしていることに気付きました。

public Decimal DiscountPrice
{
   get
   {
       return this.Price - this.Discount;
   }
}

次のようなテストがあります:

[TestMethod]
public void Test_DiscountPrice
{
    Product p = new Product();
    p.Price = 100;
    p.Discount = 20;
    Assert.IsEqual(p.DiscountPrice,80);
}

私はすべてユニットテストを担当していますが、この形式のテストの最初の開発が実際に有益であるかどうか疑問に思うことがあります。たとえば、実際のプロセスでは、コード(ビジネスリクエスト、要件ドキュメント、アーキテクチャドキュメント)の上に3〜4層あります。 、実際に定義されたビジネスルール(割引価格は価格-割引)が誤って定義されている可能性があります。

それが状況である場合、単体テストは何の意味もありません。

さらに、ユニットテストは別の障害点です。

[TestMethod]
public void Test_DiscountPrice
{
    Product p = new Product();
    p.Price = 100;
    p.Discount = 20;
    Assert.IsEqual(p.DiscountPrice,90);
}

現在、テストには不備があります。明らかに、単純なテストでは大したことではありませんが、複雑なビジネスルールをテストしていたとしましょう。ここで何を得るのですか?

メンテナンス開発者がメンテナンスしているアプリケーションのライフに2年早送りします。これで、ビジネスはルールを変更し、テストは再び失敗し、一部の新人開発者がテストを誤って修正しました。ここで、別の障害点があります。

私が目にするのは、失敗の可能性がより高い点であり、実際の有益なリターンはありません。割引価格が間違っている場合でも、テストチームは問題を見つけます。ユニットテストはどのように作業を節約しましたか?

ここで何が欠けていますか?今のところ、TDDが役に立ったとは思っていませんが、TDDが大好きになるよう教えてください。私もプログレッシブでいたいので欲しいですが、それは私には意味がありません。

編集:カップルは、テストが仕様の実施に役立つと述べ続けています。多くの場合、仕様も間違っているというのが私の経験ですが、仕様を書くべきではない人々によって仕様が書かれている組織で働くのは運命にあるのかもしれません。


5
多くの場合、単体テスト仕様であり、ドキュメントでもあります。
スティーブンA.ロウ

32
...そしてユニットテストのユニットテストのユニットテスト...しかし、ユニット^ 4テストとユニット^ 5テストはどうですか... aaaaaaaaahhhhhhhhh!
dacracot

14
どんな種類のテストでも、間違った仕様からあなたを救うことはありません。
トカゲに請求する

4
他の誰かが片手をたたくように聞こえる音だけを聞いたのですか?
gnovice

9
適切な引用は「それはカメがずっと下にいるだけだ」だと思います。
クインテイラー

回答:


63

まず、テストはセキュリティのようなものです。確実に100%確実に入手できるわけではありませんが、各レイヤーにより、残っている問題をより簡単に修正するための自信とフレームワークが追加されます。

次に、テストをサブルーチンに分割して、それ自体をテストすることができます。20の同様のテストがある場合、(テスト済み)サブルーチンを作成するということは、メインテストがサブルーチンの20の単純な呼び出しであることを意味します。

第三に、TDDがこの懸念に対処していると主張する人もいます。つまり、20個のテストを作成してテストに合格したとしても、実際に何かをテストしているという確信はありません。しかし、最初に作成した各テストが失敗し、その後修正した場合は、実際にコードをテストしていることをはるかに確信できます。私がこのやり取りを行うには、必要以上に時間がかかりますが、それはあなたの懸念に対処しようとするプロセスです。


2
悪魔の擁護者を演じるために、私は追加のレイヤーを失敗の可能性のあるより多くのポイントと見なしますが、それは私にとって自信を高めません。私の実際の仕事では、高度に分散したSOAエンタープライズを介して多くのチームと協力しています。これらの各チームは、レイヤーに障害が発生するとプロジェクトを危険にさらす可能性があります。
FlySwat、2008年

2
そのため、モックオブジェクトを使用して各レイヤーを個別にテストしています。
Toon Krijthe、2008年

10
すばらしいので、私のテストはIMockedComplexObjectを使用してパスしますが、実際にComplexObjectを実際に使用すると失敗します...何も得られませんでした。
FlySwat 2008年

16
@Jonathan-いいえ、あなたはあなたのコードが機能するという自信を得ました-ComplexObjectのインターフェースに向けて開発し、そのインターフェースに対して適切にテストしたと仮定します。最悪の場合、ComplexObjectの理解が予期したものではなかったという知識を得ました。
tvanfosson 2008年

9
@FlySwat:IMockedComplexObjectに関するコメントへの回答として、別の回答に対するCwashのコメントを引用します。
ブライアン、

39

テストが間違っていても、本番用コードが壊れることはほとんどありません。少なくとも、テストをまったく行わないよりは悪いことではありません。したがって、これは「障害点」ではありません。製品が実際に機能するために、テストが正しい必要はありません。正常に機能するようにサインオフする前に修正する必要があるかもしれませんが、壊れたテストを修正するプロセスは実装コードを危険にさらしません。

テストは、このような些細なテストでさえ、コードが実行することになっているセカンドオピニオンであると考えることができます。1つの意見はテストで、もう1つの意見は実装です。彼らが同意しない場合、あなたはあなたが問題を抱えていることを知っており、あなたはより近くを見る。

また、将来誰かが同じインターフェイスを最初から実装したい場合にも役立ちます。彼らは割引が何を意味するかを知るために最初の実装を読む必要はありません、そしてテストはあなたが持つかもしれないインターフェースの書かれた記述への明白なバックアップとして機能します。

そうは言っても、あなたは時間をトレードオフしています。これらの簡単なテストをスキップして節約した時間を使用して作成している可能性のある他のテストがある場合、おそらくそれらはより価値があります。実際のところ、テストの設定とアプリケーションの性質によって異なります。アプリにとって割引が重要である場合は、とにかく機能テストでこのメソッドのバグをキャッチします。すべてのユニットテストは、あなたがあなたの代わりにアプリが一緒に統合され、エラーの場所がされるまで待つので、エラーの場所がすぐに明らかになり、このユニットを、テストしている時点でそれらをキャッチさせているんかもしれませんあまり明白で。

ちなみに、個人的には、テストケースの価格として100を使用することはありません(または、そうした場合、別の価格で別のテストを追加します)。その理由は、将来の誰かが割引がパーセントであることになっていると思われるかもしれないからです。このような簡単なテストの目的の1つは、仕様の読み取りの誤りを確実に修正することです。

【編集に関して】仕様の誤りは間違いの一つです。アプリが何をすべきかわからない場合は、それができない可能性があります。しかし、仕様を反映するテストを書くことはこの問題を拡大するのではなく、単にそれを解決することに失敗するだけです。つまり、新しい障害点を追加するのではなく、ワッフルのドキュメントではなく、既存の障害をコードで表すだけです。]


4
間違ったテストは、壊れたコードを公開します。失敗が導入されたものです。それは誤った自信を与えます。
FlySwat、2008年

9
それは事実ですが、テストがないとコードが壊れてしまうこともあります。間違いは、コードが単体テストに合格した場合、それは正しいはずだと考えていることです。私は、キャリアのかなり早い段階でそれを治しました。そのため、壊れた単体テストは壊れたコードを実際に公開するのではなく、統合テストに出すだけです。
スティーブジェソップ

7
また、実装とは異なる誤りが含まれている限り、間違ったテストでも壊れたコードをキャッチできます。これは、テストが必ずしも正確である必要はないという私のポイントです。テストは、関心領域に注意を引くためにあります。
スティーブジェソップ

2
非常に興味深い答え。
ピーター

22

私が目にするのは、失敗の可能性がより高い点であり、実際の有益なリターンはありません。割引価格が間違っている場合でも、テストチームは問題を見つけます。ユニットテストはどのように作業を節約しましたか?

ユニットテストは実際には作業を節約するためのものではなく、バグを見つけて防ぐのに役立つはずです。それはより多くの仕事ですが、それは正しい種類の仕事です。最小レベルの粒度でコードを検討し、特定の入力のセットに対して、予想される条件下でコードが機能することを証明するテストケースを記述しています。変数を分離するので、バグが発生したときに適切な場所を調べることで時間を節約できます。これは、一連のテストを保存しているため、将来変更を加える必要があるときに何度でも使用できます。

私は個人的に、TDDを含めて、ほとんどの方法論が貨物カルトソフトウェアエンジニアリングから取り除かれる多くのステップではないと思いますが、ユニットテストのメリットを享受するために厳密なTDDを守る必要はありません。良い部品を保管し、ほとんどメリットのない部品を捨てます。

最後に、あなたの定型的な質問「ユニットテストをどのようにユニットテストするのですか?」に対する答えは、あなたがそうする必要がないということです。各ユニットテストは頭の痛いほどシンプルでなければなりません。特定の入力を使用してメソッドを呼び出し、予想される出力と比較します。メソッドの仕様が変更された場合、そのメソッドのユニットテストの一部も変更する必要があると予想できます。これが、非常に細かいレベルでユニットテストを行う理由の1つであるため、変更する必要があるのは一部のユニットテストだけです。要件の1つの変更に対して多くの異なるメソッドのテストが変更されていることがわかった場合は、十分に細かいレベルでテストしていない可能性があります。


「特定の入力を使用してメソッドを呼び出し、その期待される出力と比較します。」しかし、出力がXMLドキュメントのような複雑なタイプである場合はどうでしょうか。「==」だけではなく、特定のコード比較を作成する必要があるため、比較メソッドにバグがある可能性がありますか?
アンディ

@andy:比較メソッドを個別にテストする必要があります。十分にテストしたら、他のテストでの動作に依存できます。
トカゲに請求

クール、ビルに感謝します。私は新しい場所で働き始めました、そしてユニットテストで初めてです。....私はそれについてわからだけでないんだけど...私は原則的に、それがうまくいくと思うし、我々はそれが本当に便利ですクルーズコントロールを使用しているが、テストの大規模なセットは、レガシーコードと同じ運命をたどるように見える
アンディ

11

ユニットテストは、ユニット(メソッド)が期待どおりに動作するようにするためのものです。テストを最初に書くと、コードを書く前に、何を期待するかを考えるように強制されます。行う前に考えることは常に良い考えです。

単体テストはビジネスルールを反映する必要があります。確かに、コードにエラーがある可能性がありますが、テストを最初に作成すると、コードを作成する前に、ビジネスルールの観点からテストを作成できます。後でテストを作成すると、コードどのようにそれを実装しているのわかっているため、意図が正しいことではなく、実装が正しいことを確認するためだけに誘惑されるため、記述したエラーが発生する可能性が高くなります。

また、単体テストは、作成する必要があるテストの1つの形式に過ぎません。統合テストと受け入れテストも作成する必要があります。後者は、可能であれば、システムが期待どおりに動作することを確認するために、お客様が作成する必要があります。このテスト中にエラーが見つかった場合は、戻ってユニットテスト(失敗したもの)を記述して機能の変更をテストし、機能が正しく機能することを確認してから、コードを変更してテストに合格します。これで、バグ修正を取り込む回帰テストができました。

[編集]

TDDを実行するときに見つけたもう1つのこと。それはデフォルトでほとんど良いデザインを強制します。これは、高度に結合された設計を単体で単体テストすることがほぼ不可能であるためです。TDDを使用して、インターフェース、制御の反転、および依存性注入(設計を改善し、結合を減らすすべてのパターン)を使用することは、テスト可能なコードにとって本当に重要であることを理解するのにそれほど時間がかかりません。


おそらく、これが私の問題です。結果を視覚化するよりも簡単にビジネスルールのアルゴリズムを視覚化できるので、コード自体を実装するのに問題はありませんが、ルールをモックするのは冗長です。たぶんそれが私の考えです。
FlySwat、2008年

それはまさにユニットテストで行うことです。そのアルゴリズムを細かく分割し、各部分をチェックします。通常、ユニットテストで期待値をすでに記述しているため、コードがそれ自体を書き込むことがわかります。
tvanfosson 2008年

モックは、テストスペースでは過負荷の用語です。テストしようとしているものをモックしない、テストしようとしていないものをモックする...ビジネスルールのテストを書くとき、それを呼び出すコードを作成します-それはまったくモックしていません。
cwash 2009年

@cwash-あなたのコメントが私の答えにどのように当てはまるかわかりません。私はあざけることに言及しませんでした...そして私はあなたの観察に同意します。
tvanfosson 2009年

@tvanfosson-私の最後のコメントは、@ FlySwatへの応答でした...「ルールを冗長としてモックする」。指定を忘れてしまい申し訳ありません。
cwash

10

テストをどのようにテストしますか? 突然変異テストは、私が個人的に驚くほど良い効果を得るために使用した貴重な手法です。詳細についてはリンクされた記事を読んで、さらに多くの学術的参考文献へのリンクを読んでください。ただし、一般に、ソースコードを変更して(たとえば、「x + = 1」を「x-= 1」に変更して)「テストをテスト」し、次にテストを再実行し、少なくとも1つのテストが失敗するようにします。テストの失敗を引き起こさない変異は、後で調査するためにフラグが付けられます。

包括的に見える一連のテストで100%のラインとブランチのカバレッジを実現できることに驚かれるでしょうが、テストの文句なしにソースのラインを根本的に変更したりコメントアウトすることさえできます。多くの場合、これはすべての境界ケースをカバーする適切な入力でテストしないことに帰着し、時にはそれはより微妙ですが、すべてのケースでどれだけ多くのことが出てきたのかに感銘を受けました。


1
まだ聞いていなかった興味深いコンセプト+1
Wim Coenen

9

テスト駆動開発(TDD)を適用する場合、まず失敗したテストから始めます。不必要に思えるかもしれませんが、このステップは実際にユニットテストが何かをテストしていることを確認するためにここにあります。実際、テストが決して失敗しない場合、それは価値をもたらさず、さらに悪いことに、何も証明していない肯定的な結果に依存するため、誤った信頼につながります。

このプロセスに厳密に従うと、すべての「ユニット」は、最も日常的なものであっても、ユニットテストが行​​うセーフティネットによって保護されます。

Assert.IsEqual(p.DiscountPrice,90);

テストがその方向に進展する理由はありません-または私はあなたの推論で何かを見逃しています。価格が100で割引20の場合、割引価格は80です。これは不変条件のようなものです。

ソフトウェアが別の種類の割引をサポートする必要があると想像してください。購入量によっては、おそらくProduct :: DiscountPrice()メソッドがより複雑になる可能性があります。そして、これらの変更を導入すると、当初の単純な割引ルールに違反する可能性があります。次に、すぐに回帰を検出するこのテストの値が表示されます。


赤-緑-リファクタリング-これはTDDプロセスの本質を思い出すためのものです。

は、テストが失敗したときのJUnitの赤いバーを指します。

は、すべてのテストに合格したときのJUnitプログレスバーの色です。

緑の状態でリファクタリング:重複を削除して読みやすくします。


「コードの上の3〜4層」に関するあなたのポイントに取り組むために、これは、開発プロセスがアジャイルであるときではなく、従来の(ウォーターフォールのような)プロセスに当てはまります。そして、アジャイルはTDDが生まれる世界です。TDDはeXtremeプログラミングの基礎です。

アジャイルは、壁に投げかけられた要件ドキュメントではなく、直接的なコミュニケーションについてです。


8

私はすべてユニットテストに熱心ですが、この形式のテストの最初の開発が本当に有益かどうか疑問に思うことがあります...

このような小さくてささいなテストは、コードベースの「炭鉱のカナリア」になり、手遅れになる前に危険を警告することができます。簡単なテストは、正しい相互作用を実現するのに役立つため、このテストを続けるのに役立ちます。

たとえば、慣れていないAPIの使用方法を調べるために用意された簡単なテストについて考えてみます。そのテストが、APIを「実際に」使用するコードで行っていることに関連がある場合は、そのテストを維持することは有用です。APIが新しいバージョンをリリースし、アップグレードする必要がある場合。これで、回帰をキャッチするために使用できる実行可能形式で記録されたAPIの動作をどのように期待するかについての仮定ができました。

... [実際のプロセス]では、コード(ビジネスリクエスト、要件ドキュメント、アーキテクチャドキュメント)の上に3〜4層あり、実際に定義されたビジネスルール(割引価格は価格-割引)が誤って定義されている可能性があります。それが状況である場合、単体テストは何の意味もありません。

テストを書かずに何年もコーディングを続けてきた場合、何かの価値があることはすぐにはわかりません。しかし、作業の最善の方法は、「早くリリースする、頻繁にリリースする」、または「アジャイル」であり、迅速/継続的に展開する機能が必要であるという考え方の場合、テストは間違いなく何かを意味します。これを行う唯一の方法は、テストでコードに加えたすべての変更を正当化することです。テストがどれほど小さくても、グリーンなテストスイートが用意できたら、理論的には問題なく展開できます。「継続的生産」および「永久ベータ」も参照してください。

また、この考え方を身に付けるために「最初にテスト」する必要はありませんが、それは一般的にそこに到達するための最も効率的な方法です。TDDを行うときは、2〜3分の小さなRed Green Refactorサイクルに身を固めます。どの時点でも、立ち止まって離れることができず、デバッグを完了して元に戻すのに1時間かかる完全な混乱が手にあります。

さらに、ユニットテストはもう1つの障害ポイントです...

成功したテストは、システムの障害を示すものです。失敗したテストは、テストのロジックまたはシステムのロジックのエラーを警告します。テストの目的は、コードを壊すか、1つのシナリオが機能することを証明することです。

コードのにテスト記述している場合、テストが実際に機能していることを確認するには、テストが機能していないことを確認する必要があるため、「悪い」テストを作成するリスクがあります。コードの後に​​テストを記述している場合、これは「トラップを起動」し、コードにバグを導入してテストが失敗することを確認する必要があることを意味します。ほとんどの開発者はこれに不安を感じるだけでなく、時間の無駄だと主張します。

ここで何を得るのですか?

この方法で物事を行うことには確かにメリットがあります。Michael Feathersは、「レガシーコード」を「テストされていないコード」と定義しています。このアプローチをとると、コードベースに加えるすべての変更を正当化します。テストを使用しない場合よりも厳格ですが、大規模なコードベースを維持することになると、それだけで採算が取れます。

フェザーと言えば、これに関してチェックすべき2つの優れたリソースがあります。

これらはどちらも、「グリーンフィールド」ではないプロジェクトにこれらのタイプの実践と規律を働かせる方法を説明しています。これらは、密結合コンポーネント、ハードワイヤード依存関係、および必ずしも制御する必要のないものに関するテストを作成するための手法を提供します。それはすべて「継ぎ目」を見つけ、それらをテストすることです。

[I]割引価格が間違っている場合でも、テストチームは問題を見つけますが、単体テストはどのように作業を節約しましたか?

このような習慣は投資のようなものです。返品は即時ではありません。彼らは時間の経過とともに蓄積します。テストを行わない代わりに、本質的には、リグレッションをキャッチできない、統合エラーを恐れずにコードを導入できない、または設計上の意思決定を推進できないという責任を負うことになります。美しさは、コードベースに導入されたすべての変更を正当化することです。

ここで何が欠けていますか?今のところ、TDDが便利だと受け入れられないので、TDDを愛するように教えてください。私も進歩したいので欲しいですが、それは私には意味がありません。

私はそれを職業上の責任と見なしています。努力するのが理想です。しかし、それを追跡するのは非常に難しく、退屈です。それを気にし、テストされていないコードを生成するべきではないと感じた場合は、適切なテストの習慣を学ぶ意欲を見つけることができます。私が現在多くのことを行っていることの1つは(他の人と同様に)、自分で1時間のタイムボックスを設定して、テストをまったく行わずにコードを記述し、それを破棄する規律を持っていることです。これは無駄に見えるかもしれませんが、実際にはそうではありません。それはその運動が会社の物理的な材料にコストをかけるようなものではありません。これは、問題を理解するのに役立ち、より高品質でテスト可能なコードを作成する方法を理解するのに役立ちました。

私のアドバイスは、最終的には、あなたが本当にそれを上手にしたいという欲求がない場合は、まったくそれをしないことです。維持されていない、パフォーマンスが悪いなどの貧弱なテストは、テストがないことよりも悪い場合があります。自分で学ぶのは難しいですし、たぶんそれを気に入るはずはありませんが、それをやりたいという願望がないか、十分な価値を見いだせないなら、学ぶのはほぼ不可能です。時間の投資を保証します。

数人の人々は、テストが仕様の実施に役立つと述べ続けています。スペックも間違っているというのが私の経験です。

開発者のキーボードは、ゴムが道に出会うところです。仕様が間違っていて、フラグを立てていない場合は、非難される可能性が非常に高くなります。または、少なくともあなたのコードはそうします。テストに関係する規律と厳格さは、遵守するのが困難です。それはまったく簡単ではありません。それには練習、多くの学習、そして多くの間違いが必要です。しかし、結局それは報われます。ペースの速い、急速に変化するプロジェクトでは、スローダウンしても、夜に眠れる唯一の方法です。

ここで考えるもう1つのことは、テストと基本的に同じ手法が過去に機能することが証明されていることです。「クリーンルーム」と「契約による設計」はどちらも同じタイプの「メタ」コード構成を生成する傾向があります。テストを行い、さまざまなポイントでそれらを実施します。これらの手法はどれも特効薬ではなく、厳密に言えば、市場投入までの時間の面で提供できる機能の範囲で最終的にコストがかかります。しかし、それはそれについてではありません。それはあなたが提供するものを維持できるようにすることです。そして、それはほとんどのプロジェクトにとって非常に重要です。


7

単体テストは、二重記入帳管理と非常によく似ています。同じこと(ビジネスルール)を2つのまったく異なる方法で記述します(プロダクションコードのプログラムされたルールとして、およびテストの単純で代表的な例として)。両方で同じミスをする可能性は非常に低いので、両者が一致する場合は、間違いを犯す可能性はほとんどありません。

テストはどのように努力する価値がありますか?私の経験では、少なくとも4つの方法で、少なくともテスト駆動開発を行う場合には、

  • これは、十分に分離された設計を思い付くのに役立ちます。単体テストが可能なのは、十分に分離されたコードのみです。
  • いつ完了したかを判断するのに役立ちます。テストで必要な動作を指定する必要があることで、実際には必要のない機能を構築せず、機能がいつ完了するかを判断できます。
  • これにより、リファクタリングのセーフティネットが提供され、コードが変更に対してより柔軟になります。そして
  • デバッグ時間を大幅に節約できますが、これは恐ろしくコストがかかります(伝統的に、開発者はデバッグ時間の最大80%を費やしていると聞いています)。

5

ほとんどの単体テスト、テストの前提。この場合、割引価格は、価格から割引を差し引いたものにする必要があります。あなたの仮定が間違っているなら、私はあなたのコードも間違っているに違いない。そして、あなたが愚かな間違いをすると、テストは失敗し、あなたはそれを修正します。

ルールが変更された場合、テストは失敗し、それは良いことです。したがって、この場合もテストを変更する必要があります。

一般的なルールとして、テストがすぐに失敗する場合(そして、最初のテストデザインを使用しない場合)は、テストまたはコードのいずれかが間違っています(悪い日がある場合は両方)。問題のあるコードを修正してテストを再実行するには、常識(および仕様の可能性)を使用します。

ジェイソンが言ったように、テストはセキュリティです。そして、はい、テストに欠陥があるために、追加の作業が発生する場合があります。しかし、ほとんどの場合、彼らは非常に時間を節約しています。(そして、あなたはテストを破る男を罰する絶好の機会があります(私たちはラバーチキンを話している))。


4

できることはすべてテストしてください。メートルをフィートに変換し忘れるなどの些細な間違いでも、非常にコストのかかる副作用が発生する可能性があります。テストを書いて、それがチェックするコードを書いて、合格し、次に進みましょう。誰かが将来のある時点で知っている場合、誰かが割引コードを変更する可能性があります。テストで問題を検出できます。


それは私の考えのいずれにも対処していません。TDDの基本的な考え方を理解しています...メリットはわかりません。
FlySwat 2008年

4

単体テストと製品コードは共生関係にあると思います。簡単に言うと、一方が他方をテストします。そしてどちらも開発者をテストします。


3

欠陥が開発サイクルを通じて存続するにつれて、欠陥を修正するコストが(指数関数的に)増加することに注意してください。はい、テストチームが欠陥を検出する可能性がありますが、単体テストが失敗した場合よりも、通常、その時点から欠陥を特定して修正するために多くの作業が必要になります。実行する単体テストはありません。

これは通常、些細な例よりも簡単にわかります...そして、些細な例では、まあ、どういうわけか単体テストを台無しにすると、それをレビューする人はテストのエラーまたはコードのエラーをキャッチします。両方とも。(それらは見直されていますよね?)tvanfossonが指摘するように、単体テストはSQA計画の一部にすぎません。

ある意味で、単体テストは保険です。それらはすべての欠陥をキャッチすることを保証するものではありません。また、それらに多くのリソースを費やしているように見えるかもしれませんが、修正できる欠陥をキャッチすると、はるかに少なく費やします。テストがまったくなく、すべての欠陥を下流で修正しなければならなかった場合よりも。


3

あなたの意見はわかりますが、それは明らかに過大評価されています。

あなたの主張は基本的に:テストは失敗を招きます。したがって、テストは時間の無駄/無駄です。

それはいくつかのケースでは本当かもしれませんが、それは大多数ではありません。

TDDは次のことを前提としています。より多くのテスト=より少ない失敗。

テストはそれらを導入するよりも障害点をキャッチする可能性高くなります。


1

さらに多くの自動化がここで役立ちます!はい、単体テストの作成は大変な作業になる可能性があるため、いくつかのツールを使用して支援してください。.Netを使用している場合は、MicrosoftのPexのようなものを見てください。コードを調べると、ユニットテストのスイートが自動的に作成されます。それはあなたのコードを通るすべてのパスをカバーしようとする、良いカバレッジを与えるテストを思い付くでしょう。

もちろん、コードを見ただけでは実際に何をしようとしていたのかわからないので、コードが正しいかどうかはわかりません。ただし、興味深いテストケースが生成されるので、それらを調べて、期待どおりに動作するかどうかを確認できます。

次に、さらに進んでパラメーター化された単体テストを作成すると(実際にはこれらをコントラクトと見なすことができます)、これらから特定のテストケースが生成されます。今回は、テストのアサーションが失敗するため、問題があるかどうかを確認できます。


1

私はこの質問に答える良い方法について少し考えました、そして科学的な方法に平行を引きたいです。IMO、あなたはこの質問を「どのように実験を実験しますか?」と言い換えることができます。

実験は、物理的宇宙についての経験的な仮定(仮説)を検証します。ユニットテストは、それらが呼び出すコードの状態または動作に関する仮定をテストします。実験の妥当性について話すことはできますが、それは、他の多くの実験を通じて、何かが合わないことがわかっているためです。それは収束的な有効性経験的証拠の両方を持っていません。私たちは、テストまたはの妥当性を検証するために、新しい実験デザインしていない実験を、私たちは設計することができる全く新しい実験を

したがって、実験同様に、単体テスト自体に合格するかどうかに基づく単体テストの有効性については説明しません。他の単体テストとともに、テス​​ト対象のシステムについて私たちが行う前提について説明します。また、実験と同様に、テスト対象からできる限り複雑さを取り除きます。 「できる限り単純だが、それ以上単純ではない。」

実験とは異なり、収束した有効性以外にテストが有効であることを確認するためのトリックがあります。テストで検出する必要があるとわかっているバグを巧みに導入し、テストが実際に失敗するかどうかを確認できます。(もし私たちがそれを現実の世界で行うことができれば、この収束した妥当性にあまり依存しなくなります!)これを行うより効率的な方法は、実装前にテストが失敗するのを監視することです(赤、緑、リファクタリングの赤いステップ)。)。


1

テストを作成するときは、正しいパラダイムを使用する必要があります。

  1. 最初にテストを作成することから始めます。
  2. 彼らが最初から失敗しないことを確認してください。
  3. 合格させる。
  4. コードをチェックインする前のコードレビュー(テストがレビューされていることを確認してください。)

常に確信は持てませんが、テスト全体が改善されます。


0

あなたがあなたのコードをテストしなくても、それは確かにあなたのユーザーによって生産でテストされます。ユーザーは、ソフトをクラッシュさせ、重大ではないエラーを見つけることに非常に創造的です。

本番環境でのバグの修正は、開発フェーズでの問題の解決よりもはるかにコストがかかります。副作用として、顧客の脱出のために収入を失うことになります。1人の怒っている顧客に対して、11人の失われた顧客または得られなかった顧客を当てにすることができます。

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