2009-03-04 8 views
2

注:これは、ユニットテストや統合テストのためではありません。これは、アプリケーションが実行されている場合です。外部システムを使用する前にテストする必要がありますか?

私は3種類の

  • リレーショナルデータベース
  • SOAPやWCFサービス
  • ファイルシステム(ネットワーク共有)に分類することができ、複数のバックエンド・システムへの通信システムに取り組んでいます
  • 環境による

これがで実行される、これらのいずれかが実行時に利用可能になるという保証はありません。実際には、それらのいくつかはかなり脆弱に見えるし、1日に複数回行く:(

実際のコードの前に実行されるテストコードの小さなビットを持つことを考えています。システムの安定性(またはその欠如)にかかわらず、非常に安定したシステムを構築することが、最終的な目標であり、論理的なポイントで利用可能であることを確認するためにコード内でテストを再実行する可能性があります。それはに通信し、このデザインの周り

私の質問は以下のとおりです。

  1. はそれで大きな問題はあります(小さなTHI?それは、テストが完了し、コード実行の間で失敗する可能性が事実のようなNGSは理解している)
  2. がデザインのこの種を実装するためのより良い方法はありますか?
  3. 伝統的な例外処理やトランザクションを使用する方が良いでしょうか?

アップデート

  • システムが協調して、バックエンドシステムに話をする必要があります。
  • システムは非常に非同期であるため、キューイング技術のようなものを使用しても問題ありません。
  • 1つ以上のバックエンドシステムが停止していても、他のシステムが稼動していて、情報の処理が可能な場合でも、システムは動作する必要があります。
+0

私がこのような「テスト」のために遭遇した言葉は、飛行前のコードです。 – Morendil

+0

@Morendilは飛行前のコードでは何も見つけることができません...しかし、私はいつも好きです;) –

答えて

2

あなたが最後のチェックと実際の要求の間に何かが失敗する可能性が常にあるので、何があっても伝統的な例外処理を必要とすることがあります。だから私はあなたが見つけた解決策がこれとスムーズにやりとりするべきだと思っています。

これらのフレーク状のリソースが調整された方法のいくつかの種類に対話する必要がある場合は、あなたはおそらくこれを行うにはいくつかの種類のトランザクションマネージャを使用してしなければならないことを示していると思われる、明記されていません。ほとんどのニーズのためにアプリケーションコードでトランザクション管理のフットワークに取り掛かりたいとは思っていません。

時々私も見ている人には、(たとえばによるタイムアウトの問題のために)失敗するバックエンドシステムを再試行ロジックをカプセル化するためにAOPを使用しています。控えめに使用すると、まあまあです。

メッセージキュー技術を使用して、不安定なバックエンドを緩和することもできます。たとえば、トランザクションの一部としてメッセージキューにコミットし、成功した場合にのみキューをポップすることができます。しかし、この設計は、通常、非同期プロセスで暮らすことができる場合にのみ可能です。

いつものように、リアルの安定性は、問題の根本原因を攻撃することによってのみ達成できます。私は25年前のバグをメインフレームのTCP/IPスタックに固定していたので、それをオーバーランしていたので、です。

+0

システムは協調して対話する必要がありますが、トランザクションマネージャの機能は既に処理しています。また、システムが非同期でなければならないため、キューイング技術もたくさん使用しています(あなたが書いた方法ではありませんが)。 –

1

マイクロソフトスマートクライアントフレームワークはConnectionMonitorクラスを提供します。使用したり、複製したりするのは簡単です。

+0

接続モニターが見える間にポイントxでテストします。それが私たちに教えてくれるように(私を修正してください - これは私がそれを聞いた最初のことです)。しかし、私はそれが好きで、それが他の分野で役立つ方法を考えています。 –

+0

私たちの必要性のために動作するようなupdatestatusメソッドがあります。これはデータベースのようなネットワーク接続ではないものにどれくらいうまく適合しますか? –

+0

私たちはHTTP用にしか使用しませんが、私はそれを拡張することができると信じています。私はまだその道を歩いていない。 – leppie

0

この種の問題に対する私たちのアプローチは、メインアプリケーションを起動する前に、本当に基本的な「サニティテスター」を実行することでした。これは厚いクライアントでしたので、アプリが起動するたびにテストを実行することができました。このサニティテストは、データベースの可用性や外部ネットワーク(エクストラネット)へのアクセスなどのチェックを行い、Webサービスを行うように拡張されている可能性があります。

エラーが発生した場合、ユーザーに通知され、電子メールがサポート/開発チームにも送信されました。これらのメールは、作成されたばかりのときにすぐに不安定になりましたが、フィルタを設定していたので、実際に何かが起こっていたときはわかっていました。全体的にアプローチは非常にうまくいっていました。私たちの最大の勝利は、システムにダウンしたこと、データを入力する前にシステムがダウンしていたことをユーザーに伝えること、彼らは絶対にそれを愛していた。

テクニカレベルでは、C#で問題なく書かれていましたが、従来の方法で例外処理を使用して、問題を見つけられませんでした。サニティプログラムは、それ自体がミニアプリになり、メインアプリから独立していました。私がもう一度やり直していたら、ロギングフレームワークを使用して問題をキャプチャします。これは、ハードコーディングされたアプローチよりも柔軟性があります。

+0

@MrTelly問題はアプリケーションの起動前ではなく、アプリケーションの実行中です。プレラウンチがうまく動作しない理由は、すべてのルーチンが同じシステムを使用するわけではないため、1つのルーチンがダウンしているためにすべての処理を停止することは効果的ではなく、オプションでもありません。 –