.NETでテストが書かれている書籍を探してみたところ、「The Art of Unit Testing, Second Edition with examples in C# 」のサンプルコードがC#だったため、写経をしながら読んでみました。
洋書なので辞書で調べやすい電子書籍版にするため、出版社のサイトで電子書籍版を購入しKindleに入れました。
Manning: The Art of Unit Testing, Second Edition
Amazonなどでも購入できるようですが、電子書籍版はありませんでした。
The Art of Unit Testing: With Examples in C#
- 作者: Roy Osherove
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2013/12/07
- メディア: ペーパーバック
- この商品を含むブログを見る
感想
本書では、Unit Testに関する説明や用語解説から入ります。用語については、日本語で体系的にまとまっている「JUnit実践入門」を読み返し、理解するようにしました。
JUnit実践入門 ── 体系的に学ぶユニットテストの技法 | Gihyo Digital Publishing … 技術評論社の電子書籍
途中からは「いかにして読みやすい・理解しやすいテストコードを書くか」をメインテーマとして書かれていました。
特にChapter8の「The pillars of good unit tests」では、どのようなテストが読みやすい・理解しやすいのか書かれていて、
- テストの中に、条件分岐やループなどのロジックを入れない
- 1つのテストケースでは、Assertは1つ
- テストの重複を排除する時、Setupメソッドよりもヘルパーメソッドの方が分かりやすい
- テストの実行順を強制しない
- 1つのテストケースの中で、別のテストケースを呼ばない
- テストの共有資源の扱いに注意する
- ActionとAssertを分ける
などがためになりました*1。
また、.NETにおけるテストライブラリの紹介や比較などがあり、こちらも参考になりました。
他にもいろいろと参考になったので、また後日読み返してみようと思います。
写経環境
書籍ではテスティングフレームワークとしてNUnit、テストダブルとしてNSubstituteを使って、サンプルコードが書かれています。
royosherove/aout2 · GitHub
ただ、xUnit.netを使ってみたいと考え、以下のバージョンでテストを書いてみました。
- xUnit.net 2.0.0
- NSubstitute 1.8.1.0
写経結果はGitHubに上げておきました。
thinkAmi-sandbox/syakyo_The_Art_of_Unit_Testing_2nd · GitHub
写経方法
Instant Nancyを写経した時のようにして今回も写経をしました。
GitHubとローカル間でのやりとりを忘れてしまうことがあるので、ひとつのChapterを写経する場合のメモを残しておきます。
GitHubのプルリクエストを作成
GitHub
(1) リポジトリを作る
ローカル
(2) Chapterでブランチを作ってチェックアウトする
(3) ブランチをGitHubにpushする
GitHub
(4) リポジトリのトップにCompare & pull reques
が出るので押す
(5) タイトルはChapter...
、コメントは適当に入力してCreate pull request
ボタンを押してプルリクエストを作成する
写経時
ローカル
(1) Chapter名やより小さな見出し単位で、空コミットを作る
git commit -m "<write your comment>" --allow-empty
(2) Visual Studioで開発する
(3) ファイルをステージング・ amendでコミットに追加する
git commit --amend
(4) GitHubへpushしたり、GitHubのコメントに追記する
(5) 上記(1)~(4)を繰り返す
プルリクエストの範囲を写経し終わった場合(Chapter終了時など)
GitHub
(1) pull requestの画面で、Merge pull request
ボタンを押す
(2) マージを確認後、ブランチを消す
ローカル
(3) 念のため、VisualStudioを閉じる
(4) masterをチェックアウトする
(5) master上で、GitHubからpullする
(6) マージされたのを確認後、ローカルのブランチを削除する
(7) 次のChapterのプルリクエストを作成する
*1:自分の意訳のため、本文とは異なるかもしれません...