22

Herokuにデプロイされているアプリがあり、ターゲット環境でデプロイ後にテストスイートを実行できるようにしたいと考えています。Heroku Postgresアドオンを使用しています。つまり、単一のデータベースにしかアクセスできません。私には新しいデータベースを作成する権限がありません。つまり、test_ *データベースを作成できないため、標準のDjangoテストコマンドが失敗します。

$ heroku run python manage.py test
Running `python manage.py test` attached to terminal... up, run.9362
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database

これを回避する方法はありますか?

4

2 に答える 2

14

私は間違っていたことがわかりました。テストしていると思っていたものをテストしていませんでした...Herokuのルーティングメッシュが別のサーバーにリクエストを送信していたため、LiveServerTestCaseは1台のマシンでWebサーバーを起動し、Seleniumは他のマシンに完全に接続していました。

HerokuProcfileを次のように更新します。

web: python src/manage.py test --liveserver=0.0.0.0:$PORT

DATABASESテストデータベースを指すように設定をオーバーライドし、以下にリンクされているテストスイートランナーをカスタマイズします(同じ考えが当てはまります:setup_databasesデータベース全体ではなく、テーブルのみをドロップ/再作成するようにオーバーライドします)、リモートで実行できましたテスト。しかし、これはさらにハッキー/痛みを伴う/不法です。まだもっと良いものを探しています!混乱してすみません。


(以下の回答を更新)

これが私のために働いたステップです:

  • Herokuツールベルトを使用して、追加の無料のPostgresデータベースを作成します

heroku addons:add heroku-postgresql:dev

  • ここにあるHerokuTestSuiteRunnerクラスを使用してください。

TEST_DATABASESこのカスタムテストランナーでは、通常の形式に従う設定を定義する必要がありDATABASESます。例えば:

TEST_DATABASES = {
    'default': dj_database_url.config(env='TEST_DATABASE_URL')
}

次に、TEST_RUNNERHerokuTestSuiteRunnerが見つかる場所へのPythonパスを設定します。

これで、指定されたデータベースを使用してHerokuでDjangoテストを実行できるようになります。これは非常に簡単なハックです...どのように改善/ハッキングを減らすことができるか教えてください。楽しみ!



(以下の元の回答)

ここでは、いくつかの関連するソリューションについて説明しましたDjangoのドキュメントで読むことができるように、「SQLiteデータベースエンジンを使用する場合、テストはデフォルトでインメモリデータベースを使用します」。

これは、Herokuで使用しているデータベースエンジンを完全にテストするものではありませんが(私はまだそれを行うソリューションを探しています)、データベースエンジンをSQLiteに設定すると、少なくともテストを実行できます。

いくつかのポインタについては、上記のリンクされたStackOverflowの質問を参照してください。少なくとも2つの方法がありif 'test' in sys.argvます。データベースエンジンとしてSQLiteを強制する前にテストするか、テストで専用の設定ファイルを使用しdjango manage.py testて、オプションの使用に渡すことができ--settingsます。

于 2013-01-17T05:42:32.723 に答える
3

バージョン1.8以降、Djangoにはkeepdbというオプションがあり、テスト中に同じデータベースを再利用できます。

--keepdbオプションを使用すると、テストの実行間でテストデータベースを保持できます。

これには、作成アクションと破棄アクションの両方をスキップできるという利点があり、特に大規模なテストスイートのテストを実行する時間を大幅に短縮できます。

テストデータベースが存在しない場合は、最初の実行時に作成され、その後の実行ごとに保持されます。

適用されていない移行は、テストスイートを実行する前にテストデータベースにも適用されます。

また、テストを実行する前にテストデータベースが存在することもできるため、dynoに新しいPostgres Herokuインスタンスを追加し、その特定のデータベースを使用するようにテストを構成するだけです。

ボーナス:最初のテストがクラッシュするとすぐに終了するフェイルファストオプションを使用することもできるため、すべてのテストが完了するのを待つ必要はありません。

ただし、Herokuに物事をデプロイしていて、 Heroku Pipelinesを使用している場合は、さらに優れたオプションであるHerokuCIを使用できます

于 2017-09-15T11:06:02.767 に答える