ツール
フレームワーク
モック
- 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
と長くなるので冗長かなと。
- 後者はレコードがないときはnullにしています。AssertJは通常のオブジェクトは
- ValueObjectをちゃんと作るのが、equalsで比較できるので良いと思います。
HTTP
httpbinを使うのが楽です。 自分でスタブを用意する場合は、stubbyがオススメです。
- httpbin.org
- stubby
- YAMLファイルで定義します。
- Java版: stubby4j
- .NET、Node.js版もありますが、Java版が最も活発に開発されている模様。
カバレッジ
- Java
- EclEmma - Java Code Coverage for Eclipse
- IntelliJ IDEAでは組み込みのものもあるようです。
- Python
- Coverage.pyとpytest-covを使っています。
インフラ
- Serverspec - Home
- InSpec - Audit and Automated Testing Framework
- chef/inspec: InSpec: Auditing and Testing Framework
- Serverspecにインスパイアされたもの。自分はこっちをメインで使ってました。
- Gruntwork | DevOps as a Service
- aelsabbahy/goss: Quick and Easy server testing/validation
- 動いている環境をベースに作ってくれるもの。
- naftulikay/ansible-role-degoss: An Ansible role for installing, running, and removing Goss from a system without leaving any traces.
- 上のGossをAnsibleで使うためのもの。
書き方
テストコードの設計
以前まとめました。
毎回変わるものは分離
例えば時刻のように毎回変わるものについては、 毎回変わるところとそうでないところを分けることで、テストが楽になります。 モックを使ったり、java.time.Clock#fixedのように テスト用のメソッドを用意している場合もあるので、積極的に使っていくといいです。
// テストしたいもの(こちらはテスト対象外)
public List<Book> getBooksOfPublishedToday() {
LocalDate today = LocalDate.now();
getBooksOfPublished(today);
}
// こちらをテスト対象とする。
List<Book> getBooksOfPublished(LocalDate date) {
...
}
カバレッジ
- 高いほうがいいが、100%にはしない
- Djangoで100%を実践した結果。
- まずありえない例外があるため。
- Martin Fowler先生も書いている通り、80%から90%台でいいかと。
- テストカバレッジ100%を追求しても品質は高くならない理由と推奨されるカバレッジの目標値について - Qiita
- テストの品質を確保するなら、ミューテーション解析を使うのが良いです。