JUnitには、データベースのデータをテストする「DbUnit」や、Webページをテストする「HtmlUnit」などテスト機能を拡張するさまざまなライブラリがあります。
TestNGには、これらに対応するライブラリはありませんが、こうしたライブラリとTestNGを連携させて利用できます。ここではTestNGとDbUnitを連携させる方法を解説します。
では、TestNGとDbUnitを連携させてDBのテーブルに初期データを登録するサンプルを次に示します。
import java.io.File; import org.dbunit.JdbcDatabaseTester; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.operation.DatabaseOperation; import org.testng.annotations.BeforeSuite; public class DbUnitSample { private JdbcDatabaseTester tester; @BeforeSuite public void init() throws Exception { tester = new JdbcDatabaseTester("ドライバクラス名", "接続URL", "ユーザー名", "パスワード"); IDatabaseConnection connection = tester.getConnection(); IDataSet dataSet = new FlatXmlDataSet( new File("初期データのファイルへのパス")); try { DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet); } finally { connection.close(); } } }
特に複雑なことをする必要はなく、テストクラスのメソッドでDbUnitのクラスを利用します。サンプルではinit()メソッドがセットアップ処理をするメソッドです。@BeforeSuiteアノテーションを付けています。そのためあらゆるテストの前にinit()メソッドを実行します。処理としてはDBに接続し、ファイルに記述した初期データをDBに登録します。
このように、JUnitを拡張する既存のライブラリをTestNGから利用できるため、ライブラリと連携させてTestNG自体がカバーしていない分野のテストを作成できます。
話は変わりますが、筆者はTestNGとDbUnitをより簡単に連携させるオープンソースライブラリ「DbUnitNG」を開発しています。
ライブラリの名前は「DbUnit+TestNG」からきています。サンプルで示したセットアップ処理やテスト実行後のクリーンアップ処理をアノテーションで設定できることが大きな特徴です。期待値ファイルの内容とテスト対象メソッドの実行結果を簡単に比較するユーティリティメソッドもあります。ライセンスはApache License、Version 2.0なので、気軽に利用できます。興味のある方は、ぜひのぞいてみてください!
TestNGはテストを実行すると、テスト結果のレポートをHTML形式で出力します。
テストを実行すると、TestNGはtest-outputディレクトリを自動的に作成し、レポートをそのディレクトリに出力します。test-outputディレクトリにあるindex.htmlをWebブラウザで開きます。
成功、失敗、スキップしたテストメソッドの数が分かります。Suiteの列にあるリンクを押すと、テスト実行に関するさまざまな情報を閲覧できます。例えば、実行したテストメソッドの前後処理やスレッドを一覧で見ることができます。
プロジェクトでは、前述のAntでのテスト実行と組み合わせて、テスト実行用にマシンを用意し最低でも1日1回すべてのテストを実行します。
夜間に自動的にテストを実行させるようにすれば、時間のかかるテストも実行できます。そして朝、エンジニアは出社してまずテスト結果のレポートを確認します。テストが失敗していれば、プログラムを修正します。こうすることで、バグを早期に発見し後工程で修正するよりも低いコストでバグを修正できます。
本連載では、TestNGのさまざまな機能を紹介しました。しかし、「プロジェクトにおいてTestNGやJUnitといったテスティングフレームワークをなかなか実際に導入できない」という声をエンジニアから聞きます。そこで最後に、実現場でのプロジェクトにテスティングフレームワークをうまく導入するためのヒントを述べます。
テスティングフレームワークには多くの利点があります。そのため、どうしても「すべてのプログラムにテストを作ろう」と気負いがちです。テストの作成にはそれなりの工数が掛かります。
さらに、対象のプログラムを大きく変更した際には同時にテストを修正する必要があります。「テストが多いほどメンテナンスにも工数が掛かる」ということです。筆者の経験でも、「テストのメンテナンスに大きく工数が掛かったため修正し切れずテストが形がい化してしまい、テストプログラムを廃止した」というプロジェクトもありました。
しかし、まったくテストプログラムを作成しないというのも極端な考え方です。例えば、機能の中心となる部分やさまざまな処理から利用される部分だけテストを作成するということでも構いません。
テストプログラムを作成する一番のメリットは「フィードバックを速く得られる」ことです。プログラムを作成した後すぐにテストも作成して実行することで、そのプログラムに対するフィードバックをすぐに得られます。
テストが失敗しても、作成してから時間がたっていないので、エンジニアはそのプログラムについて記憶が残っており、動作させた範囲も狭いため修正する時間が短く済みます。関連するプログラムを変更したときに影響があるか心配な場合もテストを実行することでフィードバックを得られます。速いフィードバックが作業効率を高めます。
プロジェクトにテスティングフレームワークを導入するときは、「小さく始め」ます。まず特定の部分だけに対してテストを作成して、テストプログラムのメリットとトレードオフを実感してみてください。そうした経験を踏まえて次のプロジェクトではテストプログラムの作成対象とする範囲を広げていくのがよい方法と考えます。
本連載は今回が最後です。TestNGの豊富な機能を利用してテストを作成し、テストによってフィードバックを速く得ることでプロジェクト全体の開発効率を向上できます。本連載がTestNG導入の一助になればと思います。最後までお付き合いいただきありがとうございました。
Copyright © ITmedia, Inc. All Rights Reserved.