9

RabbitMQ は Erlang で記述されているため、たとえば ActiveMQ JMS ブローカーのように JVM に埋め込むことはできません。

しかし実際には、別の言語で行われ、統合テストに簡単に組み込むことができるプロジェクトがいくつかあります。

たとえば、C++ で記述された MongoDB は、 https ://github.com/flapdoodle-oss/embedmongo.flapdoodle.de を使用して、JVM 統合テストのコンテキストで簡単に開始/停止できます。

Java に移植する人もいます: https://github.com/thiloplanz/jmockmongo/


では、私のアプリケーションが Java で書かれていて、他のテクノロジが別の言語 (RabbitMQ の Erlang など) で書かれている場合、どのように統合テストを行うことができるのでしょうか?

一般的に、良い慣行は何ですか?

主な解決策は 3 つあります。

  • 実際の RabbitMQ の開始
  • 現在使用されている言語にテクノロジの JVM ポートを埋め込む
  • 標準テクノロジを使用して、Erlang のテクノロジが Java の別のテクノロジと同じ動作と通信レイヤーを持つようにします (RabbitMQ / Qpid / AMQP を実装する StormMQ)

一時的な RabbitMQ ブローカーを起動するための Maven/Sbt/Ant プラグインはありますか? テストクラスの前に Junit/TestNG RabbitMQ をサポートするプロジェクトはありますか?

Java で AMQP のオープンソース実装があることを確認しました: Apache Qpid 本番環境 で RabbitMQ がある場合に、この実装を統合テストに使用した経験はありますか? それは可能ですか?私はSpring Integrationを使用しています。


ところで、Spring-AMQP プロジェクトの github readme で次のように言及されていることに気付きました。

ここでの「統合」テストの多くは、実行中の RabbitMQ サーバーを必要とします。ブローカーが検出されない場合はスキップされます。

4

5 に答える 5

3

私だったら、問題のスタック コンポーネントをモックすることを考えます。Java に最適なモック フレームワークは何ですか? (スタック オーバーフローに関する素晴らしい質問ではありませんが)、Mock Objectが役に立つかもしれません。

コンポーネントをモックすると、すべてを「ライブテスト」しようとするよりもテストがはるかに簡単になります(IMHO)。

于 2013-04-19T19:34:44.717 に答える
3

過去に、RabbitMQ の新規インストールが実行されている仮想マシンを使用していました。開発者はそれを常に実行し、CI サーバーはコードのリビジョンごとに新しい VM を開始します。統合テストの欠如は深刻な問題であるため、テストをスキップするのではなく、サーバーに接続できない場合、テストは失敗します。

これはかなりうまく機能する傾向があり、テストのために RabbitMQ を開始および停止する必要がなくなります。私たちのテストは分離のために vhosts を使用するように分割され、必要に応じてテストを並列化できるように、オンデマンドで vhosts を作成するためのいくつかの呼び出しが使用されました。

于 2013-04-21T16:10:46.103 に答える
2

Apache QPid と Rabbit MQ の両方で作業したので、私の意見をお伝えします。私の意見では、それらは AMQP を「拡張」しますが、大きく異なります。本番環境で Rabbit MQ を使用する場合は、テストでも同じバージョン、パッチ、修正などを使用します。Apache Qpid で実行できることと、Rabbit MQ で実行できないことがあり、その逆もあります。

アプリケーションの統合をテストできるように、明らかな統合テストが行​​われていることを述べます。Rabbit MQ のインスタンスを開始します。

于 2013-04-23T08:36:14.423 に答える