Jedis ライブラリの助けを借りて、プロジェクトで Redis の使用を開始しました。すべて正常に動作していますが、機能テストで Redis を起動する必要があるという問題があり、継続的インテグレーションで回避したいと考えています。これを行う最善の方法は何ですか?
6 に答える
Java 用の単純な redis 組み込みランナーを実装しました: https://github.com/kstyrc/embedded-redis
現在、* nix には redis 2.6.14 を、Windows にはhttps://github.com/MSOpenTech/redisを使用しています。ただし、RedisServer クラスを利用して、独自の実行スクリプトを実行できます。
RedisConf (bind、slaveof、port、dbfilename など) をサポートするように実装を拡張する予定です。この後、jar を mvn deps の clojars にアップロードします。
機能/統合テストに使用できるいくつかのオプションを次に示します。
- CI サーバーで redis のインスタンスを起動するだけです。すべてのテストは、実行後に適切なクリーンアップを行う責任があります。
- なんらかの方法で redis プロセスを制御してみてください。つまり、CI サーバーにシェル スクリプトまたはジョブを配置して、テストの実行前/実行後に開始/停止します。独立したビルドごとに独立した redis セットアップがあるため、セットアップ/クリーンアップの負担の少なくとも一部がテストから取り除かれます。
- カサンドラについて言及したようなメモリ内ソリューションを使用して、redisをさらに制御します(存在する場合)。
言及すべきことの 1 つは、統合テストが単体テストに取って代わるべきではないということです。単体テストはおそらく優先されるべきであり、より多くのケースをカバーできますが、統合テストは、アプリケーションのすべての部分がうまく連携して動作することを確認するためだけに使用できます。これが、多くの人がオプション 1 を選択する理由だと思います。
これはmongodbに関する同様の質問です。答えには、2番目のオプションで機能するプロジェクトへのリンクがあります(mongodbプロセスを制御します)。プロジェクトページの関連リンクをたどると、nosql-unitと呼ばれるものもあります。これは、オプション 3 をカバーしようとしていると思います。私はそれを使用しませんでしたが、redisにも何かがあるようです。
コマンドラインを使用して、任意のポートで Redis サーバーを起動できますredis-server --port 7777
。したがって、統合テストの目的で、使用可能な (またはランダムな) ポートで Redis を開始し、Jedis がそのポートを使用するように構成されていることを確認します。
このようにして、同時に発生する他のテスト実行を含め、他のプロセスと競合しないことがわかっている Redis の「新鮮な」インスタンスを取得します。これは、統合テストのためにメモリ内/組み込みデータベースを実行するのと同じように考えることができます。
「既定のデータ」を使用して Redis をプリロードするには、--dbfilename <file>
スイッチを使用しますredis-server --port 7777 --dbfilename test.rdb
。
nosql-unit を試してください。Java を使用した redis 単体テストをサポートしています。
EmbeddedRedis を試してみたところ、多くの Jedis インターフェースがサポートされていないことがわかりました。したがって、特に「パイプライン」などの高度な redis 関数を使用している場合は、EmbbededRedis を使用することはお勧めできません。
単体テストには ManagedRedis を使用することをお勧めします。
@ksytrcが彼の回答で述べたように、私は基本的に彼のソリューションを使用しました。このプロジェクトで動作していました。embedded-redis 依存関係を追加するだけです。
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
<scope>test</scope>
</dependency>
次に、テストクラスで redisServer を定義します
RedisServer redisServer;
@Before
public void setUp() throws IOException {
redisServer = new RedisServer();
redisServer.start();
}
また、以下の資格情報で定義application.yml
します。
spring:
redis:
host: localhost
port: 6379