【ハウツー】

TestNG 5.0 - 早速試す@Testで簡単テスト

    後藤大地  [2006/07/20]

    Javaのここ1年をふりかえってみると、アノテーションを使ったプログラミングが普及してきたと感じる。これを象徴するようにプロダクトにTestNGがある。TestNGを使えばアノテーションを挿入するだけで単体テストを行うことが出来る。これまでのJUnitなどと比べると簡単で、デベロッパに衝撃を与えた。新バージョンのリリースにあわせ、本稿ではTestNGの使い方を紹介する。

    TestNG 5.0 登場

    The TestNG Project, Cedric Beust氏は19日(米国時間)、TestNGの最新版であるTestNG 5.0を公開した。TestNGはJava向けに開発されたFLOSSのテストフレームワークで、アノテーションをベースにしており簡単という特徴がある。

    • @Configurationは@BeforeTestおよび@BeforeSuiteなどへ統合
    • @ExpectedExceptionsはexpectedExceptions属性として@Testへ統合
    • @Testにおいてスイートと指定するsuiteName属性とテスト名を指定するtestName属性を導入
    • スタックトレース表示をより理解しやすいものへ改善
    • スイートのディレクトリごとにレポートが作成されるように変更されたほか、メインインデックスファイルでは実行されたすべてのスイートのリストが表示されるように改善

    TestNG 5.0ではEclipseといった統合開発環境における補完を考慮したり、さらに使い勝手の改善を進めてアノテーションの統廃合も進められている。よりシンプルになったという点で評価できるだろう。機能を増やすことは簡単だが、整理して削減するというのは難しい。

    @Testでテスト

    TestNGはアノテーションを使うため、Java 1.5以降を使うことが好ましい。Java 1.4でもJavaDocアノテーションを経由して使うことはできるが、TestNGのよさは半減だ。Java 1.5以降を用意しよう。

    Java 1.5でTestNG 5.0を使った簡単な例をリスト1に示す。@TestがTestNGで使われるアノテーション。メソッドの前に1行追加するだけだ。

    リスト1 HelloTestNG.java - TestNGのテストアノテーションを使っている

    import org.testng.annotations.*;

    public class HelloTestNG {
        public void doSomething() {
        }

        @Test(groups={"a"})
        public void testA() {
        }     @Test(groups={"b"})
        public void testB() {
        }
    }

    リスト2 testng.xml - どのような試験をおこなうかを記述したXMLファイル

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

    <suite name="HelloTestNG">
      <test name="alltest" >
        <groups>
         <run>
            <include name="a" />
            <include name="b" />
         </run>
        </groups>
        <classes>
         <class name="HelloTestNG" />
        </classes>
      </test>
    </suite>

    リスト2はどのような試験をおこなうのかをまとめたXMLファイルだ。試験したい内容をXMLにまとめておいて、試験項目ごとにそのXMLファイルを指定して実行すればいい。実行のしかたはいろいろあるが、TestNGだけを使って試験するならorg.testng.TestNGを使う。使い方をリスト3にまとめておく。リスト3のrun-with-optsターゲットにあるように、XMLファイルを使わずに-groups a,bのように直接オプションを指定して動作させる方法もある。

    Makefileを使う場合の例 - make(1)ではなくant(1)でもEclipse IDEでもかまわない

    # $Id: Makefile,v 1.1 2006/07/20 12:03:57 daichi Exp $

    TESTNGJAR= testng-5.0-jdk15.jar
    JAVA_HOME= /usr/local/jdk1.5.0
    CMD_JAVAC= JAVA_HOME=${JAVA_HOME} ${JAVA_HOME}/bin/javac -cp .:${TESTNGJAR}
    CMD_JAVA= JAVA_HOME=${JAVA_HOME} ${JAVA_HOME}/bin/java -cp .:${TESTNGJAR}
    RUN_TESTNG= ${CMD_JAVA} org.testng.TestNG

    TARGET_SRC= HelloTestNG.java
    TARGET_XML= testng.xml

    all: build run

    build:
    ${CMD_JAVAC} ${TARGET_SRC}

    run: run-with-xml

    run-with-xml: build
    ${RUN_TESTNG} ${TARGET_XML}

    run-with-opts: build
    ${RUN_TESTNG} -testclass ${TARGET_SRC:C/.java/.class/} -groups a,b

    testng-opts:
    ${CMD_JAVA} -jar ${TESTNGJAR}

    clean:
    rm *.class

    図1 出力されるテストレポート

    あとは実行すれば自動的に試験が実施され、結果がHTMLの状態で出力されるといったものだ。TestNGで指定できるアノテーションには@Test、@BeforeSuite、@AfterSuite、@BeforeTest、@AfterTest、@BeforeGroups、@AfterGroups、@BeforeClass、@AfterClass、@BeforeMethod、@AfterMethod、@DataProvider、@Factory、@Parametersなどがあり、@TestではalwaysRun、dataProvider、dependsOnGroups、dependsOnMethods、description、enabled、groups、invocationCount、successPercentage、suiteName、testName、timeOut、threadPoolSizeなどの属性を、@Bedore*/@After*アノテーションではalwaysRun、dependsOnGroups、dependsOnMethods、enabled、groups、inheritGroupsなどの属性を指定できる。詳しくはTestNGのドキュメントをご覧いただきたい。

    アノテーションと簡単さ

    TestNGは、JUnitは複雑すぎ使うのにイライラしすぎると、JUnitへの反立として開発されたテストフレームワークだ。これは単にJUnitが複雑になりすぎたという話としてとらえるのは軽躁だ。これはJavaの変遷を表すものとして興味深い。

    アノテーションが導入される以前のJavaで、言語的に厳密にテストフレームワークを作成しようとすれば、JUnitの道は当然たどることになる。これに対しいくつかの開発者は、その方法が言語的に正しいとしても、労力を増やすような技術は不要と考えるようになる。そのころから開発にも簡単さが求められるようになり、言語に厳密に従うのではなく制約でコードを書くなりして、作業の労力をさげ、開発を簡単にする取り組みが活発になった。

    そこでJavaにアノテーションの導入である。アノテーションで簡単さを維持しつつ、言語的な保証も加える。まさにその寵児がTestNGだ。むろん、EJB 3.0におけるアノテーションが大きな流れだが、EJB 3.0でさえ複雑過ぎるという声もあり、EJBを敬遠するデベロッパもある。広くデベロッパがアノテーションの効果を感じるプロダクトはTestNGだろう。

    もちろんJUnitも最近のTestNGの動向を取り入れている。この記事を読んでTestNGの方が優れていると考えるのはまずい。どちらも評価していただきたいが、簡単さという点においてはTestNGは折り紙つきだ。

    関連記事

    関連サイト

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン