「The Art of Unit Testing, Second Edition with examples in C# 」を読んだ

.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#

The Art of Unit Testing: With Examples in C#

 

感想

本書では、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:自分の意訳のため、本文とは異なるかもしれません...