2013-12-17 15 views
8

背景: Celeryを使用して将来の特定の時間に実行されるタスクをスケジュールするプロジェクトに取り組んでいます。これらのタスクは、ファイナルステートマシンの状態を前方にプッシュします。ここに例があります:DjangoテストDBに接続するCeleryワーカーを実行します。

  • 今後のリマインダーは、2日後にユーザーに送信される予定です。それは意志、
  • は、そのスケジュールされたタスクは、電子メールが送信され、実行された場合、およびFSMは、次の状態次の状態は、このタスクを実行すると、別の2日間
  • で実行するようにリマインダーをスケジュールすることです
  • に進んでいますthis SO answer

    テストではその技術を使用しての問題が示唆したように、私は現在CELERY_ALWAYS_EAGERを使用してい

...状態

  • など進め、別の電子メールを送信し、番目です別のスレッドで実行されるタスクコードは、スケジュールされたスレッドと同じスレッドで実行されています。これにより、FSM状態が正しく保存されず、テストが困難になります。私は正確に何が原因であるのか判断できませんでしたが、現在の状態に保存しているコールスタックの一番下にあるようですが、コールスタックを返すと以前の状態が保存されます。私はおそらく、コードがどのように実行されていないときに何がうまくいかないのかを判断するのに時間を費やす可能性がありますが、コードを実行して、それが何をすべきかを確かめることはもっと論理的です。

    質問:したがって、テスト実行中にdjangoが使用できるセロリセットアップでフルを実行する方法があるかどうかを知りたいと思います。自動的に実行できるのであれば理想的かもしれませんが、手作業でテストするよりも手作業による介入でも良いでしょう。私はテストで休憩を設定し、テストDBに接続するためにセロリの労働者を実行し、djangoテストを続行する場合、何かが可能である可能性が考えています。誰もこれの前に何かを試したことがありますか?

  • +0

    私はDjangoテストランナーを使用しない単体テストを書くことになると思いますメイン(開発)データベースを使用して、手動でセットアップを行い、データを分解します。 – Andres

    +0

    はい、これはおそらく最も簡単なアプローチです。私は、固定具が実用的でない大きなDBに対してテストを実行するためにこれを行います。 – joshua

    +0

    これはあなたの問題なのかどうかは分かりませんが、Celery TasksがDjango Middlewareを経由しないため、データベース操作はトランザクションではありません。 これは本当に面白い、奇妙なデータベースの動作 – geekazoid

    答えて

    1

    あなたがしようとしているのは単体テストではなく機能/統合テストです。

    いくつかのBDDフレームワーク(Behave、Lettuce)を使用し、外部サーバー(例:ステージング環境)に対してCIサーバー(TravisCIまたはJenkins)からBDDテストを実行することをお勧めします。

    ので、プロセスは次のようになります。GitHubには

  • CIサーバは
  • CIサーバは、統合環境(またはステージングに展開単体テストを実行CIサーバ上に構築起動GitHubの
    1. プッシュ変化
    2. 、統合がない場合)
    3. CIサーバーは、デプロイされたコードに対して統合エンドツーエンドテストを実行します。
    4. すべて成功した場合、このビルドは「実稼働環境にデプロイできる」などに昇格されます
    関連する問題