2012-04-13 4 views
0

私は現在、クライアントのウェブサイトからデータを解析している環境にいます。クライアントがサイトを変更したときに、私たちが情報をもはや受け取っていないことを確認するためにテストを使用したいと思います。TDDシナリオ:アドバイスを探す

私の最初のアプローチは、テストがクライアントのサイトにヒットし、データが見つかったと主張する純粋な統合テストを行うことでした。しかし、途中で500回のテストが行​​われたにもかかわらず、テストランは耐え難きになり、場合によってはタイムアウトになりました。だから私は彼らが提供している中核的な保護を失うことなくできるだけ多くのテストをクリアして、私は350程度に下がっています。私は、すべてのテストを壊すだけで、より多くのテストを追加するという恐れがあります。また、私はもう5分以上の時間を実行していない(一部のクライアントは、サイトとの通信の速度に基づいているため、一部のクライアントは長くなります)。私はこれを完全な失敗と見なします。

私はこれについて多くのことを考えていて、オフィスを尋ねてきました。私の次の試みは、クライアントのページをプルダウンし、プロジェクトの埋め込みリソースに対してテストを書くことです。これにより私はより高いテストカバレッジを得ることができ、私は孤立してテストに戻ることができます。しかし、私が変更を加えたときに通知を受ける必要があり、テストするページを再度プルダウンする必要があります。私はクライアントがこれに従うとは思わない。

失敗したテスト(クライアントサイトにヒットした)と同じ機能を提供するが、前よりもはるかに少ない数の「ランダム」統合テストでこれを増やすことを提案しました。私はランダムテストのアイデアは本当に好きではありません。時には赤いライトが点灯し、同じコードで緑色のライトが点灯する可能性があります。しかし、これまでのところ、クライアントのサイトが変更され、コードがデータを見つけなくなったときの認識を得るために私が聞いた最良のアイデアのように思えます。

誰もがこのような環境をテストしていますか?私のためのテストコミュニティからの任意の提案?

+0

外部Webサイトからデータを削っているのですか?はいの場合は、大きな変更が行われる前に頭をアップさせることができますか?そうでない場合は、テストの最小限のサブセット(煙)にタグを付け、最初に実行します。この基本セットが通過したら、スイートの残りの部分を呼び出します。 – Gishu

+0

おかげさまで皆様のご提案をいただきました。困ったことに間違いなく良い情報。 – Joe

答えて

0

大きなテストが耐えられなくなったと言えば、このテストスイートを手動で実行していることが示唆されます。あなたはする必要はありません。スイートを完成させるために必要なスピードでバックグラウンドで絶えず稼働していなければなりません。そして、やり直してください。何かが間違っている場合にのみ、警告を発するべきです。

あなたのテストが、数字が大きくなるにつれてより遅くなるようなものがあれば、それを見つけて修正します。テストはお互いに独立している必要があります。そのため、テストを個別に行うことでタイムアウトする必要はありません。

+0

私は、バックグラウンドでテストを実行していることについてもっと知りたいです。現在私はresharperとalt r + u + nを使って、変更を加えた後、すべてのテストを終了します。私はコミット/プッシュで自動化されたテストを持つCIに私たちの環境を手放そうとしています。この環境はあまりまだありません。 – Joe

0

私の推奨は、不確実性を扱うコードの部分を可能な限り分離しようとすることです。この部分は、他のすべてのコードで使用されるサービスとして動作するAPIでなければなりません。こうすることで、ほとんどのコードを変更から保護することができます。

コードの安定した部分は単体テストである必要があります。その部分は、クライアントのサイトへの接続から独立しているため、テストをすばやく実行する必要があり、テストの信頼性も向上します。

クライアントのウェブサイトの変更を処理する必要がある部分を減らすことができます。この方法で問題を解決するわけではありませんが、少なくともコードを最小限に抑えて、コードの1つのモジュールに集中させる必要があります。

ウェブサービスとしてデータを公開することをクライアントに提案するのが最適です。しかし、私はあなたに依存していないと思う:P。

+0

ええと、私たちはクライアントとのコミュニケーションがどのように許可されているのか制限しています。私は可能な限りそれを分離することに同意します。私はすべての解析ロジックを独自のクラスに取り込み、そこでしか実行しません。それから私はパーサに必要なすべてのもの(実際にはHTMLのみ)を渡しています。私はさらにそれを取り除くことにもっと考えていきます。それは問題の最悪の部分であり、より高い抽出レベルでは素晴らしいでしょう。 – Joe

0

あなたのテストを分けて、独立して実行できる別々のアセンブリに分けてください。私は通常、単体テストアセンブリとより遅い実行中の統合テストアセンブリを持っています。

私の単体テストアセンブリは非常に高速です(コードはモックを使用して単独でテストされるため)、開発するにつれて非常に頻繁に実行されます。統合テストは遅く、機能/チェックインを完了したとき、または何かを壊すことについて悪い気持ちがあるときにのみ実行します。

さらに似たようなことをすることもできますし、アイデアをさらに取って3番目のテストスイートに3番目のテストスイートを追加することもできます。

継続的な統合サーバー/プロセスがない場合は、1つ目の設定を確認する必要があります。これにより、ソフトウェアが継続的に構築され、テストが実行されます。チェックインを監視し、バックグラウンドで作業し、何かが失敗した場合に通知を送信するように設定できます。これを使用すると、クライアントUIのポーリングテストにかかる時間を気にする必要はありません。これは、自分で実行する必要がないからです。

+0

私は間違いなくこの時間に私の統合と孤立テストを分割するアプローチを取るつもりです。私のテストのすべてが時間のシンクであるため、すべてのテストを緩めたくありません。私は自分の環境をCIに取り入れることにも取り組んでいます。 – Joe

0

確実にテストを分割します - 最小限の統合テストから単体テストを分離します。

Martyn氏によると、継続的インテグレーションシステムを導入しています。 Teamcityは、優れた使い勝手の良い、最初の20回のビルドで無料で使用できます。自分のマシンでサーバーを稼働させることができれば、自分のマシンでうまく実行できます。 - http://www.jetbrains.com/teamcity/

1つのビルドすべてのチェックインを実行し、そのビルドがユニットテストを実行するようにするか、または実行するテストを高速実行するようにします。

毎晩深夜(または他の都合のよい時)に実行するように2番目のビルドを設定し、これに実行中のクライアント呼び出し統合テストを長く実行することを含めます。これにより、テストの所要時間は関係ありません。あなたのクライアントがあなたのものを壊してしまった場合は、午前中に大きな赤旗が表示されます。問題があると思われる場合は、手動でこれらを手動で実行することもできます。

関連する問題