読書会(JUnit実践入門)第3回議事録

[ 戻る ]


=================================
「JUnit実践入門」を読む会 第3回
=================================

開催概要
=================================
"日時", "2013年5月18日(土) 10:00-17:00"
"場所", "川崎市教育文化会館 第3会議室"
"出席者(敬称略)",
"岩室 遠藤 小棚木 門脇 高橋(徹) 高橋(智) 中澤 広瀬 松永 村山 吉本 田邊(記)"
"範囲", "P89-P161"

議事
=================================

 P89. Categories --- 特定カテゴリのテストクラスをまとめて実行する
 ---------------------------------
 
 * テスト数が増える=実行時間が増えるのはわかるが、
  そもそも実行時間がかからないのが TDD 的には鉄則では?
 ** 時間がかかっていると思う程度は? 10ms? 1分? 1日?
 ** (TDD の流儀からは外れるが)テスト実施はコミット前にするので、
   時間がかかること自体はあまり気にしていない
 ** 結局、実行時間の長短の考え方はテストターゲットと環境次第。
 
 * TDD、やろうと思ってもなかなか実践できていない。
 ** ブートキャンプに参加すると何か見えてくるかも。
 
 * 実行時間が遅いテストには、SlowTests インタフェースといった
  マーカインタフェース(implements 宣言するわけではない)をつけ、カテゴリ化できる
 ** なぜインタフェース? 文字列ではだめなのか?
 *** インタフェースであれば、IDE などを利用してタイポが防げる
 ** カテゴリが増えてきたらどうする? Slow, VerySlow, Fast など
 *** カテゴリの設定は、最終的には人間が管理するしかなさそう
 *** Log4j のログレベルのように選べるようにすると便利かも
 *** ソースを見なければカテゴリがわからないのは不便
 *** SlowTest 自体の意味合いを説明しておけばならない
 **** インタフェース名を日本語にすれば?
 ***** ファイル名が日本語名になって問題が出そう
 ***** NFD のコードの含有有無でコンパイルや実行ができるか?
 ***** Mac 環境で ぱぴぷぺぽ クラスを作って試す
 
 P92. 第6章 テストのコンテキスト
 =================================
 
 P94. テストケースをグループ化する
 ---------------------------------

 * インタフェース(サンプルの ItemStock)に対してテストを記述しているが、
   実際そうするか?
 ** 実際は実装クラスに対してテストする
 ** 複数実装がある場合は、テストロジックは共通化した
 *** 共通化しても Eclipse のような特定のメソッド決めうち実行をしたい。
    自動化の方法がないか?
 **** Maven でできると思われる。
 
 P96. Enclosed によるテストクラスの構造化
 ---------------------------------

 * 日本語内部クラス、日本語メソッドが出てきた
 ** Windows 開発 - Linux(CI環境) ビルド は日本語利用で問題ないか
 *** あまり問題になったことは無い
 ** Unicode の問題で、クラス名に使えないものがある。"・", "、"など
 ** クラス名やメソッド名にスペースを入れたい。
   ダブルクオーテーションでくくれば良いとか。
 *** アンダースコアでいいのでは。
 ** Excel プログラミング。罫線でインデントを表現できる。
 ** 日本語を使うときのエラーをまとめておきたい(OS環境差、使用不可文字など)
 
 
 P104. 6.4 テストクラスを横断する共通処理
 ---------------------------------
 
 * テストケースで継承はなるべく避けるべき、といううのはどういう意味?
 ** デザインパターンでの「継承よりコンポジション」という文脈では
 ** テスト作成では処理の共通化等の用途で継承もよく使う
 *** 共通処理をユーティリティクラスにまとめていくと、
    どのテストのための API かわからなくなってしまうことも
 
 P105. 第7章 テストフィクスチャ
 =================================
 
 P112. リスト7.4
 ---------------------------------

 * LRU らしい API になっている?
 ** get_A のテストと get_B のテストそれぞれで、
   (感覚的に逆順にも感じるが)取り出される値が変わっている
 *** キーが取り出されると、sut.keys の1番後ろに追加される模様
 

 P114. 外部リソースからのセットアップ
 ---------------------------------

 * YAML = Yet Another Markup Language
 ** また、Wikipedia によれば、以下の節も。
   ```
     YAMLは再帰的に定義された頭字語であり
    "YAML Ain't a Markup Language"(YAMLはマークアップ言語ではない)
    の意味である。
   ```
 *** http://ja.wikipedia.org/wiki/YAML#.E7.89.B9.E5.BE.B4
 ** !!<package-name>でクラスを表現し、
   new Yaml().load でオブジェクトとしてデシリアライズできる模様
 * 外部リソースの一例として、Excel が出てくるのが日本的
 ** 単純なテストが連続しているのであれば、Excel も使いでがあるのでは
 ** それなら CSV でもよいのでは
 *** CSV の RFC がある(長く規約がなかった)
 **** http://www.ietf.org/rfc/rfc4180.txt
 *** PHP で CSV を読もうと思ったら、文字コードの問題で日本語が使えなかった
 * 各言語のエンコード事情
 ** Java はわりとまともに日本語が使える数少ない言語
 ** Ruby は過去のバージョンは ASCII 以降はバイト文字列と見なしていた。
   エンコーディング情報 + バイナリ。毎回解釈して実行。
 
 P118. Java と宣言的記法
 ---------------------------------

 * Java はフィールドを設定してインスタンスするだけでも面倒。
 ** Scala のケースクラスは便利
 *** (追記) DTO などで setter/getter の記載が煩わしいということであれば、
    lombok の導入を検討するとか
 **** http://projectlombok.org/
 ** Builder パターンの是非
 *** 引数がそれぞれ違うコンストラクタが大量にできるのは厳しいので価値はあるが、
    実際に適用したことは無い
 * Java による宣言的なセットアップ: Map リテラルしたいときにも、このようなやり方をする。
 * Groovy による宣言的なセットアップ: 引数名つきで書く場合は、最後に , をつけてもよさそう

 P120. 第8章 パラメータ化テスト
 =================================
 
 P121. どのくらいのテストデータが必要か?
 ---------------------------------

 * 0-10 を引数にとるメソッドに対する同値クラスを考えた場合、
   -1, 0, 5, 10, 11 とテストする必要があり、テストメソッドをその分用意するのは大変
 * テストの分離が大事
 ** 正常系と異常系のテストは Exception を期待するしないで
   テストが必然的にわかれることになる
 * 不等号の向き議論
 ** 0 <= x など、比較時は <= を常に使う派が多かった。
 * 20 <= age のとき、境界値は 19 と 20 だけでよいか。
 ** 気持ちの問題かもしれないが、19, 20, 21 でテストしたい。
 ** 中国だと以下と以上と未満で違う意味ととらえられる可能性があるため、
   仕様の誤解を生まないよう、不等号記号を使うことがよくある。
 ** 以前・以後・以降・まで等、日付も誤解を生じやすい。
 *** 4/30 "まで"とは、 4/29 23:59? 4/30 終日?
 *** 4/1 生まれが早生まれ扱いなのは、
    日本の法律では誕生日前日の終了を以て年齢が上がるため。
 **** 2/29 生まれの人はいつ年齢が増える?
 **** 3/1 生まれの人は 2/28 または 2/29 で年齢が増える
 
 P125. リスト8.A 値の制約がある年齢クラス
 ---------------------------------

 * IllegalArgumentException の引数にメッセージを書くべきでは
 * 値のバリデーションは楽に書きたい
 ** Java EE 環境であれば、 BeanValidation が使える
 * 事前条件を宣言的に書けるようにしたい
 ** Scala
 ** Contruct4j
 ** TypeAnnotation はコンパイル時のみで、型消去されるのでこの用途には使えない
 ** JDK7 で追加された java.util.Objects#requireNonNull が便利そう
 *** http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html#requireNonNull(T, java.lang.String)
 ** 事前条件を言語レベルでサポートしてほしい。
 
 P132. パラメータをフィクスチャオブジェクトにまとめる
 ---------------------------------

 * Fixture という用語は、テストデータという文脈で習慣的に使われているのだろうか
 ** どちらかというとテスト対象をフィクスチャと言うのでは
 ** テストデータとはっきり言ってあげた方が可読性が高いのでは
 ** PHP や Ruby 界隈が初出?
 ** 実行と検証がユニットのテストの本質とした場合、
   それ以外の部分(環境、広義のフィクスチャ)とわけることが大事
 * Theories 、記述が冗長で単純に使いづらい
 ** テストごとに Fixture クラスを用意するのでは、作業量が増えるだけに思える
 ** TestNG に @DataProvider というシンプルにパラメータ組み合わせを行える仕組みがある
 *** http://testng.org/doc/documentation-main.html#parameters-dataproviders
 
 P141. 第9章 ルール
 =================================

 P144. TemporaryFolder -- 一時ファイルを扱う
 ---------------------------------
 
 * TemporaryFolder を Windows 環境で利用した場合、不具合が生じる場合がある。
  フォルダ削除時にロックされている?
 ** Windows は削除してから本当に削除するまでラグがあるらしく、
   削除されたことを前提にした上で、またディレクトリを削除すると不具合が起きる可能性がある
 ** TempraryFolder の後処理に問題がある?
 *** 消したファイルのロックファイルが残っている?
 *** Windows サーバなら、WriteBack/WriteThrough のモード変更で
    改善するかもしれないが、定かではない。
 *** Vista 以降で出始めた事象?
 *** どうしても直らない場合は、きちんと消えるまでリトライ処理を書く必要がある
 *** Windows で、どのプロセスがファイルを掴んでいるかを知るには、
    プロセスエクスプローラが便利
 **** Linux でいう /proc/<pid>/fd の動作及び、その逆のファイルから利用プロセスも検索できる
 **** http://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx
 *** Eclipse で JUnit を実施するとき、JUnit が実行されるのは Eclipse とは別の JVM 上?
 **** Jenkins は Jenkins 自体と Maven の実行、Test の実行すべて同じ VM ?
 ***** 別の JVM をそれぞれ設定できたと思う。

 P146 Verifier -- 事後検証を行う
 ---------------------------------

 * リスト9.6 の verify で 250 でなく 0 になっているのはなぜ?
 ** VerifierExample の仕様がわからないと何とも言えない

 * Verify の使いどころ
 ** @After の次に実行されるので、クリーンアップされたかの確認とか?
 ** Rule の複数クラスの事後条件の横断的利用の意味がよくわからない
 ** Verify というのなら、@After の前にするべきでは

 P150. ExpectedException -- 詳細な例外を扱う
 ---------------------------------

 * ExpectedException はメッセージしか検証できない?
 ** ユーザ作成の Excpetion に定義したフィールド値(エラーコードなど)や
   ルート例外を知りたければ、リスト 9.10 のように catch して
   送出された Exception のインスタンスを調べるしかなさそう
 
 休憩中の話題
 ---------------------------------
 * 今月 Java 8 の Feature Complete の予定
 ** http://openjdk.java.net/projects/jdk8/milestones
 * Date & Time API は嬉しい
 * リリース遅延は Lambda の他にセキュリティ関連の対応に手間取ってそう?
 ** Invoke Dynamic のセキュリティも怪しい
 * WIndows CE
 ** デスクトップの Windows マウス前提の UI をそのまま持ってきた。
 * Palm vs iPhone
 * Windows プロセスエクスプローラ デモ
 * Intel vs AMD

 誤字
 ---------------------------------
 P 93 大きくなってします -> 大きくなってしまいます
 P 98 図6.1 クイックアウトライン: "商品Aを1件含む場合"の 1 が全角に見える
 P125 テストテスト -> テストデータ?

 次回
 ---------------------------------
 P162. 第10章 カテゴリ化テストから


[ 戻る ]