『JUnit実践入門』写経・実践会 in 横浜 #1 を開催してきた #junitbook

先月11/21(水)に発売となった書籍『JUnit実践入門』。その発売を機に2012/11/23(金・祝)に3箇所同時開催(東京・大阪・札幌)と言う形で読書会が行われておりました。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

私個人としても、これら読書会の流れに乗りたかった所なのでしたが(地域で言うと東京が該当するでしょうか)、イベント告知を見つけた時は既に定員超過しており『ぐぬぬ』となる結果に。更には23日に同時開催の波に乗って横浜でも...と思いましたがこの案も急過ぎて間に合わず。

最近(今年の夏以降)やり始めたYokohama.groovyでもご一緒させて頂いている@grimroseさんともこの辺についてお話を持ち掛け、せっかくなら横浜でもやっちゃおうよという事で合意→調整を経て、この日に横浜でも開催する運びとなりました。


開催会場はルノアール 横浜関内駅前店。

以前Groovy Testingについて写経した際に一度使った事のある地ですね。土曜の割に利用客がそんなに多くなかったので割と寛げる空間だったのが印象に残っています。今回もそんな感じで…と思ったのですが、予想に反して参加開始時刻からしばらくは混雑が続いてましたw


一冊まるまるを1日、若しくは数時間でカバーする事はボリュームを考えても到底ムリですし、今回は最初?と言う事もあり、様子見も兼ねて冒頭第1章〜第3章から始める事に。...と言いつつも、その前にTDD(テスト駆動開発)について言及している第16章を初っ端に持って行ってリズムを作ってみよう、という感じで進めて行きました。

【今回の対象範囲】
Part 4 開発プロセスの改善
第16章 テスト駆動開発 -テストファーストで設計する-
  16.1 テスト駆動開発とは?
  16.2 テスト駆動開発のサイクル
  16.3 Calculatorクラスのテスト駆動開発
  16.4 テスト駆動開発の目的

Part 1 JUnit入門 -ユニットテストの作成から実行まで-
第1章 JUnitチュートリアル
  1.1 なぜ、ユニットテストを行うのか?
  1.2 JUnitとは?
  1.3 JUnitテストを始めよう
  1.4 テストコードの記述
第2章 ユニットテスト -何のためにテストするのか-
  2.1 ソフトウェアテストとは
  2.2 テスト技法
  2.3 ユニットテストとは
  2.4 ユニットテストのパターン
第3章 テスティングフレームワーク -ユニットテストを支える仕組み-
  3.1 テスティングフレームワークとは?
  3.2 JUnitによるユニットテストの技法
  3.3 可読性の高いテストコードの書き方
  3.4 比較検証を行うアサーション
  3.5 JUnitが提供するアノテーション
  3.6 JUnitのテストパターン


以下、トピック毎に挙がった話題等をまとめつつのメモ。

自己紹介など

全員が全員顔見知りと言うわけでも無かったので、開始後まずは簡単な自己紹介から。併せて、今回写経に臨む際の言語、環境面についてざっくりヒアリング。

  • Groovyで臨む、という人は3〜4人程。
  • IDEについてはEclipse:IDEA = 3:1位の割合。宗教戦争的なものは特にありませんでしたw

環境面整備

ここは個人的なメモ、と言うかJUnit実践入門で実践し始める際の環境構築メモ。

各種実行環境準備

OSはMac OS Xで作業する事に。ここで最低限必要なのはJava環境位かな?

IDE環境準備

IDEは幾つか選択肢があるが、ここもベタにEclipseで行く事に。最新4.2を使う。あとJavaだけで無くGroovyでもテストコード等を書いて行きたいなと思ったのでGroovyに纏わる環境も整備。

プロジェクト用意

今回対象としている章、または4〜10章のJUnit拡張機能を試す分なら素のJavaプロジェクト+JUnit関連ライブラリ辺りだけで全然行けると思うのだが、更に以降の章(11章以降)で写経等を行う事を考えるともう少し色々な選択肢を用意しておいた方が良いのかな〜と思い検討。

利用ライブラリについてはJUnit及びHamcrestを用意。両方共現時点での最新版を落としてきてビルドパスに追加する事にする。


検討したプロジェクトは以下の3つ。ま〜どれでも良いんじゃないかと。この日は結局(このエントリを書く&環境構築メモに関するエントリ情報を用意するのが)間に合わず素のJavaプロジェクトでやりましたけど、今後の事を考えるとこの辺も少し整理しておかねばですね。

  • 素のJavaプロジェクト(→一番シンプル)
  • 動的Webプロジェクト Tomcat7 / Servlet3.0 (→Web周りとかやるならこっちの方が都合良さげ)
  • Playframework 1.2/Java プロジェクト (→最近良く利用、コマンド数回で準備可能に)

書籍の写経・実践

足並みを揃える為に、章開始の区切りでまずは5〜10分程対象範囲の章をざっと黙読。その後に気になった所をディスカッションしたり、各自写経して理解を深めるスタイルを採りました。

第16章 テスト駆動開発
五輪の書:一対他の対応方法。大勢を相手にするのではなくて、一対一の連続にしよう。そうすれば負けない可能性が高くなる。
第1章 JUnitチュートリアル
  • とあるイベントにて参加者が『JUnit実践入門』著者の渡辺さんに資料をレビューしてもらった。
    • その際に新人をターゲットとした場合の『なぜ、テストが必要なのか?』という理由を説明すべきでは、という流れに。
    • 『何をテストするんですか?』→『いや、(テストは)するでしょ』ではなく、説得性のある説明を。
  • 例外を検出するテストについて
    • @Test(expected=例外クラス)とした場合…
      • 意図した例外が投げられた=成功
      • 例外が投げられない=失敗
      • 意図した例外とは異なる例外が投げられた=これも失敗。
    • @Test(expected=例外クラス)では、例外検出されたという事実と例外クラスしか検出出来ない。
      • より詳しい内容を確認したい場合は、P.150 ExpectedExceptionで。
第2章 ユニットテスト
  • 上述した『何のためにテストをするか』の解が章先頭に記載されている?
    • 立場(新人レベル・IT業界経験者)で『テスト』に対する認識・捉える意味合いは違う。
  • P.33 ユニットテストのパターン
    • ここからの内容は、『xUnit Test Pattern』が詳しい。

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

第3章 テスティングフレームワーク
  • 参加者の経験談:同僚がメール配信のテストを実施、一斉に大量メール配信が行われてしまっていたので@ignoreを付けたw
  • @ignoreアノテーションカバレッジだと
    • けどJUnitだと?
    • Gradleだと?
    • Jenkinsはちゃんと拾ってくれる。
  • @Testアノテーションのtimeout属性
    • ちょうどタイムリーな出来事がこの日ありましたw

(前日)

(そして当日...)


そんなこんなで対象範囲の写経・実践タイムは終了。

その他トピック

当イベントの開始時刻と併せて、きょん@うさみみモード (TwitterID:@kyon_mm)氏、なごや帝国から神奈川横浜の地に降り立っておりました。

最初はそんなに気に留めてなかったのですが、そのうち参加者間で『あれ、もしかして近くに居るんじゃない?』という話に。


実際近かった。目と鼻の先w


突然の宣言。そして恐れ慄く参加者達。


避難警報発令。

そしてついに...



Groovyイン・アクション

Groovyイン・アクション

その他、方々に解き放たれるマサカリの数々。

そして会場は焦土と化したのでした...(しろめ

(※実際は"なごやか"な雰囲気の中、興味深いお話も聞けたし楽しかったですよ!きょん君ありがとう!)

ふりかえり/次回について

そんなこんなで思わぬサプライズ展開もあり〜ので終了は予定時間を超過し19時前まで伸びておりました。

今回一発目と言う事で試行錯誤する部分もありましたが、やはり写経・実践を踏まえて行くのは理解も深まって良いですね。今回対象とした範囲(第16章、第1〜3章)は、とは言えそこまでコード書ける部分も多くはありませんでしたので、今後の展開に活かして行きたいと思います。

で、次回(続き)ですが、やりたいと思っています。

参加者間でその辺ディスカッションを行いまして、ざっくり

  • 『横浜で』
  • 『年明け(2013年)1月に』
  • 『第4章〜第10章を対象範囲として』

やろうかな〜と検討中です。

ボリュームや内容もあるので、ちょっとした事前対応が必要なようになるかも?

ご参加の皆様、ありがとうございました!

その他関連: