Vert.x 3.1.0 Tutorial – 2 : Hello World TEST

2015年11月8日

Vert.x applicationはJUnitとvertx-unitでunitテストが可能なので
今回は前回のHello WorldのUnitテスト手順を投稿

本家の説明はこちら
前回の記事はこちら
今回のソースはこちら

1.依存関係追加

JUnitとvertx-unitテスト用の依存関係をpom.xmlに追加

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-unit</artifactId>
    <version>3.1.0</version>
    <scope>test</scope>
</dependency>

追加後libraryを更新[Maven Project パネルより->Reimport all maven projectsを実施]

2.テストソース

以下ソースをsrc/test/java/tutorial/vertx/HelloVerticleTest.javaに生成

/**
 * Created by bhags on 15/11/08.
 */

package tutorial.vertx;
import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;

import io.vertx.core.logging.LoggerFactory;
import io.vertx.core.logging.Logger;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class HelloVerticleTest {

    private Vertx vertx;
    private final static Logger log = LoggerFactory.getLogger(HelloVerticleTest.class);
    @Before
    public void setUp(TestContext context) {
        log.info("SETUP");
        vertx = Vertx.vertx();
        vertx.deployVerticle(HelloVerticle.class.getName(),
                context.asyncAssertSuccess());
    }

    @After
    public void tearDown(TestContext context) {
        log.info("TEAR DOWN");
        vertx.close(context.asyncAssertSuccess());
    }

    @Test
    public void testMyApplication(TestContext context) {
        log.info("TEST MY APPLICATION");
        final Async async = context.async();

        vertx.createHttpClient().getNow(8080, "localhost", "/",
                response -> {
                    response.handler(body -> {
                        context.assertTrue(body.toString().contains("Hello"));
                        async.complete();
                    });
                });
    }
}

3.TEST 実行

mvn clean test

4.JUnit テスト Methods

以上でHelloVeticleの JUnit テストが無事完了した。上記のunitテストはvertx-unitを使っていてcustom runnerを利用している。vertx-unitのおかげでvert.xアプリケージョンの非同期動作を簡単にテストできるようになっている。

setUp

setup methodではvertxのインスタンスが生成される。そして、HelloVeticle verticleデプロイしてくれる。また、setUpがTestContextを引数として取っている。このオブジェクトがテストの非同期面をコントロール可能にしてくれている。例えばverticleをデプロイするとそれは非同期で実行されるためそれが正しく実行されるまでプログラム側でチェックすることはできない。そのためdeployVerticleメソッドの2番目の引数としてresult handlerを渡している。それがcontext.axyncAssertSuccess();である。これはverticleが正しく実行されなければ失敗を返す。さらにこれはverticleのstart シーケンスが終了することを待ってくれる。実際にはHelloVerticleのfut.complete()を待つのである。

tearDown

tearDownでは単純に生成されたvertx instanceを終了している。

testMyApplication

このメソッドは実際にリクエストを発行し結果をチェックしている。リクエストの発行および結果の取得はもちろん非同期である。これらを制御するためにTestContextを利用する。このオブジェクトのasync.complete()を利用することでいつテストが終わるのかを制御できる。

つまり、async handleが生成されるとgetNow()メソッドを利用してHTTPクライアントを作成し,また、テストアプリケージョンによって管理されるhttpリクエストを発行することができる(getNow() は get(…).end() のショートカット)。リクエストの結果はlambdaで管理されbodyの中にHelloがあるかを確認している。

context.assert…はエラーが発生した段階ですぐにテストを中止し、エラーを出力する。非同期のVert.xアプリケージョンでのテストは常にassertionメッソドを利用する必要がある。

Comments are closed.