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

投稿日: 更新日:

ツール

フレームワーク

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

モック

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

fixture

  • Java: DbSetup
    • 最初はDbUnitを使っていたのですが、イマイチ使いにくいので探したところ、このライブラリを見つけました。
    • 削除のsqlを直書きできるので、いろいろな事情でクリーンな環境が用意できない場合にも対応できました。

データベースのAssertion

  • Java: 自作クラス(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) {
  ...
}

カバレッジ