BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース よくテストし、開発を成功させよう:偉大なJava単体テストフレームワークの議論

よくテストし、開発を成功させよう:偉大なJava単体テストフレームワークの議論

原文(投稿日:2016/06/20)へのリンク

Redditの最近の投稿で、Jakub Dziworsk氏ブログの投稿で投稿された中心テーマ、“JUnitの何が間違っているのか?”に関してJUnitSpockテストフレームワークのサポータの間で論争の火花が散った。いろいろなGitHubリポジトリにはJUnitで構築されたユニットテストが含まれているように見受けられるが、JUnitは15年近く存在するソフトウェアであり特に驚きはない。対してSpockは少しずつ牙城を崩しているところである。

JUnitはエクストリームプログラミングの考案者であるKent Beck氏と、Design Patterns: Elements of Reusable Object-Oriented Software の共著者であるErich Gamma氏 によって作成され、ユニットテストにおいてすぐにデファクトスタンダードとなり、ほとんど全てのプログラミング言語に移植・複製された。しかし、JUnitの機能はTestNGやSpockのような新しいテストフレームワークの登場により近年疑問が持たれている。

TestNG

TestNGはNext Generation Java Testing: TestNG and Advanced Topicsの共著者であるCédric Beust氏により2004年に作成された。TestNGのWebサイトによれば、“TestNGはJUnitとNUnitに刺激を受けたテストフレームワークであるが、よりパワフルで簡単に使用できるいくつかの新機能を導入しています…”となっている。Cédric氏は“私はこの記事この記事で書いたいくつかのJUnitの欠陥による不満を解消するためにTestNGの開発を始めました”と記している。

Spock

彼のブログの投稿で、Dziworski氏はJUnitと第三者のモックフレームワークを合わせて使うことに対して疑問を呈している。彼は“中規模・大規模のプロジェクトでJavaとそれらのフレームワークを合わせてテストを書いたり読んだりするのは大変です”と述べている。彼はさらに“もしテストを書くのが大変であれば、普通はつらい作業であると考えテストを書くのを怠るようになります。テストの回避もしくは延期はアプリケーションがもはや信用できない可能性がある状態を生み出します。そうすると何かの突発的な原因でアプリケーションの他の部分が破壊される恐れがあるため、どんな変更も恐れるようになってしまいます”と記している。

最近のJava Hellenic User Groupの会議で、Java Testing with Spockの著者であるKostis Kapelonis氏は発表を行い、JUnitとSpockの比較を行った。

Spockは Gradleware主席研究員であるPeter Niederwieser氏により2008年に作成された。JUnitに着想を得たものではあるが、Spockの機能は単なるJUnitの拡張に留まらない。

  • テストはGroovyで記載され、Javaで記載されたコードをテストすることができる

  • 第三者のフレームワークをインポートする必要にがないように組み込みのモックフレームワークを備える

  • テストにカスタマイズされた名称をつける機能を持つ

  • テストを構築するための既定の振る舞い駆動ブロック(given:, when:, then:, expect:, など)を持つ

  • データテーブルの使用によりデータ構造を使用する必要がない

下記のコードスニペット(Redditの投稿による)は機能のいくつかをデモしている。

1 class Math extends Specification {
2     def "maximum of two numbers"(int a, int b, int c) {
3         expect:
4         Math.max(a, b) == c

5         where:
6         a | b | c
7         1 | 3 | 3   // passes
8         7 | 4 | 4   // fails
9         0 | 0 | 0   // passes
   }
}

この単純なテスト例は二つの既定のブロックを用いている。expect:(3行目)とwhere:(5行目)である。where:ブロックはデータテーブルを定義するために使用され、4行目で定義されたMath.max関数の期待値をマッピングしている。2行目はテストにカスタマイズされた名称を付ける方法を示している。

JUnitとSpockのコード例を示すプロジェクトの全体はGitHubで見ることができる。

2008年に遡ると、InfoQはJUnitの死に関する考察を行っている。その8年後である現在、JUnit 5はいまだ健在であり、現在マイルストーン1の開発をが行われている最中である。よくテストし、開発を成功させよう!

Rate this Article

Relevance
Style

この記事に星をつける

おすすめ度
スタイル

BT