Playframework2のパッケージ構成をみてみると、testパッケージがあります。
ApplicationTest.javaというソースコードがあり、この中をみてみると、
[java]
public class ApplicationTest {
@Test
public void simpleCheck() {
int a = 1 + 1;
assertThat(a).isEqualTo(2);
}
@Test
public void renderTemplate() {
Content html = views.html.index.render("Your new application is ready.");
assertThat(contentType(html)).isEqualTo("text/html");
assertThat(contentAsString(html)).contains("Your new application is ready.");
}
}
[/java]
のようになっており、実行してみると実行できるではありませんか。
普通にプログラムを組むと、モデルのテストは簡単にできても、ビューやコントローラーのテストって、かなり厳しいんじゃないでしょうか。
RequestやらSessionやら出てきたら、インターフェース作って、モック作って・・・。って、結局テストするためのコードを書いている時間がすごく長くなり、もういいやってなっちゃうこともあるんじゃないかなーと思います。
そこまでやらなくても、でもテストして実行してみたいということになると、Jettyたちあげて、アクセスしてみて結果をアサーションしてみて、ってこれはこれで結構面倒なんですよね・・・。
でも、Playframework2はそのまま実行できて、ビューのレンダリング結果が帰ってくる。いやー、びっくりしました。
結局、ブラウザでの見た目のテストも重要だと思いますが、コードレベルでのテストも、できるに越したことはないかなーと思います。
例えばですよ、表示したい要素がすべてhtmlに含まれているか?というテストを行いたいと。あー、じゃTocmatかなんか立ち上げといて、Seleniumでやればいいんじゃない?やったことある人はわかると思いますけど、結構だりぃんですよ。テストが多いと、かなり時間もかかりますからね。
Playframework2の場合は、こんな感じです。
[java]
@Test
public void testTimeline() throws Exception {
TwitterInfo ti = new TwitterInfo();
ti.screen_name = "★スクリーン名★";
ti.description = "★概要★";
List<Tweet> tweets = new ArrayList<Tweet>();
tweets.add(createTweet("★ついーと1★"));
tweets.add(createTweet("★ついーと2★"));
tweets.add(createTweet("★ついーと3★"));
ti.tweets = tweets;
Content html = views.html.timeline.render(ti);
String source = contentAsString(html);
assertThat(StringUtils.countMatches(source, "★スクリーン名★")).isEqualTo(1);
assertThat(StringUtils.countMatches(source, "★概要★")).isEqualTo(1);
}
[/java]
自分がフレームワークをあんまり触ってこなかったかもしれませんが、コンテナ動かさずにビューのテストできるなんて、カルチャーショック的なものがありました。
ただ、JenkinsなどのCIで動くかは別問題ですね。これが動いたら、すっごいな。今度試してみよう。