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


前回第1回に引き続きの書籍写経・実践会です。


会場は横浜タネマキ。これまでには自身では何度も利用させて頂いていますが、今回は初めて会場貸切で開催してみました。


横浜タネマキさん、設備等は以下のリンクにあるようなものが利用出来たりしますが、最近では無料ドリンクベンダー(無限かどうかは不明)が設置されており、好きなだけ飲む事が出来ます。これは素晴らしいですね〜。


今回は司会(ファシリテータ?)進行的な部分のサポート情報として別途スライド資料を作ってみたりもしました。基本タイムテーブル等の情報程度なので内容的には大した事無いのですが、何気に勉強会絡みで作成・公開したスライドはこれが初めてだったりしますw


開始は当初の予定から少し遅れて13:15に。以降、時間軸に沿って話に挙がった内容、行った事などのまとめ。

オープニング


まぁこの辺りはお約束という事で。

アイスブレイク


書籍は脅威の持参率100%!(しろめ:まぁ参加条件に入れてるから当然っちゃぁ当然ですがw

TDDの実践やTDDBCの参加経験も聞いてみたりしましたが、TDDBC参加は6〜7割、またTDDを仕事で実践していると言う人は3〜4割と言ったところでした。またこのタイミングでは無かったのですが、当日の利用環境を聞いてみると以下の様な割合となっておりました。Mac多し、IDEA検討!という感じですね。

  • 参加者14人中
    • Javaで挑む:10/14人
    • Groovyで挑む:4/14人

黙読〜写経/実践、ディスカッション

本編の1つであるこの部分は、主に以下の手順で進めて行きました。(第4章〜第10章繰り返し)

  • まず5分程度対象範囲を黙読。
  • 対象範囲に於いて気になる点、聞いてみたい事などを採り上げてディスカッションを行う。
  • 気になったところについてはその場で調べてみたり、コードを書いてみたりして確認。
  • 対象範囲内で意見が出尽くした感があれば、速やかに次の対象範囲(次章)に進む。
第4章 アサーション

  • failメソッドの検証
    • 書籍を見る限りだとsutが何を指し示しているのか分からず、サンプルコードを確認。AssertionFail.Javaクラスが実体となっている模様。
package ch04;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

/**
 * リスト4.1 assertThatによる比較検証
 * @author shuji.w6e
 */
public class AssertionTest {
    
    @Test
    public void assertion() {
        String actual = "Hello" + " " + "World";
        assertThat(actual, is("Hello World"));
    }
}
package ch04;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

/**
 * リスト4.2 failメソッドによるテストの失敗
 * リスト4.3 特定のステップが呼び出されると失敗となるテスト
 * @author shuji.w6e
 */
public class AssertionFailTest {

    AssertionFail sut;

    @Before
    public void setUp() throws Exception {
        sut = new AssertionFail();
    }

    @Ignore("動作確認する時は@Ignoreをコメントアウトしてください")
    @Test
    public void なにか難しいけど重要なテストケース() {
        fail("TODO テストコードを実装する");
    }

    @Test(expected = IllegalStateException.class)
    public void timeoutがtrueのときにロジックが実行されないこと() {
        // SetUp
        Runnable logic = new Runnable() {
            public void run() {
                fail("run が呼ばれてしまった");
            }
        };
        sut.timeOut = true;
        // Exercise
        sut.invoke(logic);
    }
}
  • failの使い方について
    • いまいち使用用途が不明?
    • 意図しない成功を防ぐ目的もある。
    • Red-Green-Refactoringの最初のRedを実行させるという意図も?
    • Eclipseのテストケース作成ひな形では、自動的にfail()を実装したテストメソッドが作られる。
      • なので、Eclipseを使えって事だw
    • RSpecのpendingに近いものがある?
    • JUnit3とは引数の順序が異なるので、JUnit4については最初は違和感があった。
  • assertThatについて
    • 比較と比較検証を分けて考えた事によって、分かりやすくなったのでは。
    • ジェネリクスを使っているので、nullだと値が分からない。その点型の一致が出来るので分かりやすくなる。
  • カスタムMatcherについて
    • これ結局、自身のテストも入念にやらないと行けなくなるよね...
    • 個人個人で作るってよりも、共通で提供されうるべき。
第5章 テストランナー


  • 書籍内で使われている『sut』というネーミングについて
    • 以前から『sut』(という名称)を使っていたと言う人…参加者中1人。(その1人も、著者の渡辺修司さんに教わって使い始めたそう)
    • 幾つかの違和感的な意見も挙がった。
      • クラス名の小文字表記とかのほうが、何を行なっているクラスなのかが分かって良いのでは。
      • 普段使いしている名称では『target』等が票が多かった。
  • 『sut』という名称、これは渡辺さんの提案なのでは?
    • 洋書(及び海外)では一般的?な名称(なのかしら...?)。
  • JUnit3→JUnit4へのテストクラス移行について
    • 皆さんどうされてますか?→参加者内ではそこまでJUnit3を使っている・使いこなしている人は居なかった...
    • 移行問題に直面している人はブログ等を拝見する限りでも見ることが出来る。Jenkinsがそう(下記エントリ参考)で、他にはTwitter4jもそうらしい。
第6章 テストのコンテキスト


  • Enclosedの使い方(粒度・テストの分け方)について
    • コンテキストをテスト毎に切り分けて使いたいときにネストしてしまう事を避けるようにEnclosedを使う。Enclosedでネストを無くす。
    • テストメソッドごとにStaticに切り替えて、コンテキストを分ける。面倒でも小さく分ける。独立するように分ける。
  • この辺りの分け方は、『同値分割』や『境界値』など、考え方の基本が分かっていないと効果的なテストが書けないのでは?
    • ちなみに皆さんはテスト技法についてはどうやって教育・勉強している?(→特にコレ、といったものは無く、現場で覚えていくという声が大半だった)
第7章 テストフィクスチャ


  • マスタ絡みのテスト、この辺りに関しては仕事ではExcel使ってたな〜。(Seasar2使いの人より)
  • 大量データのテストについて
    • パフォーマンスに関連してくるので、『P.108 フィクスチャとスローテスト問題』にも影響。
    • カテゴリーで分けて対応させるとかが無難なのでは?
    • 『フィクスチャ』カコイイ!(単語の響き的にw
    • yaml、使っている人は4人居た。でも便利…?
      • 読み易さは段違いに良い。ただ若干方言的な部分もあるのでそこは気になる。
第8章 パラメータ化テスト


  • パラメータ化テスト:上手く使われてる?
  • assume…フィルタリングされるとどっちにカウントされる?成功/失敗/無視?


この章に関してはそもそもの『パラメータ化テストの使い方』をどう上手く扱うか、assumeとの兼ね合い等について議論がなされていましたね。それぞれ機能としては提供されているものの、意図する加減で使いこなしているかというと...という感じでした。

第9章 ルール

この章も第8章と同じような感じ。機能そのものについては『ふむ、なるほど』と疑問点は特に挙がってこなかったですが、『どういう局面で使うだろうか』という辺りに話が及んでました。ExpectedExceptionは使いそうだけどその他はどうだろう…みたいな。

第10章 カテゴリ化テスト


  • 問題ある、時間食うようなものは別途分けるべき。
  • Googleでは厳格に取り決めをしているらしい。
  • 個人で取り組むよりも、チーム等で取り決めて行うことだよね...

ディスカッションで挙がっていた『Googleのテストの取り決め』について、キーワードで検索してみたらそれと思しきエントリ(群)を発見。


日本語エントリではPublickeyでまとめられています。こちらを先に読んでから上記原文に当ってみると良いかもですね。


どうやら書籍も販売されているらしい。Kindleバージョンもあるらしいので早速ポチってみたw 書籍レビュー見ると学ぶところも多そうだし、少しずつ読み進めて行ければと思います。

How Google Tests Software

How Google Tests Software

  • 作者: James A. Whittaker,Jason Arbon,Jeff Carollo
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2012/03/23
  • メディア: ペーパーバック
  • 購入: 1人 クリック: 19回
  • この商品を含むブログを見る


そう言えば、ディスカッション時間内に『JUnitの新しい機能、皆さんどこで確認されてますか?(リリースノート的なものの確認)』という問いを投げ掛けてみたんだけど、その際に公式とされていたサイト( http://junit.org/ )にアクセスしたら、404になっとったw

一応情報としては、Kent BeckGithubにまとまってました。今後はこちらから適宜情報を入手・確認して行く方向なんですかね。

演習

タイムスケジュール的には時間通り、16:30頃から18:30辺りまで、各自思い思いの作業をしてもらう時間としました。こちらから提案したのは以下の2つ。

  • TDDBC大阪3.0の課題(自動販売機)に挑戦
  • 書籍18章〜20章の課題に取り組む


私個人としては事前に第4章〜第10章の写経は済ませていた/TDDBCのお題も過去やった事あった/司会進行業的な立ち位置でここまで進めてきてたので若干バテてた…等の要因もあり(笑)、これまでの情報整理や休憩の時間に充ててました。

一応のこの時間の成果としては...未読だった『ジョジョの奇妙な冒険』第5部を読み進められた事でしょうかw

途中までは読んでいた記憶があったので、その辺の記憶の整理をしつつ、54巻まで読んでいた事を確認。その後2冊(55巻,56巻)を読破しました。あと7冊、63巻まで読み終えれば『ジョジョの奇妙な冒険』全巻読破となります!(←ちゃんとやれ)

あ、他の方はちゃんと写経とかされてましたよ!w ちなみに会場の風景はこんな感じでした。心地良い音楽が流れ、ドリンクも飲み放題、いざとなったら漫画(ジョジョ全巻、ワンピース全巻等)も読め、らく〜な雰囲気で皆さん写経やディスカッションで過ごされておりました。

次回予定等

ふりかえりは特に無かったので、そのまま次回第3回の調整へ。幾つか案が出た中で、第3回は以下の日程で決定致しました!

  • 開催日時:2013/02/02(土) 15:00〜19:00
  • 開催場所:横浜タネマキ
  • 対象範囲:第11章 テストダブル

イベントページも立ち上げております。会場も第2回同様横浜タネマキを利用させて頂く予定です。


内容は第11章『テストダブル』についてのみ(何かやる)という事になっておりますが、詳細はこれから詰める予定です。(恐らく書籍の内容を黙読〜ディスカッションwith写経、その後は各自自由に…に近い形となるのでは)

参加条件も『書籍を持参して来る事』以外特に設けませんので、興味をお持ちの方は是非お気軽にご参加頂ければと思います。第1回第2回共にディスカッションの部分では色々な意見が飛び交い、盛り上がっておりました。


トータル6時間で書籍の対象範囲を7章分、更には実践の時間も設けたりで割とマラソン的な感じではありましたが、参加者の皆さんは楽しんで頂けましたでしょうか?(若干バテさせてしまったのは申し訳ありませんでした...^^;)


第1回第2回はJUnitについての学びでしたが、此処から先、第11章以降は様々なライブラリや局面でのテストに関するテーマとなります。学べる点も更に多くなって行くと思いますし、個人的にもとても興味のある分野です。『JUnit実践入門』写経・実践会も引き続き続けて移行と思ってますので、繰り返しになりますが興味をお持ちの方は是非お気軽に参加頂ければ!と思います。


会場となった横浜タネマキ様、またご参加の皆様、ありがとうございました!