web-dev-qa-db-ja.com

Redisとの統合テスト

Jedisライブラリの助けを借りて、プロジェクトでRedisを使い始めました。すべて正常に機能していますが、継続的インテグレーションで回避したい機能テストでRedisを起動する必要があるという問題があります。これを行うための最良の方法は何ですか?

14
Derek Organ

機能/統合テストのオプションは次のとおりです。

  1. CIサーバーでredisのインスタンスを起動するだけです。すべてのテストは、実行後に適切なクリーンアップを行う責任があります。
  2. 何らかの方法でredisプロセスを制御してみてください。つまり、テストの実行前/実行後に開始/停止するシェルスクリプトまたはジョブをCIサーバーに配置します。セットアップ/クリーンアップの負担の少なくとも一部はテストから削除されます。独立したビルドごとに、独立したredisセットアップがあります。
  3. Cassandraについて言及したようなメモリ内ソリューション(存在する場合)を使用して、redisをさらに制御します。

言及すべきことの1つは、統合テストが単体テストに取って代わるべきではないということです。単体テストがおそらく好まれるべきであり、より多くのケースをカバーできますが、統合テストは、アプリケーションのすべての部分がうまく連携していることを確認するためだけに使用できます。そして、これが多くの人々がオプションナンバーワンを選ぶ理由だと思います。

これは同様の質問です mongodbについて 答えには2番目のオプションで機能するプロジェクトへのリンクがあります(mongodbプロセスを制御します)プロジェクトページのいくつかの関連リンクをたどると、 と呼ばれるものもありますnosql-unit 。これはオプション3をカバーしようとしていると思います。私はそれを使用しませんでしたが、 redis にも何かがあるようです。

8
efan

Java用の単純なredis埋め込みランナーを実装しました: https://github.com/kstyrc/embedded-redis

現在、redis 2.6.14 for * nixおよび https://github.com/MSOpenTech/redis forWindowsを使用しています。ただし、RedisServerクラスを利用して、独自の実行スクリプトを実行できます。

RedisConf(bind、slaveof、port、dbfilenameなど)をサポートするように実装を拡張する予定です。この後、mvndepsのclojarにjarをアップロードします。

17
kstyrc

nosql-unit を試してください。 Javaでのredisユニットテストをサポートします。

EmbeddedRedisを試しましたが、多くのJedisインターフェースがサポートされていないことがわかりました。したがって、特に「パイプライン」などの高度なredis関数を使用している場合は、EmbbededRedisを使用することはお勧めできません。

単体テストにはManagedRedisを使用することをお勧めします。

  1. redis.io からredisソースコードをテストリソースにダウンロードします
  2. $(your-redis-dir)/ srcにredis-serverをビルドします
  3. managedRedisを使用して単体テストを記述します。これは です。 「REDIS_HOME」はredisコードがダウンロードされたディレクトリであることに注意してください。ManagedRedisは$ {REDIS_HOME}/srcにredis-serverを見つけます。
  4. ユニットテストを実行します。
1
eleforest

コマンドラインredis-server --port 7777を使用して、任意のポートでRedisサーバーを起動できます。したがって、統合テストの目的で、使用可能な(またはランダムな)ポートでRedisを開始し、Jedisがそのポートを使用するように構成されていることを確認できます。

このようにして、同時に発生する他のテスト実行を含め、他のプロセスと競合しないことがわかっているRedisの「新しい」インスタンスを取得します。これは、統合テストのためにインメモリ/組み込みデータベースを実行するのと同じように考えることができます。

「正規化されたデータ」をRedisにプリロードするには、--dbfilename <file>スイッチ:redis-server --port 7777 --dbfilename test.rdbを使用します。

1
Jimothy

これと同じ問題を処理するためのより良い方法は、RedisTemplateを処理するSpringサービスを作成することでした。その後、@MockBeanを使用してサービスをモックし、テスト中に実行されているRedisインスタンスの欠如を抽象化します。

例ごと:

@Service
class RedisService {

    @Autowired
    private RedisTemplate<String, SomeClass> redisTemplate;

    SomeClass get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

}

そして統合テストでは:

class IntegrationTest {

    @MockBean
    private RedisService redisService;

    @Before
    public void setup() {
        SomeClass someClass= new SomeClass();
        when(redisService.get(anyString())).thenReturn(someClass);
    }


}

実際の代替手段がSpringチームによって「公式に」推奨されていないことを理解しているため、redisメモリデータベースソリューションを使用することに懐疑的です。

0
Dherik

@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
0
erhun