SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

JUnitフレームワークによるJava ME単体テスト

J2MEUnit/JMUnitを利用した単体テストの方法

ダウンロード Conversion 1.0 (264.7 KB)
ダウンロード Conversion 1.1 (117.5 KB)

J2MEUnitでの作業

J2MEUnitのセットアップ

 JMUnitの代替フレームワークがJ2MEUnitです。こちらもSourceForgeを通じてダウンロードできます。JMUnitと違って、J2MEUnitのバージョンは1つしかないので、.jarファイルも1つだけです。現在のリリースは1.1.1です。

J2MEUnitのテストケース

 J2MEUnitのテストケースはj2meunit.framework.TestMethodから継承しなければなりません。JMUnitと同様、それぞれのテストをテストメソッドで実装し、「test」+「テスト対象メソッドの名前」という形式の名前を付けます。JMUnitと異なり、テストメソッドで例外をスローする必要はありません。

 J2MEUnitはJMUnitほど多くのアサートメソッドをサポートしていません。J2MEUnitがサポートしているアサーションは次のものだけです。

assertTrue(expression)
assertSame(expected, actual)
assertEquals(expected, actual)
assertNotEquals(expected, actual)
assertNull(object)

 また、これらのメソッドはJMUnitのようにオーバーロードされません。例として、JMUnitのassertEqualsメソッド(CLDC 1.0とCLDC 1.1の両バージョン)とJ2MEUnitのassertEqualsメソッドにおける、期待される型と実際の型を表1に示します。このようなメソッドはかなりの数になります。CLDC 1.1の新しい浮動小数点型を使用するアプリケーションでは特にそうです。

表1
  JMUnit assertEquals(CLDC 1.0) JMUnit assertEquals(CLDC 1.1) J2MEUnit assertEquals
期待される値/結果の値 Object Object Object
型サポート String String long
boolean boolean  
byte byte  
char char  
int double  
long float  
short int  
  long  
  short  

 アサーションメソッドが少ないことを別にすれば、J2MEUnitのテストケースメソッドはJMUnitのテストケースメソッドとそれほど違いません。DistanceConverstionTestのテストメソッドの例をリスト1に示します。スローされる例外がないこと以外、メソッドの内容は同じです。

リスト1 DistanceConverstionTestのテストメソッドの例
public void testfeetToMeters() {
    System.out.println("feetToMeters");
    int result = DistanceConversion.feetToMeters(25);
    assertEquals(7, result);
}
 
public void testmetersToFeet() {
    System.out.println("metersToFeet");
    int result = DistanceConversion.metersToFeet(5);
    assertEquals(16, result);
}
 
public void testmilesToKM() {
    System.out.println("milesToKM");
    com.white.DistanceConversion instance = null;
    int result = DistanceConversion.milesToKM(26);
    assertEquals(42, result);
}
 
public void testkmToMiles() {
    System.out.println("kmToMiles");
    int result = DistanceConversion.kmToMiles(2);
    assertEquals(1, result);
}
 
public void testLongerThan() {
    System.out.println("longerThan");
    assertTrue(500F < (DistanceConversion.kmToMiles(1) * 5280));
}

 JUnitおよびJMUnitと同様、J2MEUnitにもテストケースでオーバーライドできるsetupteardownfailメソッドがあります。

J2MEUnit TestSuite

 J2MEUnitでテストスイートを作成および実行する方法は、JMUnitとかなり違っています。J2MEUnitのテストスイートの方が、通常のJUnitのテストスイートを連想させるものです(ただし、リフレクションはありません)。

 J2MEUnitのテストスイートを作成するには、通常、テストケースクラス内にsuite()メソッドを作成します。これはJUnitと緊密に関連していますが、J2MEUnitでは、このsuiteメソッドをインスタンスメソッドにすることができます(通常のJUnitでは静的メソッドです)。suiteメソッドはj2meunit.framework.TestSuiteのインスタンスを返します。このオブジェクトには、期待されるすべてのテストケースのすべてのテストメソッドが含まれています。

 テストケースのためのテストメソッドをスイートに追加するのは、やや複雑そうに見えるかもしれません。スイートにテストメソッドを追加する最善の方法は、j2meunit.framework.TestMethodのインスタンスを作成して使用することです。TestMethodは実際にはインタフェースであり、実装クラスによって単一のrun(TestCase)メソッドを提供することが要求されます。TestMethodは一般に匿名インナークラスで実装されます。testfeetToMetersのスイートにTestMethodを追加する方法を以下に示します。

public Test suite() {
    TestSuite suite=new TestSuite();
    suite.addTest(new DistanceConverstionTest(
        "testfeetToMeters",
        new TestMethod() {
            public void run(TestCase tc) {
                ((DistanceConverstionTest) tc).testfeetToMeters();
            }
        }
    ));
    return suite;
}

 もちろん、DistanceConversionTestの他のメソッドも同様にスイートに追加する必要があります。suiteメソッドは、テストケースコンストラクタの作成も必要とします。

public DistanceConverstionTest(String testName, TestMethod testMethod) {
    super(testName, testMethod);
}

J2MEUnitテストの実行

 J2MEUnitのテストケースは、JMUnitと違ってMIDletのサブクラスではありません。ただし、J2MEUnitにはTestRunnerの2つの実装があり、これによってテストを実行することができます。j2meunit.textui.TestRunnerは、通常のJUnitのTestRunnerの考え方に対応するものです。j2meunit.textui.TestRunnerは、コマンドライン環境からのみ実行できます。したがって、もう一方のTestRunner実装を使用するほうが、J2MEUnitのテストを実行する方法として好ましいでしょう。j2meunit.midletui.TestRunnerは、あなたが拡張するMIDletです。MIDletとして、j2meunit.midletui.TestRunnerはエミュレータ(または実際のデバイス)で実行されます。

 各自のTestRunner MIDletクラスで行うべきコーディングは、startApp()メソッドをオーバーライドすることだけです。startAppメソッドの中で、テストクラスの名前が含まれている文字列の配列を指定して、TestRunnerのstartメソッドを呼び出してください。

public class ConversionTestRunnerMIDlet extends TestRunner {

    protected void startApp() {
        start(new String[]
            {"com.white.tests.j2meunit.DistanceConversionTest",
            "com.white.tests.j2meunit.TemperatureConversionTest"});
    }

}

 また、J2MEUnitでは、テストケースをMIDletに渡し、JADファイルまたはJARのマニフェストファイルでJ2MEUnitTestClassesプロパティを設定して、TestRunnerを直接実行することもできます。このとき、J2MEUnitTestClassesプロパティには、テストケースクラスのリストが含まれていなければなりません。

 TestRunner MIDletは、JMUnitのような派手なグラフィックの結果を提供しませんが(図4を参照)、失敗に関しては(図5を参照)JMUnitと違ってエミュレータで情報を提供します。

図4 成功したテストスイートの実行: J2MEUnitによる出力はJMUnitほど派手ではないが、開発者にとって有用な情報を提供することに変わりはない。最初の画面には実行の状態が表示され、2番目の画面には最終結果が表示される
図4 成功したテストスイートの実行: J2MEUnitによる出力はJMUnitほど派手ではないが、開発者にとって有用な情報を提供することに変わりはない。最初の画面には実行の状態が表示され、2番目の画面には最終結果が表示される
図5 失敗したテストケース: J2MEUnitでは、失敗したテストや期待されていた値など、失敗に関するさらに詳しい情報が表示される
図5 失敗したテストケース: J2MEUnitでは、失敗したテストや期待されていた値など、失敗に関するさらに詳しい情報が表示される

 JMUnitと同様、結果のコンソールウィンドウで、テストに関するさらに詳しい情報(失敗については特に)を見ることができます(図6を参照)。

図6 コンソール出力: J2MEUnitのテストケースを実行すると、JMUnitと同様に(失敗のケースでは特に)さらに詳しい情報がコンソールウィンドウに表示される
図6 コンソール出力: J2MEUnitのテストケースを実行すると、JMUnitと同様に(失敗のケースでは特に)さらに詳しい情報がコンソールウィンドウに表示される

NetBeansの統合

 JMUnitとJ2MEUnitは、ほとんどすべてのJava ME開発環境やSunのWireless Took KitなどのIDEで使用できますが、あるIDEで、これらのMicro Edition単体テストツールを合体したものが近いうちにリリースされます。NetBeans 5.5/NetBeans Mobility Pack 5.5に、これらのツールの両方が付属する予定です。実のところ、NetBeansはどんなJ2MEプロジェクトクラスのJMUnit CLDC 1.0テストでも自動的に生成してくれます。Mobileプロジェクトの任意のクラスを右クリックし、[Tools]メニューオプションからJUnitテストクラスの生成を選択するだけよいのです(図7を参照)。

図7 JMUnitのテストケースクラスを生成する: NetBeans Mobility Pack 5.5には、モバイルアプリケーションクラスのためのJMUnit CLDC 1.0のテストケースクラスを作成する単純なメニューオプションがある
図7 JMUnitのテストケースクラスを生成する: NetBeans Mobility Pack 5.5には、モバイルアプリケーションクラスのためのJMUnit CLDC 1.0のテストケースクラスを作成する単純なメニューオプションがある

 NetBeansは、デフォルトではJMUnit CLDC 1.0テストケースを生成します。プロジェクトのプロパティダイアログウィンドウを使用してJMUnit CLDC 1.1またはJ2MEUnitのライブラリをプロジェクトに追加し、それから手動で任意の型のテストクラスとMIDletテストケースランナーを手動で作成できます(図8を参照)。

図8 プロジェクトにライブラリを追加する: NetBeans Mobility Pack 5.5には、モバイルアプリケーションクラスのためのJMUnit CLDC 1.0のテストケースクラスを作成する単純なメニューオプションがある
図8 プロジェクトにライブラリを追加する: NetBeans Mobility Pack 5.5には、モバイルアプリケーションクラスのためのJMUnit CLDC 1.0のテストケースクラスを作成する単純なメニューオプションがある

 JMUnit CLDC 1.1またはJ2MEUnitのライブラリをNetBeans 5.5のモバイルプロジェクトに追加するには、プロジェクトを右クリックし、[Properties]を選択します。次に表示されるウィンドウで、図のように[Build]の下層にある[Libraries & Resources]を選択し、それから[Add Library]ボタンをクリックして、目的のプロジェクトで使用する他のJUnitライブラリを選択します。

 NetBeansプロジェクトチームのメンバによると、NetBeans 5.5とNetBeans Mobility Pack 5.5は10月の終わり頃にリリースされる予定だそうです(執筆当時)。両方のQ-ビルドリリース(およびJava ME単体テストフレームワーク)がここから入手できます。

 本稿のダウンロードサンプルには、本稿で紹介したすべてのクラスに加え、新しいNetBeans IDEにすばやく簡単に導入できるNetBeans 5.5プロジェクトも含まれています。「Conversion 1.0」は、CLDC 1.0バージョンのコード例と、JMUnit CLDC 1.0およびJ2MEUnitのテストケースが含まれているプロジェクトです。「Conversion 1.1」は、CLDC 1.1バージョンのコード例と、JMUnit CLDC 1.1のテストケースが含まれているプロジェクトです。

Java ME単体テストの将来は明るい

 自分のJava Micro Editionアプリケーションの品質が悪いのは適切な単体テストツールがないせいだ、という言い訳はもう通用しません。JMUnitとJ2MEUnit(そして予定されている両者の合体版)は、Micro Edition開発者に有益な品質保証支援を提供します。

 この2つのフレームワークはいくつかの点で異なっています。両者の相違点の多くは、大部分の開発者が使用するAPIの実装の詳細部分にあります。JMUnitの方がアサーション群が豊富で、実装がやや簡単かもしれません。それに対し、J2MEUnitはスイートレベルでの見た目と動作が通常のJUnitに似ていると言えるでしょう。どちらも素晴らしい機能を備えているので、そうした機能は合体した製品でも存続してほしいものです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Jim White(Jim White)

Intertech Trainingのインストラクタ。『Java 2 Micro Edition』(Manning刊)の共著者でもある。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/709 2008/08/26 14:07

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー