2011-10-12 11 views
1

私は単体テストに慣れていませんが、私はきれいに書かれたコードと適切に設計されたアーキテクチャを信じていると思う傾向があります。ユニットテストの依存関係について

私の質問です。単体テストはオブジェクト間の依存関係にあまり集中しませんか?あなたのメソッドがbeforを呼び出すために使用した依存関係がもはや呼び出されない(設計決定)、あるいはあなたのメソッドが別のメソッドまたは依存関係を呼び出す(再度設計決定)ために、単体テストが失敗したときはどうしますか?その場合、単体テストは、カップルを減らし、コンポーネント間の結束を改善するのにほとんど役に立ちません。

私の意見は広すぎるかもしれませんが、一般的には、人々は適切にマナーユニットテストで依存関係をどのように扱いますか?私は最良の方法は依存性を全く持たないことであり、すべてのメソッドはそれに与えられたパラメータに依存していたと思うが、これは現実にはほとんど当てはまらない。さらに、すべての可能な呼び出しについてすべての依存メソッドを偽装することは、少し主観的で時間を無駄にします。なぜなら、将来の時点では、テスト対象のクラスは単に依存関係を必要としないからです。

答えて

0

ユニットテストでは依存性がないので、ユニットテストでは1つのクラス(Java、C++、Ruby、Python)しかテストされません。あなたが話していることは、異なる統合テストのように聞こえる。さらに、依存関係を強くしなければならない場合、カップリングは非常に良いものではありませんが、必ずしも避けることはできません。

+0

ええ、そこに書かれたコードの99%が見えます。依存関係はどこにでもあり、別のオブジェクトのメソッドを呼び出さないメソッドはほとんど作成できません。明確な例は、コントローラとJavaのDAOオブジェクトとの間の結合です。 – user802232

+0

もちろん、ユニットテストについてではなく、統合テストについても言及しています。この例では、コントローラをユニットテストすることができますか?いいえ、コントローラーは一人ではないので...統合テストを行う必要があります。 – khmarbaise

2

このテクニックが設計上の問題を解決するのに役立つと思うので、テスト駆動型開発(TDD)をご覧になることをお勧めします。プロダクションコードを書く前に単体テストを書くことによって、プロダクションコードをテスト可能にする方法を考える必要があります。これは、テストの後の方が良いでしょう。ここでは、プロダクションコードを最初に書いてから、その周りにシューホーンテストを試みます。

依存関係を処理するには、どのような依存関係が問題を引き起こしているのかを考えます。

外部依存

あなたのテストでは、ファイルなどの外部リソースを使用する場合は、統合テストではなく、ユニットテストを書いています。私は外部ファイルを使用する多くのテストを書いており、テストプロジェクトでそのファイルのコピーを作成しました。このファイルのコピーには、テストに必要なダミーデータが含まれています。

テストにデータベースが必要な場合は、再度統合テストを作成します。個人的に私は自分のPCにデータベースのローカルコピーを作成し、テストを実行します。

オブジェクトの依存性

あなたは(プライベートメソッドのシグネチャが変更された場合、例えば、あなたのテストは失敗します)コードの依存関係を心配しているなら、あなたは、抽象化の間違ったレベルでテストしています。これは、あなたのテストがプライベートAPIではなくパブリックAPIを呼び出すことを意味します。この点を補うには、オブジェクトにinterfacesを使用して、それを実装するオブジェクトの期待される契約を保証します。

私はまた、あなたが、のようなRhinoMocksMoqまたはTypeMock

はモックフレームワークを使用すると、たとえば、上の依存関係を削除するのに役立ちますモックフレームワークを使用して、テストのために利用可能なデータベースを持ってみることをお勧めします。私は個人的にはTypeMockを使用していますが、それは安くはありませんが、そこでは最も強力なツールです。

+0

それでも、今から1年後に同じインターフェースに頼ることになります:) – user802232

+1

ここで重要なポイントは、プロダクションコードが変更されると、テストが中断される可能性があるということです。あなたはそれを逃れることはできません。変更を破棄することから100%テストコードを保護する方法はありません。あなたのオブジェクトをどのようにデザインすれば、あなたのテストがどれだけ壊れるかが決まります。私はそれが迷惑であることを知っている、私はそこに行ってきたが、魔法の弾丸はありません。 –

+0

これは私の頭を鳴らしているものです。 – user802232

0

ユニットテストは、実装ではなく動作をテストするものとします。そうすれば、実装を変更するときやコードをリファクタリングするときに単体テストに頼ることができます。 (例えば、クラスをインライン展開することによって)依存関係を削除しても、テストは中断されません。

実装のテストでは、リファクタリング時に邪魔なテストが行​​われます。

+0

さて、私のメソッドが単に宣言されていない依存関係があるため、テストが爆発した場合、特定のパラメータセットに対していくつかの結果が戻ってくることを、私はどのようにテストすることができますか? – user802232

+0

クラスは1つ)とコラボレーション。責任ではなく、コロケーションを変更した場合、テストは中断されるべきではありません。 – philant

関連する問題