プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Eclipseプラグイン開発: 非UIプラグインのテスト

Eclipse プラグイン開発 目次


 

 Eclipse開発で1番………いや、2番ぐらい?いや、1番かな………?まぁ、それぐらい困るのがどうやってJUnitテストすれば良いのかわかりにくいこと。Eclipseのプラットフォーム(OSGi)が絡んでいなければ、個別にテストできるけど、他のプラグインを利用しているなどプラットフォームが絡んでくると、テストが出来ないと言うことになる。

 ただでさえEclipse開発なんて手探りなのに、テストのやり方が分からなくて、出来る範囲だけでやってたら、大量の未テスト項目が出来てしまって呆然としております。そんなことにならないように、皆さんは最初からテストの作り方を知っておきましょう。

 ただ、調べるといろんなやり方があるというか、私も何が正しいのか分かっていないので、現状のnodamushiのやり方を紹介するだけです。

 ちなみに、これ書いてる今もGUI操作を伴うテスト方法とか分かってないので、誰か教えて下さい。

 

Eclipseプラグインをテストするプロジェクトを別に作る

 Mavenとかでプロジェクトを作ると「src/main」と「src/test」のように一つのプロジェクトの中にテストを配置するように作られますが、Eclipseプラグインテストをする際はこれでは不都合があります。
 それは拡張ポイントのテストが出来ないことです。1つのEclipseプラグインに複数のplugin.xmlを配置することが出来ないからです。


 従って、Eclipseプラグインのテストは、本体とは別にもう一つプラグインを作る必要があります。

 ここでは例として次のようなプロジェクトのテストをしてみたいと思います。

f:id:nodamushi:20170407011351p:plain

 

 NodamushiImplは以下のような実装になっています。getPluginIDメソッドで無駄にBundleをActivatorから取得しており、バンドルが起動していないとヌルポになってしまいます。

package nodamushi.internal.core;

import nodamushi.core.INodamushi;
import nodamushi.core.NodamushiPlugin;

public class NodamushiImpl implements INodamushi{
  @Override public String getName(){
    return "nodamuchi";
  }
  @Override public String getPluginID(){
    return NodamushiPlugin.getDefault().getBundle().getSymbolicName();
  }
}

 nodamushi.coreは公開パッケージですが、nodamushi.internal.coreは他に公開したくありません。しかし、テストを別プロジェクトにしてしまう以上、これを公開しなければテスト用プロジェクトからnodamushi.internal.coreが見えません

 これを回避するために、テストプロジェクトに対して、nodamushi.internal.coreを限定的に公開すると言うことが出来ます。

f:id:nodamushi:20170407011515p:plain

 

 しかし、テスト用に作るプラグインプロジェクトは一般公開するつもりのないものです。そんなものの情報をnodamushi.coreに残しておくというのはどうも気持ちが悪いです。


 そこで、テスト用プラグインプロジェクトをnodamushi.coreプラグインのフラグメント プロジェクトnodamushi.core.testとして作ってしまいます。こうすれば、nodamushi.coreがnodamushi.core.testの存在を一切知らなくても、nodamushi.core.testはnodamushi.coreの全パッケージにアクセスすることが可能になります。


 

テストケースクラスとスイートクラスを作る

 テストケース・スイートクラスはいつもと同じようにJUnitの新規ウィザードから作成して下さい。

f:id:nodamushi:20170407011534p:plain

 

 作成しようとすると、いつものJava開発と違う画面がポップアップします。これはそのままOKを押して下さい。自動的に依存関係にJUnitを追加してくれます。


f:id:nodamushi:20170407011548p:plain

 
 

 以下の図のようにテストケースとテストスイートを作りました。
f:id:nodamushi:20170407011603p:plain

 


 中身はこんな感じです。

NodamushiImplTest.java(テストケース)

package nodamushi.internal.core;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

import org.junit.Test;

public class NodamushiImplTest{

  @Test public void getNameTest(){
    NodamushiImpl n = new NodamushiImpl();
    assertThat(n.getName(), is("nodamushi"));
  }

  @Test public void getPluginIDTest(){
    NodamushiImpl n = new NodamushiImpl();
    assertThat(n.getPluginID(), is("nodamushi.core"));
  }
}

AllTest.java(スイート)

package nodamushi.core;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

import nodamushi.internal.core.NodamushiImplTest;

@RunWith(Suite.class)
@SuiteClasses({NodamushiImplTest.class})
public class AllTests{}

テストを実行する

 では実際にテストを実行してみましょう。
 メニュー→実行→実行構成を選択して下さい。
f:id:nodamushi:20170407011724p:plain

 ウィンドウが開いたら、JUnitプラグインの項目で、新しい実行構成を新規作成します。スイートクラスを開いたままこの処理を実行すると、勝手に内容が入力されます。(入力されなかったら頑張って入力して下さい)
 

 
f:id:nodamushi:20170407011756p:plain

 


 メインタブに移動し、「アプリケーションの実行」をヘッドレス・モードにします。このヘッドレス・モードはWorkbench(GUI)を起動しないので、普通にEclipseの起動をしてテストをするよりも高速に実行が出来ます。(Workbenchがテストに必要な場合はorg.eclipse.ui.ide.workbenchを選択します)

 

f:id:nodamushi:20170407011805p:plain

 

 次に引数のタブに移動します。私のようにMargeDocで日本語化している雑魚は、VM引数でMergeDocの設定を引き継いでしまうので、削除して下さい。以上の設定が完了したら、実行を押します。

 

f:id:nodamushi:20170407011822p:plain


 


 あら、どうやらnodamushiをタイポしてnodamuchiになっていたみたいです。
 てへぺろ☆(・ω<)
f:id:nodamushi:20170407011839p:plain

 

 なお、一度作成したら、Quick JUnitを導入している場合、スイートクラス内にカーソルがある場合、Ctrl+-で同じ内容を起動できます。私は「Alt+R,T,1」(ヒストリーの通常起動)か「Alt+R,H,1」(ヒストリーのデバッグ起動)を使うことが多いですが。

 これで基本的にはGUI操作やGUIリソースを必要としないものにかんしてはテストが出来ます。