マニュアル: テスト(プログラミング)

投稿日: 更新日:

ツール

フレームワーク

  • JUnit
    • 何はともあれこれ。デファクトで情報も多く、十分使いやすい

モック

JMockitを使ってます。 どちらかと言えば慣れなので、Mockitoでもいいかなと。

インフラ

データベース

  • Fixture: DbSetup
    • 最初はDbUnitを使っていたのですが、イマイチ使いにくいので探したところ、このライブラリを見つけました。
    • 削除のsqlを直書きできるので、いろいろな事情でクリーンな環境が用意できない場合にも対応できました。
  • Assertion: 自作クラス(JDBC + DbUtils) + AssertJ
    • AssertJ-DBも使ったのですが、ハードルが高かったです。
    • 差分だけ検証できる利点はあるのですが、ごちゃごちゃして読みづらかったです。
    • List<Map<String, Object>>で返すメソッドと、Map<String, Object>で返すメ ソッドを作っています。
      • 後者はレコードがないときはnullにしています。AssertJは通常のオブジェク>トはsatisfiesメソッドで対応できますが、OptionalはhasValueSatisfyingと長くな>るので冗長かなと。
    • ValueObjectをちゃんと作るのが、equalsで比較できるので良いと思います。

HTTP

httpbinを使うのが楽です。 自分でスタブを用意する場合は、stubbyがオススメです。

  • httpbin.org
  • stubby
    • YAMLファイルで定義します。
    • Java版: stubby4j
    • .NET、Node.js版もありますが、Java版が最も活発に開発されている模様。

カバレッジ

書き方

毎回変わるものは分離

例えば時刻のように毎回変わるものについては、 毎回変わるところとそうでないところを分けることで、テストが楽になります。 モックを使ったり、java.time.Clock#fixedのように テスト用のメソッドを用意している場合もあるので、積極的に使っていくといいです。

// テストしたいもの(こちらはテスト対象外)
public List<Book> getBooksOfPublishedToday() {
  LocalDate today = LocalDate.now();
  getBooksOfPublished(today);
}

// こちらをテスト対象とする。
List<Book> getBooksOfPublished(LocalDate date) {
  ...
}

カバレッジ