Webアプリ開発/テストのお供に『WAITT』

Tomcat Launcherやtomcat-maven-pluginの融通の効かなさ加減に落胆し、[waitt-maven-plugin](http://qiita.com/kawasima/items/7a41e2e6dec9d021a064)を作ったわけですが、waitt-maven-pluginもtomcat7固定で環境や用途が限定されてしまっていたので、大幅に手を入れてプラッガブルなWAITTとして生まれ変わらせました。

## WAITTとは

Webアプリケーションをローカルで動作確認したり、テスト環境用に起動したりするためのMavenプラグインです。

https://github.com/kawasima/waitt

Spring bootでなくても、特別なコードを書かなくても、IDEの有償の機能を使わなくても、Tomcat7/Tomcat8/Jetty9など選択して、Webアプリを起動することができます。jarやwarを作る必要はありません。アプリケーションのクラスパスに何か付け加える必要もありません。

それからWAITTでは、起動したサーバ/アプリケーションに対してFeatureを追加することができます。

現状では、

* カバレッジ (cobertura/JaCoCo)
* ダッシュボード
* トレーサ

の3種類のFeatureがあります。

## 設定と起動

簡単です。Webアプリプロジェクトのpomファイルに以下の行を書き加えます。

```xml
<plugin>
    <groupId>net.unit8.waitt</groupId>
    <artifactId>waitt-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <servers>
            <server>
                <groupId>net.unit8.waitt.server</groupId>
                <artifactId>waitt-tomcat8</artifactId>
                <version>0.1.0</version>
            </server>
        </servers>
    </configuration>
</plugin>
```

そして、

```shell-session
% mvn waitt:run
```

でtomcat8にWebアプリがデプロイされて起動します。warやjarを作る必要はありません。

### 複数のサーバから選択する

以下のように

```xml
<plugin>
    <groupId>net.unit8.waitt</groupId>
    <artifactId>waitt-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <servers>
            <server>
                <groupId>net.unit8.waitt.server</groupId>
                <artifactId>waitt-tomcat7</artifactId>
                <version>0.1.0</version>
            </server>
            <server>
                <groupId>net.unit8.waitt.server</groupId>
                <artifactId>waitt-tomcat8</artifactId>
                <version>0.1.0</version>
            </server>
            <server>
                <groupId>net.unit8.waitt.server</groupId>
                <artifactId>waitt-jetty9</artifactId>
                <version>0.1.0</version>
            </server>
        </servers>
    </configuration>
</plugin>
```

serversに複数サーバを登録しておくと、(インタラクティブモードの場合) 選択肢がでます。サーバを切り替えてテストするときも、いちいちpomを書き換えてあげる必要はないのです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/2f1317eb-1cd2-32df-7047-56b6d3dd932d.png)

## 便利なFeatureたち

### カバレッジ

これは旧バージョンにもあったのですが、手動のテストでもアプリケーションのコードカバレッジを取得するためのフィーチャです。標準(waitt-coverage)では、coberturaを使っていますが、Java8でまともに動作しないのでJaCoCo版(waitt-jacoco)もあります。

特にアプリケーション開発のメンテナンスフェーズにおいては、イジったところだけピンポイントでテストして、他への影響があって本番トラブルに繋がるなんてことがままあるため、コードカバレッジを見て影響範囲の確認をしながらテストをすることが重要だと考えています。

```xml
<features>
    <feature>
        <groupId>net.unit8.waitt.feature</groupId>
        <artifactId>waitt-jacoco</artifactId>
        <version>0.1.0</version>
    </feature>
</features>
```

waitt-coverage、またはwaitt-jacocoをfeatureに設定し、waitt:runし、いくつかアプリケーションを操作して、/_coverage/ にアクセスすると、以下のようなカバレッジレポートが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/449ab654-3192-31a9-ad5d-d37174ae1cea.png)

### ダッシュボード

SpringBootのアクチュエータよろしく、アプリケーションやサーバの情報を見ることができます。
ヒープダンプを表示したり、CPUとメモリのリソースグラフを表示したりできます。

waittのconfigureに以下のフィーチャを足すと使えます。adminはアプリケーションを再デプロイしたりするために必要です。

```xml
<features>
    <feature>
        <groupId>net.unit8.waitt.feature</groupId>
        <artifactId>waitt-dashboard</artifactId>
        <version>0.1.0</version>
    </feature>
    <feature>
        <groupId>net.unit8.waitt.feature</groupId>
        <artifactId>waitt-admin</artifactId>
        <version>0.1.0</version>
    </feature>
</features>
```

そして、waittを起動し、/_dashboard/にアクセスすると、色々なデータが見れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/f8ed77e7-9086-5f0f-6474-06c2919398dd.png)

サーバのモニタリングと再起動

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/5243f0fe-6f9f-d234-6496-3c777671fe70.png)

ヒープダンプ

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/ba84b52b-3afe-6abd-e80a-4919a9466f75.png)

### トレーサ

これはWAITT上でのテストの状況を収集するためのフィーチャです。

* 発生したException
* リクエストとレスポンスの内容

をElasticSearchにPOSTします。これらをKibanaで可視化できるわけです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/e06e10f0-7ff7-f79b-e248-1f84fd3afced.png)

```xml
<features>
    <feature>
        <groupId>net.unit8.waitt.feature</groupId>
        <artifactId>waitt-tracer</artifactId>
        <version>0.1.0</version>
    </feature>
</features>
```

#### 利用シーンA

何か、Aさん遅くまで残っているけど、どうしたんだろう?

たいていは、どこかでハマって試行錯誤しているものかと思います。コードいじってみて、ブラウザから動かして、何かエラーが出てるので書き直して、またブラウザから動かして… を繰り返していると、いつの間にか時間が経ってしまっている、誰かに聞こうにも詳しい人、もう帰っちゃってる、なんてことがありますよね!

tracerのフィーチャを使うと、各自のローカル環境で発生したExceptionを全部収集できます。これをKibanaでしきい値設定しておけば、ハマっている人をプロアクティブに見つけ出し、声をかけるなんてことができるわけです。

おせっかいですねー

#### 利用シーンB

エビデンス、エビデンス、エビデンス...

リクエスト、レスポンスを収集するのでテストエビデンスとして使えます。同種のツールにはHTTPプロキシを使うものもありますが、SSLの場合はMan in the middleしなきゃいけない問題があります。トレーサはサーバに組み込まれて動作するのでその心配がありません。

最終的には[イマドキのExcelスクショの撮り方](http://www.slideshare.net/kawasima/excel-40109001)でレポーティングされるようにしたいと思っています。

## まとめ

Spring bootの手軽さに垂涎していた非Spring文化圏のみなさん、WAITTを使えば似たような軽快な動作環境が得られます。ぜひお試しくださいませ。

あっ、なおSpring bootも[WAITTから起動できます](https://github.com/kawasima/waitt/tree/master/examples/spring-boot)よ :grin: