連載
» 2008年10月09日 00時00分 公開

次世代テストフレームワークでテストを変える(3):実現場でTestNGを活躍させる“5”つのテクニック (1/3)

[阪田浩一,株式会社クロノス]

 前回の記事「JUnitにはないTestNGの“5”つの強力なテスト用機能」では、JUnitにはないTestNG独自の機能を解説し、TestNGの魅力を紹介しました。

 最終回である今回は、ライブラリとの連携やAntからの利用、レポートの出力などプロジェクトで実際にTestNGを活用する際に必要となる5つのテクニックを解説します。

【1】Antからテストをサクッと実行!

 これまでテストはEclipseプラグインを使って実行しましたが、TestNGにはAntのタスクがあるため、Antからテストを実行することもできます。Antについては下記記事が参考になります。

build.xmlでTestNGのタスクを利用するには?

 AntのXMLファイルであるbuild.xmlのサンプルを次に示します。

<taskdef resource="testngtasks"
  classpath="testng-X.X-jdk15.jarへのパス" />
<path id="run.cp">
  <fileset
    dir="実行に必要なライブラリを格納したディレクトリへのパス"     includes="*.jar"/>
</path>
<target name="run-tests">
  <testng classpathref="run.cp" haltOnfailure="true">
    <classpath>
      <pathelement
        location="クラスファイルを格納したディレクトリへのパス"/>
    </classpath>
    <xmlfileset dir="XMLファイルを格納したディレクトリへのパス"       includes="testng.xml" />
  </testng>
</target>
リスト1 テストを実行するbuild.xml

 AntからTestNGのテストを実行するために、まず<taskdef>要素を使ってTestNGのタスク定義を追加します。<taskdef>要素のclasspath属性にはTestNGのJARファイルへのパスを指定します。こうすることで、XMLファイルの中で<testng>要素を使用できます。

 テスト実行に関する設定は<testng>要素に指定します。testng.xmlからテストを実行する場合、<xmlfileset>要素を使い、includes属性にTestNGの設定ファイル名を指定します。なお、設定ファイルにはクラスパスを通します。

testng.xmlを使わずにテストを実行するには?

 testng.xmlを使わず単にテストクラスを実行する場合は、<xmlfileset>要素の代わりに<classfileset>要素を使います。

<classfileset
  dir="クラスファイルを格納したディレクトリへのパス"
  includes="**/*.class" />

 上記のようにすると、ディレクトリにあるすべてのテストクラスをテストとして実行します。

テストマシンを用意して、自動でテストを実行させよう

 このようにAntを利用すると、手動ではなく自動でTestNGのテストを実行できます。

 TestNGでもJUnitでもプロジェクトにおいてテストを作成したときは、必ずテスト実行用にマシンを用意し、日々作成したすべてのテストをテストマシンで自動的に実行させます。すると、プログラムを変更した際にほかの処理に思わぬ影響を及ぼした場合でも、テストが失敗して早期に問題を発見できます。

【2】テストを並列実行してスピードアップ!

 1つのテストを実行するのであれば、実行時間は微々たるものです。しかし、プロジェクトにおいてリグレッションテスト(回帰テスト)を実施する場合など、多くのテストを一気に実行するときはどうでしょうか?

 プロジェクトが進むほどテストケースは増えるため、徐々にテスト全体が完了するまでの時間が長くなり、問題となる場合があります。

複数のスレッドでテストを実行させる

 TestNGでは、複数のスレッドを使ってテストを並列実行できます。並列に実行することで、テストスイートとしての実行時間を短縮できます。

図1 テストの並列実行 図1 テストの並列実行

 では、並列実行をサンプルで確認しましょう。まず、TestNGの設定ファイル「testng.xml」を次に示します。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="samplesuite" thread-count="2" parallel="tests">
  <test name="concurrent">
    <classes>
      <class name="net.kronosjp.enkai.testng.ConcurrentTest">
      </class>
    </classes>
  </test>
  <test name="another">
    <classes>
      <class
        name="net.kronosjp.enkai.testng.AnotherConcurrentTest">
      </class>
    </classes>
  </test>
</suite>
リスト2 並列実行する場合のtestng.xml

 並列実行する場合<suite>要素のparallel属性とthread-count属性を設定します。

並列にする「単位」を設定する

 thread-count属性に使用するスレッドの数を指定します。サンプルでは「2」を指定しました。スレッドを2つ使ってテストを実行します。

 parallel属性に「tests」と指定すると、各<test>要素に含まれるテストは同じスレッドで実行します。サンプルでは2つの<test>要素があります。

 1つはConcurrentTestクラスを含んだ<test>要素、もう1つはAnotherConcurrentTestクラスを含んだ要素です。そのためConcurrentTestクラスにあるテストメソッドはすべて同じスレッドで実行し、同様にAnotherConcurrentTestクラスにあるテストメソッドもすべて同じスレッドで実行します。

 次ページでは、実際に並列実行した結果と並列実行しない場合の時間の差を提示し、テクニックの3つ目としてJUnitのテストが資産としてある場合でもTestNGを利用できる2つの便利な機能について解説します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。