くりにっき

フルスタックキュアエンジニアです

『JUnit実践入門』写経・実践会 in 横浜 #4 に参加しました #junitbook

Java系の勉強会なのにRSpec推しですみません。(挨拶)

というわけで月1のJava分を補給するために参加していました。

自分のLTについて

書籍だとDbUnitが紹介されていましたが、メジャーどころのフレームワークだとDB周りも普通にサポートされているため、勝手に写経したものを発表しました。
スライドとか何も作らなかったのでgdgdですみません('A`)

Seasar2

sue445 / junitbook-study-seasar2 — Bitbucket

データベース周り

seasar2はCoC *1 なので設定ファイルはほとんど書かないですが、DBの接続先とかはjdbc.diconやs2jdbc.diconに書きます。*2

メジャーどころのDBであればあらかじめ設定が載ってるので自分が使いたいのをコメントアウト解除すればok

ちなみにdialectというのは各DBの差分を吸収するためのラッパー。
(分かりやすい例だと、ページングしたい時にmysqlだとLIMITを使うけどoracleではLIMITがないので代替のSQLを使うとか)

余談ですが、前職だとSeasar2からTimesTen につなぐというマゾいことをやったのですが、対応するdialectがなくてとりあえずoracleDialectを使ったら動いちゃったというw *3

seasar2ユニットテストについて

src/test/resources/にxlsを置いておけばテスト実行時に勝手に読み込んでくれます。

いまでこそExcel(笑)ですが、Seasar2が出た2005年頃であればかなり画期的であったかと。*4

Apache POIを直接使うよりはS2JUnitからxlsを読み込んだ方がトラブルが少なかった気がします。

あとLTで言うのを忘れていましたが、設定ファイルに_utとか_ctとかつければテストの時だけ設定ファイルを切り替えるというのも可能。(参考)

雑感

あの時代でユニットテストまでサポートしたフレームワークというのはそうそうないと思います。(Javaで同時代だとSpring 1or2系辺り?)

デメリット

S2JUnit4JUnit 4.4辺りの実装に依存してるため、JUnitのバージョンを上げられないのが難点。(Parameterizedは使えるけどTheoriesが使えない)
あと、@RunWithアノテーションに依存してるためParameterizedとかが使えないのも地味に不便。(Enclosedは入れ子のためのクラスでテストは書かない(書けない)ので特に関係なし)

一応s2junit4junit 4.10を使えるようになるライブラリもあるらしい。


Rails

sue445 / junitbook-study-rails — Bitbucket

コマンドを叩くだけでいろいろファイルが自動生成されるのが素敵。
詳細はgitのコミットログ参照

テストデータ

yaml形式のfixtureデータを読み込む仕組みはあるのですが、factory_girlの方が使われている気がします。*5

サンプル

FactoryGirl.define do
  factory :user do
    name "MyText"

    factory :user_ichiro do
      name "Ichiro"
    end

    factory :user_jiro do
      name "Jiro"
    end

    factory :user_saburou do
      name "Saburou"
    end
  end
end

ネストすれば内側の値が使われるし、フィールドの値を乱数や連番にすることも可能。
関連が絡むといろいろと面倒くさいですが、RubyのDSLで書かれていてyamlに比べて柔軟性があるので慣れると使いやすいです。

テストの実行結果も文章っぽくできるのでよさげ。

$ rspec --format documentation

User
  に0件のレコードがある場合
    1件追加できる
      should include #<User id: 1, name: "Sirou", created_at: "2013-03-03 15:40:55", updated_at: "2013-03-03 15:40:55">
      should have 1 users
    0件取得できる事
      should have 0 users
  に2件のレコードがある場合
    1件追加できる
      should include #<User id: 3, name: "Saburou", created_at: "2013-03-03 15:40:55", updated_at: "2013-03-03 15:40:55">
      should have 3 users
    2件取得できる事
      should include #<User id: 1, name: "Ichiro", created_at: "2013-03-03 15:40:55", updated_at: "2013-03-03 15:40:55">
      should have 2 users
      should include #<User id: 2, name: "Jiro", created_at: "2013-03-03 15:40:55", updated_at: "2013-03-03 15:40:55">
      count
        should == 2

User
  に0件のレコードがある場合
    1件追加できる
    0件取得できる事
  に2件のレコードがある場合
    1件追加できる
    2件取得できる事

Finished in 0.14817 seconds
13 examples, 0 failures

Randomized with seed 36400

RSpecのprofileオプションについてはこちらを参照

RSpec 2.13.0を使ってみた - くりにっき

RSpecの難点は書き方次第で他言語の人には読めないテストコードになることかなw

試しに全く同じテストをJUnitスタイルとRSpecスタイルの2種類で書いたのがこれ。


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

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


The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)

*1:Convention over Configuration = 設定より規約

*2:拡張子がdiconのファイルはseasar2の設定ファイルで中身はXML

*3:TimesTenは別の会社のプロダクトをOracleが買収したのでデータベースレベルでOracleとは直接関係ないはず

*4:その頃は社会人になる前なので知る由はないですが

*5:Rails Girlとは関係ありませんw