*

JUnit入門その1[Eclipse4.4のJUnitプラグインの基本的な使い方]

公開日: : 最終更新日:2017/08/28 Eclipse, Java, JUnit ,


スポンサードリンク



利用する環境の作成につきましては、「Eclipseの使い方(Windows環境のEclipse4.3)」の「JDK8とEclipseのインストール」をご覧ください。

本エントリーの内容は以下の通りです。

  1. JUnitとは
  2. JUnitプラグインの機能説明
  3. JUnitプラグインの基本的な使い方

 

1 JUnitとは

JUnitとは、Javaで開発されたプログラムにおいてユニット(単体)テストの自動化を行うためのフレームワークと、
関連するツール群の総称です。

JUnitの目的とする理念は以下の通りです。

  1. 一度作成すればすばやくテストが実行可能である。
  2. ユニットテストが成功することで、既存機能が正常に動作していることを担保でき、バグ訂正が容易となる。
  3. テストコードを見れば仕様が一目瞭然となる。
  4. 誰でも同じテスト(ユニット)を行えるようになる。
  5. 修正毎に、独自のテストコードによるテスト作成、もしくはデバッガを使った手作業のテストの手間を省ける。

 

とはいえ、現実はそんなに簡単にはいかないです。例えば4番目の項目、テストの再現性ですが結構難しいんですよね、
Aさんが実行したら成功するのに、Bさんが実行したら失敗するや、マルチスレッドの考慮不足で、特定マシンでは成功するが、他のマシンでは失敗する等いろいろ考慮しないといけない点はあります。

JUnit standalone runner

テストクラスやテストスイートを指定して、スタンドアローンで動作するツールです。
日本にアジャイルや「JUnit」のユニットテストが導入され始めたころはスタンドアローン版を利用する事が一般的でした。

今日では、Eclipseをインストールすると「JUnit」が利用できますので、敢えてスタンドアローン版を利用することは無くなりました。

Javaコードに対するテストフレームワークとしてのJUnit

「Jenkins」や「Apache Continuum」のような継続的インテグレーションツールでも「JUnit」のフレームワークを利用してテストの自動化がはかられています。

継続的インテグレーションツールを簡単に説明すると、昼休みが12:00から始まる会社であれば、12:10分ぐらいから
GitやSubversionのようなソース管理システムからソースコードをチェックアウトし、コンパイル、ユニットテストの実行を行うような仕組みを提供する物です。

定期的に、アプリケーション自体のソースコードのコンパイルが通るか、ユニットテストは大丈夫か等を検証してくれるので、問題点の発覚を早くし、傷口が小さい時点で気付かせてくれることに大きな意義があります。

EclipseのJUnitプラグイン

昔のEclipseはJUnitプラグインが標準ではインストールされていませんでしたので、各自でインストールする必要がありましたが、
Eclipse 4.3 Standardには「JUnit4.11」が標準ではインストールされています。
どのバージョンからそうなのかは不明ですが、「JUnit」と言えばEclipseのJUnitプラグインを指している可能性がかなり高いです。

EclipseのJUnitプラグインにつきましては、詳細な説明を後述させていただきます。

2 JUnitプラグインの機能説明

JUnit4からはアノテーションを利用してテストクラス等の認識をJUnitが行うようになりました。
今回は、アノテーションとテストケースの作成メソッドのうち、必要最低限の物を説明させていただきます。

JUnit4で利用するアノテーション

JUnit4.11で利用可能なアノテーションは結構多くありますが、本エントリーでは基本的なアノテーションのみ説明いたします。

基本的なアノテーション

基本的なアノテーションは以下の通りです。ほぼこのアノテーションだけでテストを作成できます。

アノテーション 説明
@BeforeClass テストクラスのstaticイニシャライザの後に呼ばれる。
@Before テストクラスのコンストラクタの後に呼ばれる。
@Test テストメソッドに付与
@After テストメソッド実行後に実行したいメソッドに付与
@AfterClass テストクラス実行後に実行したいメソッドに付与



本エントリーは、EclipseのJUnitプラグインの入門的な内容を取り扱います。
 

基本的なアノテーションの実行順序

基本的なアノテーションの実行順序を以下の図に示します。
といってもファイナライザはGCの管理するところなので、呼ばれない時の方が多いです。
スクリーンショット 2014-06-23 11.12.13

テストケースの作成用メソッド

Eclipseからテストクラスを作成すると、作成したクラスに

の記述が追加されます。これによってorg.junit.Assertクラスのメソッドを自クラスのメソッドのように呼び出せます。

org.junit.Assertクラスの基本的なメソッドは以下の通りです。
具体的な利用方法は「3 JUnitプラグインの基本的な使い方」で説明させていただきます。
なおassertThatメソッドにつきましては、「JUnit入門その2[EclipseのJUnitプラグインのassertThat(org.hamcrest.CoreMatchers)の使い方]」をご参照ください。

メソッド 説明
assertEquals(Object expected, Object actual) expectedtとactualが同じ値の場合は成功、異なる場合は失敗する。
assertEquals(String message, Object expected, Object actual) expectedtとactualが同じ値の場合は成功、異なる場合は失敗し、messageが表示される。
assertSame(Object expected, Object actual) expectedtとactualが同じオブジェクトを参照している場合は成功、異なる場合は失敗する。
assertSame(String message, Object expected, Object actual) expectedtとactualが同じオブジェクトを参照している場合は成功、異なる場合は失敗し、messageが表示される。
fail() テストを失敗させたい時に利用する。
fail(message) テストを失敗させたい時に利用する。失敗した時はmessageが表示される。
assertTrue(boolean) 値がtrueの場合は成功、falseの場合派失敗する。
assertTrue(String message, boolean) 値がtrueの場合は成功、falseの場合派失敗し、messageが表示される。
@Test(expected=Exception.class) テストメソッドではないが、テストを実行すると任意の例外が発生することを期待する情報を@Testアノテーションに記載する。

 

3 JUnitプラグインの基本的な使い方

検証用のプロジェクト作成、テストクラスの作成、アノテーションの動作確認、テストケースの作成
との順番で基本的な使い方を説明させていただきます。

検証用のプロジェクト作成

Eclipseのメニューの[新規]>[Javaプロジェクト]をクリックします。
01Javaプロジェクトの新規作成.

表示された画面で、プロジェクト名に「JUnitSample」と入力し「完了」ボタンをクリックします。
02Javaプロジェクトの新規作成

Javaプロジェクトが作成されました。
51無題

テストクラスの作成

テストクラスの新規作成方法は何種類か方法がありますが、今回は一番シンプルな方法で行きます。
Eclipseのメニューの[新規]>[JUnit テスト・ケース]をクリックします。
52無題

表示された画面で、名前に「TestSample」と入力し「完了」ボタンをクリックします。
53無題

次に、JUnitライブラリの追加確認画面が表示されますので、何も変更せずに「OK」ボタンをクリックしてください。
54無題

JUnit テスト・ケースが作成されました。
アノテーションで説明させていただいたアノテーションが付与されていますね。

各アノテーションの動作確認

各アノテーションの動作する順番を確認するために

  • TestSampleのコンストラクタ
  • staticイニシャライザ
  • インスタンスイニシャライザ
  • ファイナライザ
  • 各メソッド、イニシャライザを識別するためのSystem.out.printlnの出力を追加

を追加しました、あともう1つ、テストメソッドの名前をtestSample1に変更しました。

変更後のコードは以下のようになりました。

いよいよテストの実行です。テストの実行方法も何通りかあるのですが、
「パッケージ・エクスプローラー」で「TestSample.java」を選択後に、右クリックメニューの[実行]>[1 JUnit Test()]をクリックします。
55無題

テストが実行され、コンソールには以下のような結果が表示されました。

うん、予想どうりです。ってfinalize callが出力されてません。
まあファイナライザはGCに制御されているので出力されない方が多いので正しい結果です。

テストメソッドが単一だったので、いまいちな検証です。
もう1つテストメソッドを追加して実行してみます。
追加したテストは以下のとおりです。

再度テストを実行しました。今度はコンソールには以下のように表示されました。

今度はいい感じの結果が得られました。
アノテーションを付与されたメソッドの動作タイミング、インスタンスの生成タイミング、テストの実行タイミングが理解できました。
というか、予想通りですが・・・

簡単なテストを実装

テスト対象のクラスとしてPersonクラスを作成します。
PersonにはwalkとrunとgetNameメソッドが存在します。
(これから作るのですが・・・)
コンストラクタはPerson(int perMinWalk, int perMinRun, String name)とします。

テストファーストで行きます。
testSample1メソッド内に

のコードを追加します。
56無題

当然ですが、エラーとなります。
Eclipseのエラー修正機能でPersonクラスを定義します。

以下の画像の赤枠部分をクリックします。
56無題

画面表示は以下のように変化しますので、赤枠部分の「クラス’Person’を作成します」をダブルクリックします。

57無題
すると、Javaクラスの作成ウイザードが開始しますので、何も変更せずに完了ボタンをクリックします。
58無題

空っぽのPersonクラスが作成されました。ぜんぜんエラーの修正になっとらん!
と思いつつ、本来作成してほしかったPersonクラスのコンストラクタを実装します。

コンストラクタだけ実装したPersonクラスは以下のようになりました。

当然ですが、this.perMinWalk、this.perMinRun、this.nameが存在しないとのコンパイルエラーが出力されています。

今度こそEclipseのエラー修正機能で、これらのインスタンス変数を作成してもらいましょう!

以下の画像の赤枠部分をクリックし
59無題

「Person型のフィールド’perMinWalk’を作成します」をクリックします。
60無題

予測どおりに以下のコードが追加されました。
private int perMinWalk;

他の2つも同じように操作した結果、Personクラスは以下のようになりました。

残りはwalk、run、getNameメソッドですなのですが、長くなってきたのでwalkだけ実装します。
walkは引数のmin×perMinWalkをリターンするメソッドです。

testSample1メソッドでインスタンス化したpersonに対してwalkメソッドを呼び出し
その結果をassertEqualsの第二引数にセットします。
第一引数は2×walkメソッドの引数とします。

testSample1メソッドは以下のようになりました。

またまたpersonにwalkメソッドがないと言われますので、エラー修正機能でwalkメソッドを作成します。
以下の画像の赤枠部分のwalkメソッドを作成するをクリックします。
61無題

生成されたwalkメソッドを以下のように修正します。

これでtestSample1は成功するはずです。実際にtestSample1だけを実行してみます。
testSample1を選択し右クリックメニューの[実行]>[1 JUnit Test]をクリックします。

testSample1だけ実行されました。
63無題

テストも成功しています。

成功する例だけでは面白くないですので、testSample2メソッドは失敗するようにします。
assertEqualsもメッセージを指定できるメソッドを利用するようにしています。

testSample2を実行してみました。
当然失敗しました。
64無題

スタックとレースの1行目は以下の通りです。
java.lang.AssertionError: person.walkがおかしいよ! expected: but was:

person.walk(100)の結果は200のところを、わざと500に変えているので納得できる結果ですね。
assertEqualsに指定したメッセージも出力されることが確認できました。

例外発生を期待するテスト

最後に、例外が発生することを期待するテストケースを追加&実行確認をして終わりにしたいと思います。

testSample3テストメソッドを追加し、Personのrunメソッドが常にArithmeticExceptionをスローするようにし
person.runがArithmeticExceptionをスローした時にテストが成功するようにします。

Personのrunメソッドは以下のとおりです。

testSample3をとりあえず以下のようにして、テストを実行してみます。

予想どうりテストはjava.lang.ArithmeticExceptionで失敗しました。
65無題

testSample3を以下のように修正しました。

personのrunメソッドを呼び出した時のArithmeticExceptionをキャッチし成功
もしArithmeticExceptionが飛んでこなければ、次行で失敗するようにfail(String message)メソッドの呼び出しを追加しています。

実行してみたところ、成功しました。
66無題

まあこの方法でも良いのですが、もっときれいな方法があります。
それは、@Testアノテーションにスローされる例外のクラスを記述する方法です。
testSample3を以下のように修正しました。ポイントは@Test(expected=ArithmeticException.class)です。

実行してみたところ、成功しました。
こちらの方がtestSample3メソッドのテスト項目が明確になるといえます。

 

「JUnit入門その1[EclipseのJUnitプラグインの基本的な使い方]」は以上です。


スポンサードリンク



関連記事

Java8の新機能について

オラクルは2014年3月18日(日本時間3月19日早朝)に「Java 8」を正式に公開しました。

記事を読む

JUnit入門その8[Eclipse4.4のJUnitプラグインのテストケースのカバレッジをEclEmmaを利用して測定してみる]

今回は「EclEmma」を使って、テストのカバレッジの測定を行うエントリーとなります。 「djUn

記事を読む

「HyperSQL」の環境を作成し、Eclipseの「DBViewer」プラグインを利用してSQLを発行してみる

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・パス上に必要なプロジェクト/プロジェクト参照の追加]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上の「ビルド・パス上に必要なプロジェ

記事を読む

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思っていたのですが、ついに作成してみ

記事を読む

Java超入門 with Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]

クラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。 前回までは、Eclip

記事を読む

Mac(OS X)におけるJava8(jdk8)等のインストール、アップデート、アンインストール方法

Windowsとは異なりMac(OS X)ではJDKの管理(インストール、アンインストール)が難しい

記事を読む

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようになりました。 C#では一足早く

記事を読む

JUnit入門その9[@RunWithアノテーションを利用したテストの作成]

今回は@RunWithアノテーションを利用したテストの作成方法を説明させていただきます。 JU

記事を読む

Eclipseのインストールと日本語化とJDK8(Java8)対応[Eclipse4.4とEclipse4.3]

インストールするEclipseのバージョンですが、とりあえず4.3をターゲットとしておき、 4.4

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Spring5入門[STS(Spring Tool Suite)で簡単なWebアプリの典型的なユニットテストの実現方法]

前回は「Spring入門」で、Spring MVCを利用した簡単なWe

Spring5入門[STS(Spring Tool Suite)の環境作成と簡単なWebアプリの作成]

Struts1ももう過去の遺物になり、SAStrutsもEOLとなりも

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑