2009-06-21 6 views
5

私はオープンソースのPython ORMのバックエンドに取り組んでいます。ライブラリには、バックエンドごとに1セットの450個のテストケースが含まれており、すべて1つの巨大なテストクラスにまとめられています。私にテストクラスは「神オブジェクト」になることはできますか?

、一つのクラスのためにたくさんのように聞こえるが、私はが、私はこのライブラリは、各バックエンドのためのテストケースを含むない〜2000のテストケースを持っていると信じて( 450のテストケースを持っていることをプロジェクトに取り組んでたことがありません)。私はこれがハイエンドのビットであると感じて正しいですか(何かを壊すべきではない魔法の数は本当にありません)、あるいはテストクラスが非常に多くのテストを行うのはそれほど大きな問題ではないでしょうか?

テストケースがそれほど多くない場合でも、過度に大きなテストクラスをリファクタリングするにはどうすればよいでしょうか?リファクタリングについての私の知識の大部分は、リファクタリングされているコードに対してテストが行​​われていることを確認することです。私はそれがリファクタリングされる必要のあるテストそのものの状況に対処する必要はありませんでした。

EDIT:以前は、これは単体テストであると言っていましたが、これはあまり真実ではありません。これらは、より適切に統合テストと呼ばれます。

答えて

4

450 1つのクラスのテストは多くのように聞こえますが、どのように構成されているかによってテストの難易度は異なります。彼らが本当に相互に独立していて、テストクラスのメンバーであれば、それほど大きな問題ではないかもしれません - 特定のテストを見つけるのは難しいはずです。

テストクラスはテストの一部だけで使用され、他の人によって無視されているメンバーがいる一方、それはテストの香りは、このようなルートを含むあいまいなテスト一般的なフィクスチャとして原因と無関係と呼ばれています情報(専門用語に注意してください - 私はこれに戻ります)。

テストをクラスに編成する方法はいくつかあります。最も一般的なパターンはです。クラスあたりのテストケースクラス,フィーチャーごとのテストケースクラステストケースクラス

テストを構成する方法は、テストの作成中だけでなく、保守上の理由からも重要です。その理由だけで、私はあなたのテストをリファクタリングする価値ある努力と言える傾向があります。 TDDでは、テストコードベースは実際のコードベースと同じくらい重要であり、同じ種類の尊重で扱われるべきです。

十分におすすめできないxUnit Test Patterns: Refactoring Test Codeというこの件に関する書籍があります。ユニットテストとTDDを扱う完全なパターン言語が含まれています。ここで使用したすべてのパターン名は、その由来です。

+0

"...特定のテストを見つけるのは難しいでしょう。"ビンゴ。それはまさに私が直面している問題です。 –

2

数字を数えるのではなく、効果があるかどうかを検討します。つまり、1行の修正を行う場合、いくつのテストが中断しますか?数十のボルクテストを修正する時間を無駄にしているなら、問題があります。テストは同じことを何度も何度も繰り返すべきではなく、そうであればリファクタリングが必要です。

テストベース開発のテスト - 書き込み - リファクタリングから有機的にフローさせるのではなく、トップダウンからテストベースをリファクタリングすることはおそらく考えません。テストを作成してエンハンスメントを実装し、> 1テストが失敗した場合は、テストをリファクタリングします

2

テストクラスを分割して、各クラスで1種類の動作を指定するようにします。一例として、私はa TDD tutorialと書いています.1つの種類の行動(テトリスゲームでは、落下ブロック、回転するピースなど)に対して、およそ1つのテストクラスがあります。

リファクタリングテストは、システムが行うべきことの意図を文書化して、テストとして適切な価値を提供する必要があるため、コードのリファクタリングにも同様に重要です。テストはシステムの仕様です。

his answerで述べられているTodd Gardnerのように、1つの方法を変更したために多くのテストが失敗した場合、多くのテストで同じ動作がテストされています。この結果、テストが失敗すると、何の関係もないテストの多くが同時に失敗するため、正確に何が壊れていたのかを知ることは困難です。また、システムの動作を変更する必要がある場合は、テストを更新する必要があります。しかし、テストの責任が明確でない場合は、テストをどのように変更すべきか、あるいはテストが時代遅れであり、削除すべきかを知ることは難しいでしょう。たとえ行動の変化が小さかったとしても、多くのテストを変更する必要があるかもしれません。

450クラスのテストは非常によく似ています。テストは何をテストしますか?彼らの名前は何ですか?それらはシステムの動作(良いこと)に集中しているのですか、それとも実装との間に1対1の関係がありますか?多くの無関係なものをテストすると、責任を多くのテストクラスに分割することが良いでしょう。

0

はい、「神のオブジェクト」であるテストクラスは、私の問題のようには聞こえません。

+0

これはなぜか詳細に説明できると思いますか?つまり、神の対象ではないテストクラスは確かに問題です。テストクラスはどう違うのですか? –

+0

統合テストを行っている場合は、システム全体の動作を知る必要があります。さらに、私は方法のほとんどがお互いにとにかく話していないことになるでしょう。 – Joshua

2

フレームワークユニットテストのセットは、起動およびセットアップ機能に大きな重なりがあります。この場合、いくつかのメソッドを変更すると、すべてのテストが簡単に破損する可能性があります。特にORM。

つまり、テストは機能別にグループ化する必要があります。タイプX、共用体、結合、DDL /スキーマ検索、フェッチ・キャッシング、文の作成などの問合せ...

関連する問題