いしぐめも

プログラミングとかしたことを書きます。

Personiumのインテグレーションテストの単体実行

最近国産OSSであるところのPersoniumのコードを書いているんですが、
メインのリポジトリに含めるまでもない雑多な内容をここに供養したいと思います。
(わかんなくなったらググって解決できるように、という意味も込めて)

本記事の内容は 2021年3月8日現在 の状態における内容です。

Personium Coreのインテグレーションテスト

Personiumは基本的に、データベースにElasticSearch、メッセージキューにActiveMQ、ロック機構にmemcachedを使用した構成になっています。

昔はそういったミドルウェアを直接開発環境に導入してテストしていたようですが、ここをDockerを使って上げられるようにしておくことで、複数バージョンでのテストや新規開発環境のセットアップが楽になります。

Dockerで上げる手順についてはゆくゆくメインのリポジトリに含めようと思いますし、公式の personium-docker リポジトリに含まれている内容がほぼすべてですので、ここでは言及しません。

github.com

インテグレーションテストの単体実行

Personiumでは maven の failsafe プラグインを使用してインテグレーションテストを行っています。

failsafe での単体実行は -Dit.test=<実行したいクラス> という形でオプションに指定すれば基本的にOKですが、

mvn integration-test -Dit.test=io.example.SomeTestClass

という形式だと、surefire を使用したユニットテストが実行されてからの実行となり、
ユニットテスト自体が重いPersoniumでこれをやってしまうと非常に時間がかかります。

そこで、

mvn test-compile failsafe:integration-test -Dit.test=io.example.SomeTestClass

とすることで、テストコードのコンパイルと failsafe の integration-test 実行だけに限定することができます。

(他のメンバはどうやっているのか知りませんが、私はこうやっています)

テストデータ作成

テスト環境の構築についてはDockerを使用することで簡単に上げたり落としたりできる、ということは書きましたが、
Personiumは系(Unit)の複雑な内部状態(Cell, Boxなど)を前提として書かれているテストクラスなどもあり、
当該テストクラスの実行にあたっては系の状態を整える必要があります。

(各テストクラスでそれぞれ必要な前提を記述すべきなのかもしれませんが)、
Personiumではこの系のセットアップをまとめて1つのテストクラスとしてこれを実装しています。

personium-core/Setup.java at develop · personium/personium-core · GitHub

コードを読んでみると

/**
 * テスト環境構築. テストで共通で使用するセル等を作成する。すでに環境があったら削除してから作成するので環境をリセットするときにも利用する。
 * 単独でJUnitのテストとして起動して使ってください。
 */
@Test
public void reset() {
    LockManager.deleteAllLocks();
    for (Config conf : confs) {
        this.delete(conf);
        this.create(conf);
    }
}

親切! そして pom.xml を見ると

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.0.0-M4</version>
    <!-- 略 -->
    <executions>
        <!-- 略 -->
        <execution>
            <id>reset-data</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>integration-test</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/setup/Setup.java</include>
                </includes>
                <test>Setup#reset</test>
            </configuration>
        </execution>
        <!-- 略 -->
    </executions>
</plugin>

とあります。

というわけで、以下のコマンドでテストデータを作成することができます。(めちゃくちゃ時間かかります)

mvn test-compile failsafe:integration-test@reset-data

終わりに

こんな感じに pom.xml に便利なコマンドを記載しておけるんですね。なるほど勉強になりました!