tdiarykaigi-20110215

14
本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。 かくたに ([email protected]) 2011年02月15日(火) tDiary開発者会議2011@クックパッド株式会社 tDiary開発チーム殿 御中 testable tDiaryの作業経緯と 現状、今後の展望についてのご相談

Upload: shintaro-kakutani

Post on 12-Nov-2014

2.505 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

かくたに ([email protected])2011年02月15日(火)tDiary開発者会議2011@クックパッド株式会社

tDiary開発チーム殿 御中

testable tDiaryの作業経緯と現状、今後の展望についてのご相談

Page 2: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

testable tDiaryの経緯と現状のまとめ■札幌Ruby会議01のtalk用にデッチ上げたネタ■ 2008(!)-10-25■ (オレもRubyの技術的な話ができることを証明したかった)■ tdiary/dispatcher.rbは、旧index.rb,update.rbのコピペ

■ githubへのリポジトリ移行のどさくさに紛れてpush権限をget■ tdtdsとhsbtの目にとまったもよう■ なんかmasterにマージされてしまった(2010/4Q頃)

■ testableの目的は「tDiaryをテスト可能にすること」■ Passengerで動くのはあくまでもオマケ■ PassengerというかRack上で動作可能になると、post-railsテクノロジを投入しやすい• rspec, capybara, steak, RR, fixture replacement...

2

Page 3: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

testable tDiaryのテスト■ Unit Test■ class/module, プラグインといった単位でテストする■ いまはあまり重視していない■ (本体とプラグインの設計がテストしやすさを考慮していないため)

■ End-to-End Test■ 設定ファイルと日記データ、プラグインを読み込んだ状態で、(だいたい)ブラウザからの操作をテストする

■ いまはこちらを重視したい■ Cover and Modify!• (だいたい)ブラウザからの操作がちゃんと動いていることを自動で確認できれば、

壊していないことを確認できる

■ 壊していないことを確認しつつ、Unit Test可能な設計へと変更していきたい

■ (End-to-Endでテストを書きやすいように設定できるといいな)

3

Page 4: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

Plain Old tDiary

4

cgiかfcgiでうごくよ!

Page 5: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

testable tDiary

5

pluginにも@resを渡したい!

Page 6: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

testable tDiaryでやりたいこと

6

■ tDiary本体,プラグインのインターフェイスとして:■ TDiary::Request 経由でリクエストにアクセスし、• @cgi へのアクセスを非推奨にしていきたい

• @request.params からリクエストパラメータなどを取得する

• Rack::Request風のparamsを用意したい (ParamsWithIndifferentAccessみたいなのを実装する)

■ TDiary::Response に結果を詰めて返す• Rackで動作する(Application)は、Rackの[status, header, body]に合わせる

• CGIで動作する(index.rb/update.rb)は、STDOUTにレスポンスを書き出す

• ブラウザへのレスポンスの返し方をcgi方式からrack方式のどちらかに寄せたい (rack方式に寄せたい)

■ Dispatcher.rbを整理したい■ TDiary::Requestの生成(cgi/rackの環境の差を吸収)■ Routing的な役割を持たせたい(実行するアクションを决める)• 現状はindex.rbとupdate.rbの中身をコピペしてきたのをちょっと編集しただけ

• dispatcher.rbの50行目ぐらいのコードはyyyymmdd.html形式に.htaccessで対応するためのもの?

■ TDiary::Responseの生成(cgi/rackの両環境で扱える戻り値)

Page 7: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

現状の課題■ cgi / rack のデュアルテスト実行環境■ Rackで動くのはオマケなのだからcgiでちゃんと動くことを検証するテストが必要!

■ masterにマージされて以降のバグは両者の齟齬でのテスト漏れ• 304 Not Modifed のときのレスポンスがおかしかった

• TDiary::Requestが実はRack環境では中身が設定されてなかった

• Cookieがちゃんとセットされてなかった

■ cgi環境のEnd-to-End TestはCapybaraのmechanize driverが使えるんじゃないかな?(試してない)• https://github.com/jeroenvandijk/capybara-mechanize

■ ブラウザへのレスポンスの返し方をcgi方式からrack方式のどちらかに寄せたい(rack方式に寄せたい)

7

Page 8: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

現状の課題(Cont’d)■ドメインモデル貧血症と言うと語弊があるかなあ

■ http://capsctrl.que.jp/kdmsnr/wiki/bliki/?AnemicDomainModel

■ TDiaryBaseのサブクラスたちが色んなことをやりすぎ• https://github.com/tdiary/tdiary-core/wiki/ClassDiagram (kdmsnr作)

• 「Webアプリケーション」はtDiaryの問題領域なので、もう少しレイヤが欲しい(MVC! MVC!)

• Viewのレンダリングとか分離したほうがいい気がする(Rails3の設計なんかを見ていると)

■ リッチじゃない日記データも手軽に扱えてもいいんじゃないかな• ライブラリとしてtDiaryを使えたほうがいいんじゃ?

• recent_list や squeeze のようにプラグインの中でCGI.newするというHackを無くすように誘導できるといいな

8

Page 9: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

TDiaryBaseとその仲間たち

9

https://github.com/tdiary/tdiary-core/wiki/ClassDiagram (kdmsnr作)

継承ベースであり、責務がたくさん入り組んでいるので、たいへんテストしづらい

Page 10: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

現状の課題(Cont’d)■ “えろぺお問題”(Passengerで動かしたとき)■ http://elpeo.jp/diary/20100921.html■ /diary/aaa などの存在しないファイルへのリクエストでも日記が表示される。

■ /diary → /diary/ のリダイレクトが行われない。■ google_sitemaps.rbなどのENVを直接参照しているプラグインが動かない。

■プラグインでアクションを追加するやつの扱い■ image.rb や trackback.rb, xmlrpc をどうする?• image.rbはなんか動いてる(kakutani.com調べ, on Passenger)

• trackback ...

• xml-rpcさん....

■ (追加アクションをユーザー側で定義するようなhookとかあるといいのかなあ……)

10

Page 11: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

こんなことができるようになるといいな■ プラグインの開発を支援できるといいな

■ 文字列系• (これはUnit Testできればいけそう)

■ 外部サービス連携 (flickrとか,amazonとか)• モジュールとかクラスをつくってUnit Testできると嬉しいんじゃないか

■ 豪快にCGI.newしているやつ• プラグイン側から自由に日記データを取り出したいようなので、tDiary as Library があるとよいのでは

■ アクションの追加・拡張• 本体にhookがあるといいんじゃないか

■ リクエスト/レスポンスに前処理・後処理を用意できないかな

■ キャッシュとかCSRFとか認証とか非機能要件をTDiaryBaseファミリから分離したい

■ filterみたいなのを用意してあげるといいんじゃない?■ Rackのmiddlewareみたいなのを用意できないかなあ

11

Page 12: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

testable的には次のフェイズでの話■ Rack同梱とか?■ RackのCGIアダプタを標準にするとか

12

Page 13: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

本日、合意したいこと■ tDiaryの本体とプラグインは:■ TDiary::RequestとTDiary::Responseに対してプログラミングするようにしていきたい

■レスポンスヘッダの書き出しをRack方式に寄せたい■ Rackで動くことよりもcgi環境でテストできるようにすることの準備が急務■ End-to-End Testのケースを増やしていきたい■ cgi / rack のデュアルテスト環境を用意したい■ (具体的な作戦や手順については次回の開発者会議で!)

■ TDiaryBaseの責務を分割していきたい■Dispatcher.rbを整理していきたい

13

Page 14: tDiaryKaigi-20110215

本資料は クリエイティブ・コモンズ 表示 2.1 日本 ライセンスの下に提供されています。

tdtdsからのフィードバックのメモ■ Rack環境だけで動くような機能はあってもいいと思う■ mod_rewriteが無い環境でのyyyymmdd.html形式でのアクセス用のコードはもう捨ててもいいと思うよ

■ trackbackは過去のものを表示できればいいよ■ “trackbackは死んだ!”

■ 生データとHTMLとの間のRubyオブジェクトがないのは、当時のパフォーマンス的な理由から。今ならあってもいいと思う

■ “passengerで複数の日記って動かせるの?”■ (deploymentを意識した設定ファイルの置きかたを考えたほうがよさそう)■ (tdiary-conf.rackからの移行パスを考えないと……)

■ sp.pathみたいに、theme.pathを用意するのはいいんだけど、webから見えないといけないところが違うよ

14