質問

これでちょっとした会話が弾んだようです 別の質問 と私 という質問である。

DRYの原則は、メンテナンスと戦うための私たちの武器であるようだ。 のメンテナンスについてはどうだろう? テストコード?同じ経験則を実行する を適用するか?

開発者テストのコミュニティでは、次のような意見が強い。 セットアップと撤収は有害であり、避けるべきである...。いくつか例を挙げると、

実際、xUnit.netはこのような理由から、フレームワークからこれらを完全に削除しました。 (があるが この自ら課した制限を回避する方法).

あなたの経験は何でしたか?セットアップや破棄は保守性のテストに悪影響を及ぼしますか、それとも役立ちますか?

アップデート:JUnit4 や TestNG で利用できるもの (@BeforeClass、@BeforeGroups など) のような、よりきめの細かい構造は違いをもたらしますか?

役に立ちましたか?

解決

大多数(すべてではない)のの有効なのセットアップとティアダウンの方法に使用するセットアップ/ティアダウンパラダイムに悩まされているように見える問題に入ることなく、DRYすることができますファクトリメソッドとして記述することができます。

あなたはティアダウンを実装している場合、一般的に、これはあなたがユニットテストをやっていないことではなく、統合テスト。多くの人々は、ティアダウンを持っていない理由としてこれを使用しますが、IMOの統合やユニットテストの両方があるはずです。私は個人的に別々のアセンブリにそれらを分けるだろうが、私は良いテストフレームワークはテストの両方のタイプをサポートすることができるはずだと思います。すべてではないが、の良いのテストは、ユニットテストになるだろうされます。

ただし、セットアップとテストが実際に実行される前に、あなたは物事を行う必要がある理由の数があるように思われます。例えば、オブジェクトの状態の構成は、(依存性注入フレームワークを設定するインスタンスの)試験のために準備をします。これは、セットアップのために正当な理由ですが、同じように簡単に工場で行うことができます。

また、クラスおよびメソッドレベルセットアップ/ティアダウンの間に区別があります。それはあなたが何をしようとして検討する際に留意する必要があります。

私はセットアップ/ティアダウンパラダイムを使用して持っていた私の最大の問題は、私のテストはいつも同じパターンに従わないということです。これは私が他の開発者に読みやすく、全く混乱さ同時にDRYしばらく持っていることを可能にする、代わりに工場出荷時のパターンを使用してに私をもたらしました。工場出荷時のルートを行く、私は私のケーキを持っているし、それを食べることができました。

他のヒント

彼らは本当に我々のテストの保守性を支援してきました。私たちの「ユニット」のテストは、実際にDBへの書き込み、結果を確認し、完全なエンドツーエンドの統合テストです。私がここに着いたとき、私のせいではないが、彼らはそのようにした、と私は物事を変えるために働いています。

一つのテストが失敗した場合は、

とにかく、それは一意性制約に違反し、DBの最初のテストから同じユーザーを入力しようとすると、次のものに行き、そこからカスケード故障。 [フィクス] [SETUP |ティアダウン]にユーザーの作成/削除を移動する方法は非常に簡単かつ少ないstabby私たちはすべてがめちゃくちゃ行かなくても失敗した一つのテストを参照してくださいすることができ、そして私の人生を作った。

しかし私は、そのアプリケーションが異なっている、それはコードの場合と同様にDRY原則はテストのためだけに限り適用されると思います。コードでは、文字通り、コードの2つの異なる部分で同じことをしないためにはるかに大きい長さに行きます。 (同じ設定の多くを行う)ことを行う必要性をテストするには、確かに臭いですが、解決策は、設定方法に重複を考慮し、必ずしもではありません。クラス自体で設定するか、または有意義であると状態のこの量にはあまり依存しているので、テスト対象のコードを分離するために状態を容易にしてもよい。

のみのテストごとに1つの事をテストする一般的な目標を考えると、本当に(例えば、特定の型のオブジェクトを作成するなど)特定の場合には何度も何度も同じことをたくさんやって回避することが可能ではありません。あなたはそれをたくさん持っている見つけた場合、それは、そのようなパラメータ化テストなどを導入すると、テストのアプローチを再考する価値があるかもしれます。

私はセットアップとティアダウンは、主に(このような環境のテスト1ではなく、生産1にする注射剤として)環境を確立するためであるべきであり、テストの一部と小包あるステップを含んでいてはならないと考えます。

私はヨセフが言っているすべてのもの、ティアダウンは、統合テストを書くことのしるしであることについて、特に一部に同意するが、それに加えて、私が言うと思います(と時間の99%が、私はそれを使用してきたものです)セットアップを使用すると、テストは、論理的にグループ化されなければならないとき、彼らは複数のテストクラスに分割されなければならないときの良い指標であること。

レガシーコードにテストを適用するとき、私は大規模なセットアップ方法に問題がないが、セットアップはスイートの中にのすべてのテストに共通する必要があります。あなた自身が実際にセットアップの複数のビットをやって設定方法を持つ見つけたら、それは複数のケースにあなたのテストを分割する時間です。

<のhref = "http://www.google.co.uk/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Fwww.amazon.co.uk%の例に続き2FTestドリブン受付のJava開発%2Fdp%2F1932394850&EI = _RFSSrzNO4_QjAfwmcS3BQ&USG = AFQjCNFWA-PCKRoKQWO4UzOmhDCBhWT1-G&SIG2 = gI14qGmfxRDKlSpZmSNZWg」REL = "nofollowをnoreferrer"> "テストを" 駆動、設定方法は、からのテストケースで重複を取り除いています。

私は頻繁に(応じて、実数またはテストのいずれか)の協力者を設定するには、JavaやPythonでかなり頻繁にセットアップを使用しています。テスト対象のオブジェクトはコンストラクタとして何のコンストラクタか、単に協力者を持っていない場合、私はオブジェクトを作成します。単純な値のクラスのために私は通常、彼らと気にしないでください。

私はJavaで非常に頻度の低いティアダウンを使用します。私は(テストの下で、これらのモジュールのユーザーを取得するには、特に、サルパッチ適用モジュール)グローバルな状態を変更する可能性が高いだったので、Pythonでは、それはより頻繁に使用されました。その場合、私はテストが失敗した場合に呼び出されることが保証されますティアダウンをしたい。

(多くの場合のxUnitフレームワークを使用)

統合テストと機能テストは、セットアップとティアダウンを必要とする可能性が高くなります。

覚えておくべき点は、備品に、だけでなく、DRYを考えることです。

私はそれ自体がテストのセットアップとティアダウンメソッドの問題を持っていません。

私には問題は、テスト・セットアップとティアダウンの方法を持っている場合、それは同じテストオブジェクトは、各テストのために再利用されていることを示していることです。あなたがテストの間の状態のいくつかの要素をクリーンアップするのを忘れた場合、テスト結果は、順序依存になることができ、これは、潜在的なエラーベクトルです。私たちが本当に欲しいのはどのような状態を共有していないテストです。

それが実行され、各テストのための新しいオブジェクトを作成するため、

xUnit.Netは、セットアップ/ティアダウンを取り除きます。本質的には、コンストラクタは、設定方法になり、ファイナライザは、ティアダウンメソッドになります。試験の間に保持されない(オブジェクトレベル)状態はこの潜在的なエラーベクトルを排除し、ありません。

私が書くほとんどのテストでは、それはちょうど私が必要とモックを作成し、モックまでテストされているオブジェクトを配線していても場合、セットアップのいくつかの量を持っています。彼らは何を行わないと、テストの間にどのような状態を共有しています。ティアダウンはちょうど私がその状態を共有しないことを確認することされます。

私はあなたが投稿ものの両方を読む時間がなかったが、私は特にこのコメントを言っています:

  

各テストは、それが実行するために必要なもののための初期化を行うことを余儀なくされます。

セットアップと便利なメソッドですが取り壊す - 彼らはそのデフォルトコンストラクタを使用して、クラスを初期化するよりもはるかに多くを行うことを試みるべきではありません、など3つのテストは、5つのテストクラスに必要であることを共通のコードが表示されることはありません - のそれぞれを3つのテストは、直接このコードを呼び出す必要があります。また、これはお互いのつま先を踏んそしてあなたが共通initalizationルーチンを変更するという理由だけでテストの束を壊すからテストを保持します。だけでなく、特定のテスト - 主な問題は、これがすべてのテストの前に呼び出されるということです。ほとんどのテストはシンプルであるべきであり、より複雑なものは、初期化コードが必要になりますが、あなたは涙ダウン中で設定し、複雑な破壊で複雑な初期化をトレースしていないとき、簡単なテストのシンプルさを見ることが容易ですテストが実際に達成することになっているものについて考えます。

個人的には、セットアップと解体は必ずしも悪ではなく、この推論は少し独断的であると感じています。しかし、私はそれらを「」と呼ぶことに問題はありません。コードの匂い 単体テスト用。私は、次のような理由から、これらの使用は正当化されるべきだと感じています。

  1. テスト コードはその性質上、手続き型です。一般的に、セットアップ/ティアダウン する テストの読みやすさや集中力が低下する傾向があります。
  2. セットアップ メソッドは、単一のテストに必要な以上の初期化を行う傾向があります。乱用すると扱いにくくなる可能性があります。オブジェクト マザー、テスト データ ビルダー、おそらく FactoryGirl のようなフレームワークは、テスト データの初期化に優れているようです。
  3. これらは「コンテキストの肥大化」を促進します。テスト コンテキストが大きくなるほど、保守しにくくなります。

私のセットアップ/分解でこれが起こらない限り、それらの使用は保証されると思います。テストには必ず重複が存在します。ニール・フォードはこう述べています。 「テストは濡れても構いませんが、びしょ濡れにはなりません...」 また、特に単体テストについて話しているのではなく、より広範な統合テストについて話している場合には、それらの使用がより正当化されると思います。

私自身で作業しているので、これが特に問題になったことはありません。しかし、チーム設定でテスト スイートを維持するのは非常に難しいことがわかりました。その原因は、お互いのコードをすぐに理解できない、またはコードを理解するためにコードを段階的に実行したくないことが多いです。テストの観点から見ると、テストである程度の重複を許可すると、この負担が軽減されることがわかりました。

ただし、他の人がこれについてどう感じているかを聞きたいです。

あなたのユニットテストは、あなたがを何多分、動作させるために、セットアップとティアダウンが必要な場合は、本当にの必要モックオブジェクトのですか?

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