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
- sue445 / junitbook-study-seasar2 / source / src / main / resources / jdbc.dicon — Bitbucket
- sue445 / junitbook-study-seasar2 / source / src / main / resources / s2jdbc.dicon — Bitbucket
ちなみにdialectというのは各DBの差分を吸収するためのラッパー。
(分かりやすい例だと、ページングしたい時にmysqlだとLIMITを使うけどoracleではLIMITがないので代替のSQLを使うとか)
余談ですが、前職だとSeasar2からTimesTen につなぐというマゾいことをやったのですが、対応するdialectがなくてとりあえずoracleDialectを使ったら動いちゃったというw *3
seasar2のユニットテストについて
src/test/resources/にxlsを置いておけばテスト実行時に勝手に読み込んでくれます。
- sue445 / junitbook-study-seasar2 / source / src / test / java / net / sue445 / service / — Bitbucket
- sue445 / junitbook-study-seasar2 / source / src / test / resources / net / sue445 / service / — Bitbucket
いまでこそExcel(笑)ですが、Seasar2が出た2005年頃であればかなり画期的であったかと。*4
Apache POIを直接使うよりはS2JUnitからxlsを読み込んだ方がトラブルが少なかった気がします。
あとLTで言うのを忘れていましたが、設定ファイルに_utとか_ctとかつければテストの時だけ設定ファイルを切り替えるというのも可能。(参考)
例
デメリット
S2JUnit4がJUnit 4.4辺りの実装に依存してるため、JUnitのバージョンを上げられないのが難点。(Parameterizedは使えるけどTheoriesが使えない)
あと、@RunWithアノテーションに依存してるためParameterizedとかが使えないのも地味に不便。(Enclosedは入れ子のためのクラスでテストは書かない(書けない)ので特に関係なし)
一応s2junit4でjunit 4.10を使えるようになるライブラリもあるらしい。
#junitbook 試してないですが、s2junit4でjunit4.10を使う用のライブラリが個人より公開されています。ちなみに僕は4.10にしてエラー⇒4.4に戻してます github.com/m-nori/s2test
— hidenori tanakaさん (@hid_tanaka) 2013年3月3日
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の難点は書き方次第で他言語の人には読めないテストコードになることかなw
試しに全く同じテストをJUnitスタイルとRSpecスタイルの2種類で書いたのがこれ。
JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
- 作者: 渡辺修司
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 261回
- この商品を含むブログ (37件) を見る
The RSpec Book (Professional Ruby Series)
- 作者: David Chelimsky,Dave Astels,Zach Dennis,角谷 信太郎,豊田 祐司,株式会社クイープ
- 出版社/メーカー: 翔泳社
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 7人 クリック: 136回
- この商品を含むブログ (13件) を見る