Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]Java、Eclipse、JUnitに関連した技術情報のブログです。ユニットテストスポンサードリンククラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。今回からは「JUnit」も利用して行きますので、まずは、「JUnit」のザクザクっとした説明をさせていただき、その後にメソッドの説明との流れとなります。本エントリーの内容は以下のようになります。「JUnit」とは、Javaでユニット(単体)テストを実装するためのオープンソースのフレームワークです。「JUnit」は、大別すると以下の2つの機能から成り立っています。Javaで作成したロジックに対するユニットテストを実装するためのAPI実装したユニットテストを実行し、その結果を表示するテストランナーJava超入門では、既にEclipseの環境を構築済みですので、JUnitも利用できる状態にあります。JUnitで簡単なテストを実装してみる細かい説明をするよりも、実際にJUnitを使いながら、利用方法を説明させていただいた方が分かりやすいと思います。Taiyakiのテストの作成方法パッケージ・エクスプローラーでTaiyaki.javaを選択し、右クリックメニューを表示します。表示されたメニューの[新規]>[junitテスト・ケース]をクリックします。新規JUnitテスト・ケースの作成画面が表示されました。この画面では以下の項目が指定可能です。テストケースが格納されるソースフォルダパッケージテストクラスの名前スーパークラステスト元クラス(テスト対象クラス)メソッド・スタブコメントテスト元クラス選択状態で本画面が表示された場合には、必要な項目はデフォルトがセットされています。名前はテスト元クラス+”Test”がデフォルトとなります。メソッド・スタブのsetUpBeforeClass、tearDownAfterClass、Setup、TearDownは後ほど説明しますので、全てチェックし、「次へ>」ボタンをクリックしてください。画面は以下のようになります。この画面では、テスト元クラスとスーパークラスのテスト可能なメソッドが一覧表示されています。テスト可能とは、前回説明させていただいたアクセス識別子に依存します。Taiyakiにはprivateなswimメソッドが存在していますが、この一覧には表示されていません。結局テスト可能なのは2つのコンストラクタだけですので、この2つをチェックして、「完了」ボタンをクリックしてください。最後に、利用しているプロジェクトがJUnitのjarファイルを参照していない場合は、以下の画面が表示されますので「OK」ボタンをクリッックしてください。これでTaiyakiTest.javaが作成されました。{fail("まだ実装されていません");}}JUnitで指定可能なアノテーションファイルの説明の前にアノテーションの説明をさせていただきます。アノテーションとは、「あるデータに対して関連する情報(メタデータ)を注釈として付与すること」を意味します。クラス、変数、メソッドに付与することができます。簡単に言い換えると、「これがテストメソッドだよ」、「これがテスト実行前に実行されるメソッドだよ」みたいな物です。現実世界では付箋が一番近いと思います。付箋に「これがテストメソッドだよ!」と書いてメソッドに貼る。JUnitで利用可能なアノテーションは以下の通りです。説明するほどの内容は無いので、System.out.printlnで各メソッドの説明を出力するようにしました。TaiyakiTestでは、@Testアノテーションが付与されているのは、testTaiyakiInt、testTaiyakiの両メソッドだけです。これは、先ほどテストの作成時に選択した、テスト可能な2つのコンストラクタに対応しています。testTaiyakiIntがintを引数にもつコンストラクタ、testTaiyakiが引数なしのコンストラクタのテストメソッドです。@BeforeClassなので全てのテストメソッド実行前に実行される。@AfterClassなので全てのテストメソッド実行後に実行される。@Beforeなのでテストメソッド実行前に実行される。@Afterなのでテストメソッド実行後に実行される。@Testなのでテストメソッドとして実行される。@Testなのでテストメソッドとして実行される。@BeforeClassなので全てのテストメソッド実行前に実行される。@AfterClassなので全てのテストメソッド実行後に実行される。@Beforeなのでテストメソッド実行前に実行される。@Afterなのでテストメソッド実行後に実行される。@Testなのでテストメソッドとして実行される。@Testなのでテストメソッドとして実行される。");fail("まだ実装されていません");}}これでまだ説明できていないのは、36行目と42行目のfail(“まだ実装されていません”);だけですね。これは「JUnit」のAPIで、テストを失敗させたいときに呼び出すメソッドです。えーーー!、failメソッドなんて何処にもないぞ!!、と思われるとおもいます。org.junit.Assert.*;に秘密があります。スタティックインポートを行うと、インポートしたクラスのメソッドがメソッド名だけで呼び出せるようになります。引数の文字列はテスト失敗時に表示されます。実際にテストを実行するところでどのように表示されるか、注目してみてください。Taiyakiのテストの実装TaiyakiTestは作成できましたが、先ほど説明させていただいた通り、まだテストのテンプレートが作成されただけです。・試しにテストを実行してみるテスト実行のイメージをつかんでいただくためにテストを実行してみます。エディタのTaiyakiTestを選択後に右クリックメニューを表示し、[実行]>[JUnitテストケース]をクリックしてください。結果は以下のようになりました。testTaiyakiIntとtestTaiyakiが両方とも失敗しています。failを呼び出しているのだからまあ当然です。実装されていませんと表示されています。テスト失敗時に表示するように指定した文字列ですね!・テストを実装してみる。Taiyakiのint型のname1の値をコンストラクタで設定し、その値が正しい値かどうかを「JUnit」のassertEqualsを利用して検証するようにしてみます。引数なしコンストラクタは、100をname1にセットする。動作が正しいとの前提でテストを書き直してみました。@Testなのでテストメソッドとして実行される。@Testなのでテストメソッドとして実行される。//デフォルトコンストラクタではname1に100をセットするはず。@Testなのでテストメソッドとして実行される。@Testなのでテストメソッドとして実行される。Taiyaki();//デフォルトコンストラクタではname1に100をセットするはず。taiyaki.name1);}再度テストを実行してみます。左上の画面にテストランナーが表示されていると思いますので一番上の行を選んで、右クリックメニューを表示し[実行]をクリックしてください。実行できましたが、testTaiyakiもtestTaiyakiIntも失敗しました。Taiyakiは何も変更していないので当然です。testTaiyaki選択時の画面です。・テストが成功するようにTaiyakiを修正する。2つのコンストラクタを修正しました。100;}再度テストを実行してみます。やりました!、オールグリーンです。メソッドの説明メソッドの説明が終われば、いよいよクラスに関する基礎知識の説明は終わりです。メソッドの定義方法メソッドの定義方法は以下の通りです。{メソッドの処理}仮引数は必要な数だけ定義します。仮引数が無しでもOKです。これが基本パターンですが、可変長引数という物もあります。戻り値には、void(戻り値無し)、プリミティブ型、任意のクラス等が指定可能です。メソッドに付与可能な修飾子メソッドに付与可能な修飾子は以下の通りです。メソッド定義、利用時の注意点メソッドを定義、利用する上での注意点は以下の2点です。スタティック修飾子が付与されたメソッドは、付与されないメソッドと動作が異なる。メソッドのプリミティブ型の仮引数は、メソッド内で値を変更しても呼び出しには反映されない。・スタティック修飾子が付与されたメソッドの特徴スタティック修飾子が付与されたメソッドはスタティックメソッドと呼ばれます。スタティック修飾子が付与されないメソッドはインスタンスメソッドと呼ばれます。スタティックメソッドからは、インスタンス変数にはアクセスできません。スタティックメソッドからアクセスできるのはクラス変数だけとなります。逆にインスタンスメソッドからはクラス変数とインスタンス変数の両方にアクセスできますが、マルチスレッド環境で、複数スレッドがクラス変数を変更する場合は、スレッドセーフではなくなるので考慮が必要です。Taiyakiにスタティックメソッドのjumpを追加しました。中身が空なのでコンパイルエラーは発生していません。{}jumpメソッドからインスタンス変数のname1にアクセスするコードを追加してみます。100;}予想通りコンパイルエラーが発生しました。name1をstatic参照できないとのエラーメッセージです。クラス変数にアクセスするように変更してみます。100l;}予想通りコンパイルエラーが無くなりました。この説明で理解できない方も、スタティックメソッドの呼び出し方の説明を読んでいただければ理解できると思います。・メソッドのプリミティブ型の仮引数は、メソッド内で値を変更しても呼び出しには反映されない。実際に動かして確認してみます。Taiyakiに以下のメソッドを追加しました。仮引数のargValueを受け取り、argValueをインクリメント(+1)するだけです。{argValue++;}funcSampleをTaiyakiCreatorから呼び出してみます。77;taiyaki.funcSample(intValue);}}追加した内容は7行目でint型のローカル変数intValueを宣言し、値に77をセット8行目でtaiyakiインスタンスのfuncSampleメソッドをintValueを引数に指定して呼び出しとなります。8行目にブレークポイントを追加後にデバッグ実行を行って、実際にどうなるか確認します。ブレークポイントの追加を以下の画像を見て行ってください。以下の画像の様に青い丸が表示されればOKです。デバッグ実行を開始します。パッケジ・エクスプローラーでTaiyakiCreatorを選択後に右クリックメニューを表示後に、[デバッグ]>[Javaアプリケーション]をクリックします。パースペクティブの切り替え確認画面が表示された場合は「はい」をクリックします。デバッグが開始しました。この時点でintValueは77であることが変数ビューから分かります。funcSampleにステップ・インするために以下の画像の赤枠のボタンをクリックしてください。funcSampleにステップインできました。この時点でもargValueは77です。次は行を進めたいので、ステップ・オーバーです。一行進み、インクリメント処理が終わってargValueは78になりました。次はfuncSampleからTaiyakiCreatorに戻りたいのでステップ・リターンです。TaiyakiCreatorに戻ってきました。intValueは77のままです。説明と画面を連ねましたが、プリミティブ型の引数は、メソッド内で値を変えても、メソッド呼び出し元の値は変わりません。引数の値はメソッド呼び出し時に作成された一時的な値でしかないので注意してください。逆に、参照型の変数は、メソッド内での処理結果がメソッド呼び出し元にも反映されます。先ほどから説明させていだていている通り、メソッドにはスタティックメソッドとインスタンスメソッドがあります。スタティクメソッドの呼び出し方法クラス.スタティックメソッド形式で呼び出します。(引数は省略しています)実際にTaiyakiクラスのjumpメソッドをTaiyakiTestクラスに新しいテストメソッド:testJumpを追加して呼び出してみます。Taiyakiクラスのクラスメンバname2はlong型なので初期値は0lです。jumpメソッドメソッド実行後のname2の値も検証してみました。Taiyaki.name2);}実行結果の画面は以下の通りです。testJumpメソッドを見ていただいて分かる通りですが、このコードにはTaiyakiクラスしか出現しません。インスタンスが介在しないので、必然的にjump()メソッドからはインスタンス変数にアクセスはできません。testJumpメソッドは以下のように書き換えることも可能です。アクセスする必要がありますとの警告はされますが。Taiyaki.name2);}この呼び出しが可能なのは、インスタンスに対するクラスが一意(実際は継承があるのでそうでもない)に決まるので、taiyaki.jump()と書いているけど、Taiyaki.jump()と間違えてるんだろ?みたいにコンパイラが警告を出すだけで、このコードを許容しているだけですので、スタティックメソッドがインスタンスメンバにアクセスできる理由にはなりません。とどめに、複数インスタンスからjumpメソッドを呼び出して値を確認してみます。結局はTaiyaki.jump()が3回呼ばれたことと同じですね。呼び出したいメソッドを持つインスタンス.呼び出したいメソッドの形式で呼び出します(引数は省略しています)戻り値が存在するメソッドの例は今まで取り扱っておりませんので、戻り値で行きます。Taiyakiクラスにrunメソッドを追加しました。引数のminutesを受け取り、minutes*50を返す意味不明なメソッドです。50;}TaiyakiTestクラスにテストメソッドのtestRunを追加してrunメソッドを呼び出してみました。actualValue);}もちろんテストも成功しました。今度は、スタティックメソッドと同じように複数インスタンスを作成してrunメソッドを呼び出してみます。思ったのですが、runメソッドがメンバ変数を変更していないので、確認しても意味ないですので、まずはrunメソッドでnum1(インスタンス)とnum2(スタティック)を変更します、これでnum1とnum2の違いも鮮明になると思います。name1;}testRunメソッドを以下のように変更しました。//この呼び出しでname2=500となる。Taiyaki();//taiyaki1.runメソッドに10を渡して呼び出して、結果をactualValueに格納//この呼び出しでname2=500となる。Taiyaki.name2);}testJumpが失敗するようになりますので、testRunだけ実行した結果は以下の通りです。メソッドの説明とは関係ないですが、クラス変数のname2は、taiyaki1.run(10)呼び出し時に500増加しtaiyaki2.run(50)呼び出し時に2500増加していることがこのテストが成功することから見て取れます。JUnit入門その2[Eclipse4.4のJUnitプラグインのasse記事を読むEclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。記事を読むJUnit入門その8[Eclipse4.4のJUnitプラグインのテストケースのカバレッジをEclEmmaを利用して測定してみる]今回は「EclEmma」を使って、テストのカバレッジの測定を行うエントリーとなります。コメントをキャンセルメールアドレスが公開されることはありません。eclipseとJUnitで確認する。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]Java、Eclipse、JUnitに関連した技術情報のブログです。