7

(django.test.client.Client を使用する代わりに) HTTP リクエストを直接実行する単体テストを作成したいと考えています。

理由が知りたい場合は、Django アプリケーションから公開する Thrift-over-HTTP API をテストしたいので、単体テストで Thrift クライアントを使用したいからです。

問題は、テスト中にサーバーが実際に実行されていないことです。django.test.client.Client を使用する場合、実際に HTTP リクエストを作成する代わりに、ビュー関数を呼び出すだけです。(間違っていたら訂正してください。)

では、テスト フレームワークに HTTP サーバーを強制的に起動させる最善の方法は何でしょうか?

次のようなことを行うbashスクリプトを書いてみました:

./manage.py testserver --addrport 7000 &
PID=$!
sleep 5
./manage.py test --no-input
kill $PID

しかし、それは厄介です (実際には機能しません)。なぜなら、1) スリープが必要であり (そうしないと、DB がテスト サーバーによって初期化される前にテストが開始されます)、2) テストはデータベースを再度初期化しようとします ( testserver はすでに初期化しています)。

これに対する他の解決策はありますか?

ありがとうございました。

4

2 に答える 2

7

そうです、これは問題であり、バグがあります: http://code.djangoproject.com/ticket/2879

ただ、意図的に省略されたマルチスレッドの問題が発生する可能性があり ます 。 3357

私はイライラしているので、別のスレッドでライブサーバーを起動し、その後それをクリーニングすることを含むライブラリを作成しました: http://devel.almad.net/trac/django-sane-testing/。また、ランタイムのmonkeypatchingによってマルチスレッド化されたDjangoのサーバーを起動し、代わりにcherrypy httpを使用できます(とにかく優れています)。

唯一の問題は、nose をテスト フレームワークとして使用する必要があることです (標準の unittest との 100% の下位互換性がありますが、既に何か他のものを使用している場合は...)。その後、 --with-django と --with-djangoliveserver/--with-cherrypyliveserver を使用できます。それが倹約でどのように機能するかわかりません。

注意してください:

  • バグレポートで Django 開発者にバグを報告しないでください。
  • Windmill は同じソリューションを提供するため、windmill を使用している場合は、おそらくポートの競合が発生します。
于 2009-06-18T08:10:10.477 に答える