2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[読書メモ]実践Junitのメモ1

Last updated at Posted at 2015-09-21

実践Junit

自分に必要なとこだけメモする。

ユニットテストの基礎

1章、2章は割愛

様々なアサーション

Junitでのアサーション

assertThat(何かと何かが等しいことを示す)

assrtThat + Hamcrestのアサーションを使えば失敗時にわかりやすいメッセージが表示される。
assertTrueではスタックトレースのみ。
ただし、前者を利用しても提示できる情報には限界がある。シンプルなテストであればassertTrueの方が良いという派閥もある。

重要なHamcrestマッチャー

メソッド名 内容
eqaualTo コレクションやオブジェクトの比較。is単体でもほぼ同じことができる
not 否定
nullvalue nullであること。多くの場合、非nullチェックは冗長であり、あまり価値はない
notNullValue 非nullチェック
その他は以下を参考に。
[Java Hamcrest] (http://hamcrest.org/JavaHamcrest/)
HamcrestのMatchersに定義されているメソッドの使い方メモ

テストの編成

AAAに基づいた一貫性の実現

AAAとは?

Arrange(セットアップ)

テストが実行される際にシステムが適切な状態にあること

Act(操作)

テストコードの実行

Assert(アサーション)

テスト対象の振る舞いが正しいかどうかの確認

After(事後処理)が含まれる場合もある

個々のメソッドについてテストするのではなく、対象のクラスの持つ振る舞いをテストする

  • ATMの例 -> 出金のテストを行うには入金をしてからでないとできない。
  • 全体的な観点を持つべき

テストと対象のコードの関係

テストコードはテスト対象に依存してはならない。
ただし、テスト対象の設計を変えればテストをしやすくなる場合、積極的に採用すべき。 -> テストしやすいコードは実運用にも適している場合が多い

一つの目的に特化したテストの価値

テストケースごとに1つずつテストメソッドを用意し、検証対象の振る舞いを的確に表す名前をつける

  • テストが失敗するとテストの名前が報告されるため、どの振る舞いに問題があったのかすぐにわかる
  • 失敗したテストの分析にかかる手間を最小限にできる
  • すべてのテストケースが実行されることを保証できる

ドキュメントとしてのテスト

ユニットテストは永続的で信頼できる情報を提供すべき。
普段コメントで書いていることはほぼユニットテストに置き換え可能

一貫性のある名前

正確な名前をつけることによって、テストの内容を詳細に理解できるようにすべき。

  • テストの名前は7語程度にすべき
//何らかの処理を行うと何らかの結果が発生する
doingSomeOperationGenerateSomeResult

// 何らかの条件下では何らかの結果が発生する
someResultOccursUnderSomeCondition

意味のあるテスト

テストがわかりにくいと感じた場合、コメントを追加するのではなく、名前を改善することから着手する。

  • ローカル変数の名前を改善する
  • 意味のある定数を導入する
  • hamcrestアサーションを利用する(Junit組み込み以外のものも使ったりする)
  • 長いテストは、より短く焦点を絞った複数のテストに分割する
  • あまり重要でないコードはヘルパーメソッドや@Beforeメソッドに移動する

@Before@Afterに関する補足(初期化と後処理)

  • @Beforeメソッドは複数定義できるが、実行順の制御はできない。
  • @Beforeメソッドは全てのテストに対して適用されるため、特定のテストだけで必要になる処理は避ける

テストと緑バーの重要性

全てのテストが常に成功しているべき。

テストの所要時間を縮める

問題があることに気づくのが遅れるほど、解消のためのコストは増大するため、テストの実行対象を減らすのは得策ではない。
データベース等の低速なリソースを使っていなければテストはすぐに完了するので、常に全てのテストを実行すべき。
以下のような方法で高速化を図る。

  • モックオブジェクトの利用
  • 実行するパッケージを限定する
  • Infinitestを使って常にバックグラウンドで実行する
  • 特定のアノテーション(@Category)がついているテストだけを実行する

Categories · junit-team/junit Wiki
Infinitest

最善の対策は、実行に時間のかかるテストを慎重に減らしていくこと。

テストを無視する

  • テストが失敗した際には1つずつ解決する
  • @Ignoreアノテーションが付いているメソッドは実行されない
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?