0

Django テストで特定の url-config を使用するには、それを指定するだけです:

class MyTests(TestCase):
    urls = 'myproj.myapp.urls'

    def test_myurl(self):
        r = self.client.get('/foo/')  # looks up /foo/ in myproj/myapp/urls.py

ただし、実装がスレッドセーフであるようには見えません。

def _urlconf_setup(self):
    if hasattr(self, 'urls'):
        self._old_root_urlconf = settings.ROOT_URLCONF
        settings.ROOT_URLCONF = self.urls
        clear_url_caches()

そして、テスト スイートを py.test -n8 (8 つの CPU すべてを使用) で実行した後、テスト ログに 404 エラーが表示されます。

他の誰かがこの問題を見たり解決したりしましたか?

4

3 に答える 3

1

簡単な答え:サブクラスの設定urlsは、呼び出されたときにスレッドセーフではありません。おそらく、異なるスレッドがクラバリングしているためです。TestCasefrom py.test -nsettings.ROOT_URLCONF

django/core/handlers/base.py:get_response()を使用する代わりに、リクエストオブジェクトが存在する場合はそれからurlconfをフェッチするコードがあります(私も最新のリビジョンをチェックしました) settings.ROOT_URLCONF

解決策は、view関数に渡されるself.urlsオブジェクトにrequestの値をアタッチすることです。Client.pyこの修正を実装し、を使用して1100以上のテストを実行した後、問題は発生していません-n8

client.py(との独自のコピーがすでにある場合は、現在のurlconf機構を削除し、代わりにClientを通過して、ClientHandlerが呼び出す前に接続できるようtestcases.pyにするのは比較的簡単です(〜14 loc)。)_pre_setupself.urlsrequestself.get_response()

于 2012-07-22T18:34:43.470 に答える
1

あなたが使用しているデフォルトのテスト データベースは、一度に N 個のテスト プロセスで使用できるように保存されているのだろうか

于 2012-06-23T14:27:52.767 に答える
1

py.test -n8呼び出しは 8 つのサブプロセスを開始します。self.client(...)8 つの django サーバーを起動して、それぞれが使用する固定のデフォルト ポートを介してアクセスすることに問題があるのでしょうか。

更新: また、pytest-django プラグインをインストールして、.djangoでのテストの実行に役立つかどうかを確認することもできます-n 8

于 2012-06-11T13:55:33.037 に答える