2009-10-16 15 views
16

私は、HTTPサーバーとして動作するアプリケーションの一部の単体テストを書いています。私が取ろうとしてきたアプローチは、HTTPサーバーを含むモジュールをインポートして起動することです。次に、単体テストは、urllib2を使用して接続し、データを送信し、応答をチェックします。Python - Twisted and Unit Tests

私たちのHTTPサーバーはTwistedを使用しています。ここでの問題の1つは、Twistedに慣れていないことです。

HTTPサーバーをインスタンス化してsetUp()メソッドで起動し、tearDown()メソッドで停止します。

問題は、Twistedはこのようには見えず、1つの単体テストしか実行できないということです。最初の反応の後、リアクターはもはや始動しません。

私は検索し、検索して検索しましたが、私はちょうど答えが見つからないようです。

私は間違ったアプローチを完全に取っているのか、それとも明白なものがないのでしょうか?

答えて

17

はここにいくつかの情報です。試しにたくさんの良いものがあります!しかし、非同期アプリケーションでテストを行うことは必ずしも容易ではありません。がんばろう!

7

TwistedのユニットテストではTwistedTrial(これはコアコンポーネントです。つまり、twisted/trialディレクトリにTwisted tarballが付属しています)と考えています。しかし、私が指摘したURLによれば、この文書は主にソース(さまざまなTwistedプロジェクトのソースも含め、試用版でテストされています)を見ています。あなたはまた、トライアルコマンドの-helpをご覧くださいWriting tests for Twisted code using Trial

3

known bugがあり、反応炉を再起動するとクラッシュするTwisted(おそらく修正されないでしょう)があります。

これはユニットテストがうまくいかない理由です。

Trialと同様に、クライアントのようにHTTPサーバーと通信する個別のテストシステムを検討することもできます。

  • Webdriver - サイトのブラウザセッションを駆動するAPI。
  • TestGen4Web - サイトとのやりとりを記録して再生できるFirefoxプラグイン。
4

他にも触れましたが、TwistedのユニットテストにはTrialを使用する必要があります。

また、ユニットテストのボトムアップからユニットテストを行う必要があります。これは、ユニットテストの「ユニット」が意味するものです。インターフェイスをテストする前に、データとロジックをテストします。 HTTPインタフェースの場合は、模擬リクエストでprocessGET、processPOSTなどを呼び出す必要がありますが、これらのメソッドが呼び出しているものをテストした後にのみ行う必要があります。各テストは、他の場所でテストされたユニットが設計どおりに動作していると仮定しなければなりません。

HTTPを使用している場合や、実行中のサーバーやその他の状態が必要な場合は、機能テストや統合テストなどの上位テストを行っている可能性があります。これは悪いことではありませんが、質問を言い換えるとよいでしょう。

+0

あなたは正しいと思います。正直言って、私が下位レベルの単体テストを行うために必要なのは、 "要求"オブジェクトを偽造することです(機能の中にはかなりのものを使用しています)。 – Dave