第2回テスト駆動開発入門勉強会に行ってきました

今回お邪魔させてもらった勉強会はこれ↓
http://partake.in/events/4013e528-80f4-4df6-9d2b-92abeb44014d


進め方は…


隣の人と本読みつつ

「こういうことじゃね?」って話しつつ

本に載ってるコードをペアプロで写経していく感じ


ペア毎に好きなペースで読んでいって実際にTDDを体験していこう感じでした。
最初は「ペアプロしたことないからどうやってやればいいのかわからん…」「本に沿ってすすめるって…どうすればいいの?」って感じでしたが、ホストの方々がそういうペアをまわって直接「こんな感じでどうですか〜?」って助けてくださったので戸惑ったのは最初だけでした。
知らない人とペアプロ…ってちょっとハードル高い感じしましたが、組んだ方がとても話しやすく色々意見交換できたり、ペアプロ中も各々楽しみながらマイペースにやるって感じだったので楽しめました。


成果は1時間で4章までさくっと進めた感じ。
ペアプロしながら意見交換しながらだと流石に早い。


1時間ほどペアプロやったら全員でディスカッション。
話題は↓。

・1章でグリーンのままコードが変わっていっているのはTDDっぽくないかも
⇒リファクタであればよいかとおもう。
 テストが通るって状態のままコードの品質だけが高まっていくって考え方。

・4章とかでいきなりテストコード書き換えてるの怖いよねー
⇒それが怖いならリファクタ前と後のコードを残しといて、どっちも通るよねってことを確認した後にテストコードを変えたらどうだろう?
⇒そもそもTDDでテストがちゃんとテストされているって保障がないのが怖いかもー
⇒TDDってあくまで開発技法なのでテスト技法じゃないのよね。。。そこはソフトウェアテスト技法で担保するのがよいおおもう。

ペアプロするときリスト書くのどうやってる?二人してコードに注目しちゃうんだよね。
⇒そもそもリスト書くって何?
⇒本(今回写経したテスト駆動開発入門)に書いてあるTODOみたいなの。
 たとえばコード上必要でも本質的に必要か不必要かをちゃんと誘導してくれる人がリスト書く人がやる。
 参考→http://ja.wikipedia.org/wiki/%E3%83%9A%E3%82%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
⇒リスト出す人は付箋とか使ってコードに注目しないようにするとうまくやれたことがあるよー。
⇒逆にコードに注目するのは悪くないと思うよー。お互い「○○やてるよー」「何々やりたいよー」ってペア同士コミュニケーションとるのが良い!一番だめなのは二人とも黙っちゃうこと!手止まっちゃうしお互い何してるのかわからないからペアプロの意味なくなっちゃう。

ペアプロのメリットって?
⇒時間短縮になる。例えばお互い6時間かかるのが二人で6時間になるよー
⇒集中できるから一人でやるより生産性あがるよ。
⇒お互い監視し合ってるからコードの品質も上がるよ。やり方にもよるけどリアルタイムコードrビューみたいな感じだし。
⇒うまい人とそうでもない人が組むといいよ。教育って目的もあるからね。


●個人的な所感
・知らない人とペアプロめっちゃ楽しい。
「これってどういうことなんだろう?」「こういうことじゃね?」って感じでお互い色々議論しながら進められるので楽しいし理解が早い。
・TDDは慣れるまでちょっとコツがいるかも。
「レッド→グリーン→リファクタリング」の流れが慣れるまでちょっと大変かもしれなけど、慣れたら楽しくなると思う。
何よりその場でリファクタできるってのは一番イイ。
・TDDとUTはやっぱり別物。
ごっちゃになってる感じがしたのですが、やっぱり「開発手法」と「テスト手法」なので別物。
テスト駆動開発入門がちょっと読み辛い…
勉強会のことじゃないですが…
途中何度か「これってどういう意味なんだろう?」ってなった。
他の人たちもそれは同じのようで、ディスカッションの時にも軽く話題になりました。
ケント・ベックの和訳本を読む時は気をつけましょう。
・ピザ美味しかった。

次も楽しみにしてます。

jQuery使用時のIE対応色々

色々今回詰まったりしたのでmemo。
確認ブラウザは以下。
IE:7、8
FF:3.6
opera:10.63
safari:5.0.2

●DOMの表示・非表示方法
やり方2通りほどあるのでどっちかで出来なかったら方向転換する
1.style="display: none"付ける
これIEで成功しない時とかある。
なんでだろ…FF、safarioperaでは動くくせに。。。
ついでにコレも2通りやり方あったり。
$('dom').attr('style', 'display: none')

$('dom').css('display: none')
IEはattrの方じゃないと効かなかった。。。
全てのタグがそうかはわからないけど。

2.DOM生成・削除する
bindする必要無いならこっちの方がイイ。
イベントくっつける時はIEだとbindしても動いてくれないのでliveとか使わないとダメ。
動的にDOM作って、かつliveとか出来ないときどうするんだろうね…

●type="file"の表示をクリアする方法
コレもIEだけ動いてくれなくて困った。
普通なら
$('input[type=file]').val('');
とかやるけど、IEこれだとクリアしてくれない。。
なのでここでは生JS使用。
$('input[type=file]')[0].form.reset();
どうやらjQueryでform.resetって出来ない様子なので。。
ちなみにDojo使ってると普通にID指定の取得で出来る。
dojo.byId('file_id').value = "";
これ軽くハマったー。。。

(2011/4/20 追記)
●attrやcssについて。
display: noneを付ける方じゃなくて消す方で追記。
IE8だと↓こんなの効かなかったり。
$('target').attr('style', '');
IE7で動くのに…
ということでココだけは生JS使用しないとダメ。
jQuery使うなら↓こんな感じ?
$('target')[0].style.display = '';
普通にgetElementByIdの方が分かりやすいか…まぁいいや。

MacOSXでJenkins

とりあえず単体での動かし方。
途中色々エラーがでたんだが結局なぜでたのかわからないまま最後にはちゃんと入れられたのでスルー。

公式からwarもらってくる

http://jenkins-ci.org/

テキトウなところにwarポイする。

起動。

java -jar jenkins.war --prefix=/jenkins --ajp13Port=-1

アクセス。

http://localhost:8080/jenkins

めっさ簡単。
RoRの鯖みたいな感じ。
後はapacheと連携させて常時起動にするだけ…
ここがまだ出来ないんだが…
ひとまずプラグインの設定とかテスト連携とか色々検証出来ればよいので、これでいいや。

関数に見えて言語構文なisset

いつものようにテキトーに書いてたらエラー出た件。

protected function _isCancel() {
    $testArg = $this->_getParam('cancel');
    return ($this->_getParam('cancel') && isset($this->_getParam('cancel'))) ? true : false;
}

こんなの書いたらエラー出た。

Fatal error: Can't use method return value in write context in path/to/phpfile.php on line  xx

何が悪いんだと思ったら、どうやら

isset($this->_getParam('cancel'))

こいつの書き方が悪かったらしい。

なぜかと思って調べてみたら
http://pentan.info/php/empty_func.html
にempty関数を題材にして同じこと書いてあった。
issetは言語構文だからメソッド渡しちゃだめよ。ちゃんと変数わたしてあげてねって話。
言語構文だからっていう理由が最初わからなかったけど、考えてみたらissetってシンボルテーブル見にいくからだね。
「その変数が存在しているか、定義しているか」も見るから変数指定してあげなきゃだめなのよね。
で、シンボルテーブル見に行くから言語構文なのよね。
久々に納得。

Struts2のExceptionMappings

ActionのアノテーションでException捕まえる方法。

@Results({
@Result(name = "upload", location = "upload-json.jsp"),
// @Result(name = "input", location = "error.jsp")
@Result(name = "jsonerror", location = "error.jsp"),
@Result(name = "input", location = "error2.jsp")
})
@ExceptionMappings({
@ExceptionMapping(exception = "org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException", result = "jsonerror")
})

Xdebugを使えばzvalの情報を見れる

Xdebugを使えばzvalの情報を見れる

どうしても↓で言っている事をちゃんと目に見えて実証したかったので色々と調べていたら見つけました。
http://programming-magic.com/?id=140

http://d.hatena.ne.jp/kanonji/20090120/1232461376

一回これを使って全部見てみたりしたいです。