3

通常のテスト スイートを含むインストール可能な Django アプリを管理しています。

プロジェクト作成者が自分のサイトで実行する場合、当然のことながらmanage.py test、自分のアプリと、私のようなサードパーティがインストールしたアプリの両方のテストがすべて実行されます。

私が見ている問題は、いくつかの異なるケースで、ユーザーの特定settings.pyに、アプリのテストが失敗する原因となる構成が含まれることです。

いくつかの例:

  • 一部のテストでは、返されたエラー メッセージをチェックする必要があります。これらのエラー メッセージは国際化フレームワークを使用しているため、サイトの言語が英語でない場合、これらのテストは失敗します。
  • 一部のテストでは、特定のテンプレート出力をチェックする必要があります。サイトがカスタマイズされたテンプレート (アプリがサポートする) を使用している場合、テストはデフォルトよりもカスタマイズされたテンプレートを使用することになり、テストは再び失敗します。

これを回避するために、テストを実行する環境を分離するための賢明なアプローチを見つけようとしています。

現時点での私の計画は、すべての TestCase クラスがベースの TestCase を拡張し、設定をオーバーライドすることと、その他の環境設定に注意する必要があることです。

私の質問は次のとおりです。

  • これは、アプリ レベルのテスト環境を分離するための最善の方法ですか? 私が見逃した代替手段はありますか?
  • 理想的には、おそらく完全にクリーンな構成が必要な場合に、一度にしか設定をオーバーライドできないようです。これを行う方法はありますか?そうでない場合、基本的なクリーンセットアップを行うために確認する必要がある主な設定はどれですか?
  • INSTALLED_APPSなどの一部の設定をオーバーライドしても、実装の詳細やグローバルな状態の問題により、実際には期待どおりに環境に影響を与えない可能性があると言っているのは正しいと思います。これは正しいです?どの設定に注意する必要がありますか? また、グローバルにキャッシュされた環境情報のうち、期待どおりに影響を受けない可能性があるものはどれですか?
  • 設定以外にクリーンであることを確認する必要がある環境の状態は何ですか?

より一般的には、これが他のサードパーティのインストール可能なアプリにとってどの程度の問題であるか、またはコアでこれらのいずれかにさらに対処する計画があるかどうかに関するコンテキストにも興味があります. たとえば、IRC で同様の問題に関する会話を見てきました。予期しない設定構成で実行されている Django の contrib アプリの一部。私もサードパーティのアプリと django contrib アプリの両方で同様のケースに何度か遭遇したことを覚えているようです。より多くの作業が必要な場合、または現状で十分である場合。

ご了承ください:

  • これらは統合レベルのテストであるため、グローバル レベルでこれらの環境問題に対処したいと考えています。
  • Django 1.3 をサポートする必要がありますが、大量の Django コードを再実装しない限り、いくつかの互換性ラッパーを入れることができます。
  • DJANGO_SETTINGS_MODULE明らかに、これはインストール可能なアプリであるため、テストに使用する独自のアプリを指定することはできません。
4

2 に答える 2

3

Jezdez で使用されている分離への優れたアプローチは、my_app.testsすべてのテスト コードを含むサブモジュールを呼び出すことです ( example )。これは、誰かがあなたのアプリをインストールしたときにデフォルトでこれらのテストが実行されないことを意味します。そのため、ランダムなファントム テストの失敗は発生しませんが、不注意で何かを壊していないことを確認したい場合は、get に追加myapp.testsするだけで簡単に実行できます。INSTALLED_APPSそれを実行します。

テスト内で、正しい環境が存在することを確認するために最善を尽くすことができますoverride_settings(これが 1.4 にない場合、それほど多くのコードはありません)。個人的には、統合型のテストでは、失敗しても問題にならないのではないかと感じています。必要に応じて、クリーンな設定ファイル ( compressor.test_settings) を含めることができます。これは、主要なプロジェクトにより適している場合があります。

別の方法として、テストを少し分離するという方法があります。 にはcontrib.admin、 にあるものdjango.contrib.admin.testsと にあるものtests.regression_tests.contrib.admin(またはそのようなパス) の 2 つの別個のテスト本体があります。パブリック API とコア機能をチェックするもの (すべき) は最初に存在し、他の誰かの (合理的な) 構成によって壊れる可能性があるものはすべて 2 番目に存在します。

私見、実行中の外部アプリのテスト全体が完全に壊れています。それは確かにデフォルトで起こるべきではありません (そして、その趣旨の議論があります) そして、それは問題でさえあるべきではありません - 誰かの外部アプリのテストスイートが私のモンキーパッチ (または何でも) によって壊れたとしても、私は実際には気にしません -サイトのビルドを壊したくありません。とはいえ、上記のアプローチにより、同意しない人でもかなり簡単に実行できます。Jezdez はおそらく他の誰よりも多くの主要なプラグイン可能なアプリを持っており、彼のアプローチにいくつかの微妙な問題があるとしても、少なくとも動作の一貫性はあります。

于 2012-10-24T11:16:59.723 に答える
2

再利用可能なサードパーティ アプリケーションをリリースしているため、アプリケーションを使用する開発者がコードを変更する必要がある理由はわかりません。コードが変更されていない場合、開発者はテストを実行する必要はありません。

最善の解決策である IMO は、インストール可能なパッケージの外にテストを配置することです。Django をインストールして を実行する場合、インストールした Djangomanage.py testsのバージョンが安定していると信頼しているため、Django テスト スイートは実行しません。これは、サードパーティ アプリケーションを使用する開発者にとっても同じです。

ライブラリが機能することを確認したい特定の設定がある場合は、それらの設定値を使用するテスト ケースを記述します。

テストがインストールされたパッケージの外にある、再利用可能な django アプリケーションの例を次に示します。

https://github.com/Yipit/django-roughage/tree/master

次のように、Python モジュールを開発する一般的な方法です。

https://github.com/kennethreitz/requests

https://github.com/getsentry/sentry

于 2012-10-24T15:02:31.917 に答える