1. 概要

Apache Cassandra は、強力なオープンソースのNoSQL分散データベースです。 前のチュートリアルでは、CassandraおよびJavaの操作方法の基本をいくつか見てきました。

このチュートリアルでは、前のチュートリアルに基づいて、CassandraUnitを使用して信頼性の高い自己完結型の単体テストを作成する方法を学習します。

まず、CassandraUnitの最新バージョンをセットアップして構成する方法を見ていきます。 次に、実行中の外部データベースサーバーに依存しない単体テストを作成する方法のいくつかの例を検討します。

また、Cassandraを本番環境で実行している場合は、独自のサーバーの実行と保守の複雑さを確実に排除し、代わりにAstraデータベースを使用できます。 ApacheCassandra上に構築されたクラウドベースのデータベース。

2. 依存関係

もちろん、ApacheCassandra用の標準のDatastaxJavaドライバーpom.xmlに追加する必要があります。

<dependency>
    <groupId>com.datastax.oss</groupId>
    <artifactId>java-driver-core</artifactId>
    <version>4.13.0</version>
</dependency>

組み込みデータベースサーバーでコードをテストするには、cassandra-unit依存関係もpom.xmlに追加する必要があります。

<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit</artifactId>
    <version>4.3.1.0</version>
    <scope>test</scope>
</dependency>

必要な依存関係がすべて構成されたので、単体テストの作成を開始できます。

3. 入門

このチュートリアル全体を通して、テストの焦点は、単純なCQLスクリプトを介して制御する単純な人物テーブルになります。

CREATE TABLE person(
    id varchar,
    name varchar,
    PRIMARY KEY(id));

INSERT INTO person(id, name) values('1234','Eugen');
INSERT INTO person(id, name) values('5678','Michael');

これから説明するように、CassandraUnitには、テストの作成に役立ついくつかのバリエーションがありますが、それらの中心には、繰り返し続けるいくつかの簡単な概念があります。

  • まず、JVM内でメモリ内で実行される組み込みCassandraサーバーを起動します。
  • 次に、実行中の埋め込みインスタンスに個人データセットをロードします。
  • 最後に、簡単なクエリを起動して、データが正しく読み込まれたことを確認します。

このセクションを締めくくるには、テストについて簡単に説明します。 一般に、クリーンなユニットまたは統合テストを作成するときは、制御できない可能性がある、または突然動作を停止する可能性がある外部サービスに依存するべきではありません。 。 これは、テスト結果に悪影響を与える可能性があります。

同様に、外部サービス(この場合は実行中のCassandraデータベース)に依存している場合、テストから希望する方法でセットアップ、制御、および破棄できない可能性があります。

4. ネイティブアプローチを使用したテスト

まず、CassandraUnitに付属しているネイティブAPIの使用方法を見てみましょう。 まず、ユニットテストとテストセットアップを定義します。

public class NativeEmbeddedCassandraUnitTest {

    private CqlSession session;

    @Before
    public void setUp() throws Exception {
        EmbeddedCassandraServerHelper.startEmbeddedCassandra();
        session = EmbeddedCassandraServerHelper.getSession();
        new CQLDataLoader(session).load(new ClassPathCQLDataSet("people.cql", "people"));
    }
}

テストセットアップの重要な部分を見ていきましょう。 まず、組み込みのCassandraサーバーを起動することから始めます。 このために必要なのは、startEmbeddedCassandra()メソッドを呼び出すことだけです。

これにより、固定ポート9142を使用してデータベースサーバーが起動します。

11:13:36.754 [pool-2-thread-1] INFO  o.apache.cassandra.transport.Server
  - Starting listening for CQL clients on localhost/127.0.0.1:9142 (unencrypted)...

ランダムに利用可能なポートを使用する場合は、提供されているCassandraYAML構成ファイルを使用できます。

EmbeddedCassandraServerHelper
  .startEmbeddedCassandra(EmbeddedCassandraServerHelper.CASSANDRA_RNDPORT_YML_FILE);

同様に、サーバーの起動時に独自のYAML構成ファイルを渡すこともできます。 もちろん、このファイルはクラスパスにある必要があります。

次に、people.cqlデータセットをデータベースにロードします。 このために、データセットの場所とオプションのキースペース名を取得するClassPathCQLDataSetクラスを使用します。

いくつかのデータをロードし、組み込みサーバーが稼働しているので、先に進んで簡単な単体テストを作成できます。

@Test
public void givenEmbeddedCassandraInstance_whenStarted_thenQuerySuccess() throws Exception {
    ResultSet result = session.execute("select * from person WHERE id=1234");
    assertThat(result.iterator().next().getString("name"), is("Eugen"));
}

ご覧のとおり、簡単なクエリを実行すると、テストが正しく機能していることが確認されます。 素晴らしい! メモリ内のCassandraデータベースを使用して、自己完結型の独立した単体テストを作成する方法ができました。

最後に、テストを破棄するときに、埋め込まれたインスタンスをクリーンアップします。

@After
public void tearDown() throws Exception {
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
}

これを実行すると、システムキースペースを除くすべての既存のキースペースが削除されます。

5. CassandraUnitAbstractJUnitテストケースを使用したテスト

前のセクションで見た例を単純化するために、CassandraUnitは抽象テストケースクラス AbstractCassandraUnit4CQLTestCase、を提供します。これは、前に見たセットアップと破棄を処理します。

public class AbstractTestCaseWithEmbeddedCassandraUnitTest
  extends AbstractCassandraUnit4CQLTestCase {

    @Override
    public CQLDataSet getDataSet() {
        return new ClassPathCQLDataSet("people.cql", "people");
    }

    @Test
    public void givenEmbeddedCassandraInstance_whenStarted_thenQuerySuccess()
      throws Exception {
        ResultSet result = this.getSession().execute("select * from person WHERE id=1234");
        assertThat(result.iterator().next().getString("name"), is("Eugen"));
    }
}

今回は、 AbstractCassandraUnit4CQLTestCase クラスを拡張することで、ロードする CQLDataSetを返すgetDataSet()メソッドをオーバーライドするだけです。

もう1つの微妙な違いは、テストから、 getSession()を呼び出してCassandraJavaドライバーにアクセスする必要があることです。

6. CassandraCQLUnitJUnitルールを使用したテスト

テストでAbstractCassandraUnit4CQLTestCaseを強制的に拡張したくない場合は、幸い、CassandraUnitは標準のJUnitルールも提供します。

public class JUnitRuleWithEmbeddedCassandraUnitTest {

    @Rule
    public CassandraCQLUnit cassandra = new CassandraCQLUnit(new ClassPathCQLDataSet("people.cql", "people"));

    @Test
    public void givenEmbeddedCassandraInstance_whenStarted_thenQuerySuccess() throws Exception {
        ResultSet result = cassandra.session.execute("select * from person WHERE id=5678");
        assertThat(result.iterator().next().getString("name"), is("Michael"));
    }
}

テストでCassandraCQLUnitフィールドを宣言するだけです。これは、標準のJUnit @Ruleです。 このルールは、Cassandraサーバーのライフサイクルを準備および管理します。

7. 春の作業

通常、プロジェクトではCassandraとSpringを統合します。 幸い、CassandraUnitは、SpringTestContextFrameworkの操作もサポートしています。

このサポートを利用するには、 cassandra-unit-springMaven依存関係をプロジェクトに追加する必要があります。

<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit-spring</artifactId>
    <version>4.3.1.0</version>
    <scope>test</scope>
</dependency>

これで、テストから使用できる多数のアノテーションとクラスにアクセスできるようになりました。 先に進んで、最も基本的なSpring構成を使用するテストを作成しましょう。

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ CassandraUnitTestExecutionListener.class })
@CassandraDataSet(value = "people.cql", keyspace = "people")
@EmbeddedCassandra
public class SpringWithEmbeddedCassandraUnitTest {

    @Test
    public void givenEmbeddedCassandraInstance_whenStarted_thenQuerySuccess() throws Exception {
        CqlSession session = EmbeddedCassandraServerHelper.getSession();

        ResultSet result = session.execute("select * from person WHERE id=1234");
        assertThat(result.iterator().next().getString("name"), is("Eugen"));
    }
}

テストの重要な部分を見ていきましょう。 まず、テストクラスを2つのかなり標準的なSpring関連の注釈で装飾することから始めます。

  • @RunWith(Spring JUnit4ClassRunner.class)アノテーションにより、テストにSpringの TestContextManager が埋め込まれ、Springにアクセスできるようになります。 ]ApplicationContext。
  • また、 CassandraUnitTestExecutionListener、と呼ばれるカスタム TestExecutionListener、を指定します。これは、サーバーの起動と停止、および他のCassandraUnitアノテーションの検索を担当します。

ここに重要な部分があります。 @EmbeddedCassandraアノテーションを使用して、埋め込まれたCassandraサーバーのインスタンスをテストに挿入します。 さらに、組み込みデータベースサーバーをさらに構成するために使用できるいくつかのプロパティがあります。

  • configuration –別のCassandra構成ファイル
  • clusterName –クラスターの名前
  • host –クラスターのホスト
  • port –クラスターが使用するポート

ここでは物事を単純に保ち、宣言からこれらのプロパティを省略してデフォルト値を選択しました。

パズルの最後のピースとして、 @CassandraDataSet アノテーションを使用して、以前に見たものと同じCQLデータセットをロードします。 以前と同じように、データベースの内容が正しいことを確認するためのクエリを送信できます。

8. 結論

この記事では、CassandraUnitを使用して、ApacheCassandraの組み込みインスタンスを使用してスタンドアロンの単体テストを作成する方法をいくつか学びました。 また、単体テストからSpringを使用する方法についても説明しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。