※注:詳細な書き方については書いてありません。
TechscoreのJUnitのページをまとめただけです。
ユニットテストの書き方についてはこちらをご参照ください(英語)
ユニットテストとは
書いたコードが求められている通りに動作することを確認するためのテスト。
単体テストとも呼ばれる。
JUnitはJavaにおけるユニットテスト用の超有名フレームワーク。
みんなが共通のフレームワークを用いてテストプログラムを書くことで、他人のテストプログラムの修正が容易になる。
テストの超基本的な流れ
1.テストするメソッドと同じ機能をもつテストメソッドを書く。
2.メソッドに求められる結果と、実際の結果をassertメソッド(下記)で比較する。
3.比較した結果相違があればテスト失敗、なければテスト成功。
セットアップ(IntelliJ使用)
https://stackoverflow.com/questions/19330832/setting-up-junit-with-intellij-idea
https://www.slideshare.net/SatoshiKubo1/junitjava
assertメソッドの種類
テストの結果の確認には、様々はassertを用いる。
assertEquals()
→ 期待される結果と実際の結果が同じかどうか判定する。
引数1:(expected, actual)
引数2:(String message, expected, actual) - テストが失敗した場合にmessageが表示される。
引数3:(expected, actual, delta) - deltaは許容誤差。
引数4:(String message, double expected, double actual, double delta) -
assertNotNull()
→ 与えられたObjectがnullでないかどうか判断する。
引数1:(Object object)
引数2:(String message, Object object) - テストが失敗した場合にmessageが表示される。
assertNull()
→ 与えられたObjectがNullかどうか判断する。
引数1:(Object object)
引数2:(String message, Object object) - テストが失敗した場合にmessageが表示される。
assertSame()
→ 与えられた2つのObjectが同じObjectを参照しているか判断する。
引数1:(Object expected, Object actual)
引数2:(String message, Object object) - テストが失敗した場合にmessageが表示される。
assertTrue()
→ 与えられた条件が正しいかどうか判断する。
引数1:(Object expected, Object actual)
引数2:(String message, Object object) - テストが失敗した場合にmessageが表示される。
assertThat()
Matcherとの組み合わせで、assertEquals()より便利になる。
オブジェクトにequals()は一つしか作れないので、assertEquals()には限界がある。
検証をするのがassertThatではなくMatcherなので、拡張性も高い。何行もassertEqualsを書くという事態が起こらなくなる。
引数:(Object actual, Matcher matcher) 詳細
注意点
順序は関係ない
テストクラスの中のメソッドは、上から順に実行されるわけではない。
そのため、上のテスト結果を前提としたテストメソッドなどは書いてはいけない。
副作用をつくらない
テストを行うとデータベースが更新される等、システムの状態を変えてしまう「副作用」を作ってはいけない。
わかりやすいメソッド名をつける
後からコードを読む人がテストの目的をすぐに理解できるように。
わかりやすいコードを書く
同上。無駄なくシンプルにわかりやすく。
テスト計画はjavadocで書面化する
手動で書くのは面倒+ミスも多い+更新に追いつくのが大変。
できるだけ小さく、早く
こまめに、気軽にテストを行えるために。
その他便利なメソッド
複数のメソッドの中ではじめと終わりに共通の処理(データベースの接続・切断等)を行う場合は、setUp()とtearDown()メソッドを使うと良い。
setUp()
各テストメソッドが呼び出される前に実行される。
tearDown()
各テストメソッドの終了後に実行される。
TestSuiteクラス
上記の通りテストメソッドは書いた順番どおりに実行されないが、TestSuiteクラスを使えばテストメソッドを実行する順番を指定できる。