Upload
takako-miyagawa
View
619
Download
1
Embed Size (px)
Citation preview
CodeIgniter で UnitTest
2013.06.22 CodeIgniter Talk #01 ネコネットデザイン事務所 @NEKOGET
自己紹介 Self-‐introducBon
TwiDer @NEKOGET
• 初に出会ったCodeIgniterは1.6 • 初にCodeIgnierの事をblogに書い
たのが2008年7月28日 • 平日はいつもCodeIgniterと一緒
**** 過去の発表資料等はスライドシェアにUPしてます ***
CodeIgniterについて About CodeIgniter
CodeIgniter is a powerful PHP framework with a very
small footprint, built for PHP coders who need a
simple and elegant toolkit to create full-‐featured
web applicaBons.
CodeIgniterには、フル機能を備えたWebアプリケーションを作
成するためのシンプルでエレガントなツールキットを必要とす
るPHPのコーダーのために作られ、非常に小さなフットプリント
を持つ強力なPHPフレームワークです。
公式サイト: hDp://ellislab.com/codeigniter より抜粋
CodeIgniterについて About CodeIgniter
現在の 新バージョン 2.1.3
hDp://ellislab.com/codeigniter/user-‐guide/license.html ライセンス : CodeIgniter独自ライセンス
CodeIgniterについて About CodeIgniter
Githubで開発中されています。 hDps://github.com/EllisLab/CodeIgniter
次の3.0からライセンスがOSL3.0になる予定です hDps://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php
CodeIgniterについて About CodeIgniter
個人的な感想 2008年7月28日から2013年6月22日
4年10か月と 26日目の今日
参考 : hDp://www.benricho.org/nenrei/niB-‐conv.html
CodeIgniterについて About CodeIgniter
• ライブラリの差し替えやすさが素敵。
• 腹八分目ぐらいの機能が揃ってる。
• システム屋さんよりもWeb屋さんにやさしいヤツ。
• 「ここから先は自分仕様に好きにやればイイよ」が潔い。
• UnitTestは割と大変。(本体にはUnitTestコードが無い)
MojoMoter, ExpressionEngineがCodeIgniterで作られている間は企業として製品として必要な品質で更
新され保守されるであろう事を個人的にとても期待しています。
CodeIgniterのためのUnitTest UnitTest for CodeIgniter
1. CodeIgniter本体のUnit test Classの利用 hDp://codeigniter.jp/user_guide_ja/libraries/unit_tesBng.html
2. Simple Testの利用 hDp://www.simpletest.org/ hDp://mistymagich.wordpress.com/2011/10/24/codeigniter-‐simpletest/
3. PHPUnitの利用 hDp://www.phpunit.de/manual/current/ja/ hDp://www.knollet.com/foostack/ hDps://bitbucket.org/kenjis/my-‐ciunit
CodeIgniterのためのUnitTest UnitTest for CodeIgniter
1. CodeIgniter本体のUnit test Classの利用 hDp://codeigniter.jp/user_guide_ja/libraries/unit_tesBng.html
2. Simple Testの利用 hDp://www.simpletest.org/ hDp://mistymagich.wordpress.com/2011/10/24/codeigniter-‐simpletest/
3. PHPUnitの利用 hDp://www.phpunit.de/manual/current/ja/ hDp://www.knollet.com/foostack/ hDps://bitbucket.org/kenjis/my-‐ciunit
CodeIgniterでUnitTestをするには? The maDer that you should do to do UnitTest in CodeIgniter
• PHPUnitが動く環境の準備
• CodeIgniterの設置
• CIUnitライブラリを利用します。
• CIUnitの入手と設置
• CIUnitの設定
PHPUnitが動く環境の準備
PHPUnitが動く環境の作成 hDp://www.phpunit.de/manual/3.8/ja/ installaBon.html
Pearでインストール $ su # pear upgrade # pear config-‐set auto_discover 1 # pear install pear.phpunit.de/PHPUnit
私が現在使用しているのはPear版です。
Composerでインストール
PHPUnit をプロジェクト単位で導入して開発用の依存関係を設定するには、 phpunit/phpunit への依存情報をプロジェクトの composer.json ファイルに追加します。 次に示すのは 小限の composer.json ファイルの例で、 開発時の PHPUnit 3.8 への依存を定義しています。
{ "require-‐dev": { "phpunit/phpunit": "3.8.*" } }
hDp://phpunit.de/manual/3.8/ja/installaBon.html#installing.upgrading
Composer版を使いたい…..
CIUnit
hDp://www.foostack.com/foostack/ 元々このサイトで公開されているものです。 ソースはbitbucketで見る事が出来ますが 開発は1.7で止まっています。 hDps://bitbucket.org/rafsoaken/ciunit hDps://bitbucket.org/rafsoaken/ciunit/src 2011年3月頃までコミットがあり、 割と 近までコードはメンテされていたようです。
2011年を「 近」というのは微妙かもしれませんが CodeIgniter2.1.0がリリースされたのが2011年11月です hDp://ellislab.com/codeigniter/user-‐guide/changelog.html
CIUnit
hDps://bitbucket.org/kenjis/my-‐ciunit @Kenji_sさんがforkしたものを使用させていただいています。 そこからさらに13件forkされているようです。 現在2.0.3および2.1.3で利用しています
hDp://fukata.org/2011/06/20/codeigniter2-‐ciunit-‐adapt-‐to-‐ci2-‐0-‐2/ @fukataさんによるCIUnit hDps://github.com/fukata/CIUnit-‐for-‐CI2
CIUnitの設定
(1)CIUnitのダウンロード hDps://bitbucket.org/kenjis/my-‐ciunit/get/CI%202.0.3.zip 2.0.3用ですが、2.1.0でも問題なく動きます。
(2)Downdoadしたファイルを解凍 こんな感じのファイルが入っています
CIUnitの設定
CIUnit本体の設置
←ApplicaBon/third_party/の中にCIUnitフォルダを設置
CIUnitの設定
テストコードを書いていくフォルダを設置 サンプルコードも入っています。
← testsフォルダはApplicaBon/と 同じ階層に設置
CIUnitの設定
簡単に設置するshもあります
← toolsフォルダの中にインストール用のshがあります。今回は省略….
CIUnitの設定
設定ファイルの設置
TesBngフォルダを作成。unitTest用の設定ファイルはここへ保存。
CIUnitの実行
まずは動かしてみないとね! phpunit を実行。
実際に書くテストコード About a test code to really write
• UnitTestは始めから!
• UnitTestを途中からでも!
• CodeIgniterで密結合な構造であるという事
• Controllerもやろうと思えばやれる • $this-‐>load-‐>model()問題
UnitTestは書き始めから!
自動的にいつでもテストできる ということは….
今動く事をいつも保証する
UnitTestは書き始めから!
Case: 今ちょっとだけ、ここのコード 修正したんだけど、 このコードを
今、リリースして大丈夫?
UnitTestは書き始めから!
今ちょっとだけ、ここのコード 修正したんだけど、 このコードを
今、リリースして大丈夫? 本当に?
UnitTestは書き始めから! →コードがまだ小さいうちから躾ける。 →大きく育ってから潜む潜在バグはなかなかやっかい →仕様変更と運用中の修正や追加機能…
→メンテされていない動いてないはずの動かないコード混在 →理想:いつでも安心して機能追加、修正できる健康なコード
→単体が本当に使いやすいメソッドの育成 →テストしやすいということは、 controllerから、modelから呼び出しやすく、 使いやすいということ。
UnitTestを途中から
Case • すでに運用がはじまっているコード • プロジェクトへの途中参加 ….
UnitTestを途中から • 割と大変。
– 後からでも書いておかないと!危機感から書き始める。 – 書きやすかったわーなんてことは1回もない。 – テストが全くないコードの修正をするよりもあったほうが楽。
• テストが書きやすいコード – 使われる事を意識したコード – 再利用性の高いコード
• テストが書きにくいコード – 長い…複雑….. – どう使われるか?が意識されていないっぽい? – 後で困りそう…. なんかやばそう…..
UnitTestを途中から • 割と大変。
– 後からでも書いておかないと!危機感から書き始める。 – 書きやすかったわーなんてことは1回もない。 – テストが全くないコードの修正をするよりもあったほうが楽。
• テストが書きやすいコード – 使われる事を意識したコード – 再利用性の高いコード
• テストが書きにくいコード – 長い…複雑….. 分割したい – どう使われるか?が意識されていないっぽい?…動いてるか確認 – 後で困りそう…. なんかやばそう….. 書き直した方がよさそう
UnitTestを途中から
折れそうな心に栄養
すでにあるコードにテストを書くための教科書。
CodeIgniterでどう書く?
Models, librariesについて、コードを書くと同時にテストコードを書くようにしています。 CIUnitではControllersのテストも可能ですが、 私自身はあまり書いていません。 Controllerは手続きをしている意識でコードを書いています。
CIUnitのUnitTest PHPUnitの書き方については割愛….
CIUnitのUnitTest
テストするメソッドの中で呼ばれるモノを上書きできます。 $this-‐>load-‐>model(“model_news”); $this-‐>model_newsにModel_news class が格納されます。
CIUnitのUnitTest
$this-‐>model_news にclass objectが入っていれば、再格納はせずにそのまま使い回す挙動になります。
$this-‐>model_news = new Model_news_dummy; とすると、以降その仕組みの中では、$this-‐>model_newsはModel_news_dummyが仕事をします。
CIUnitのUnitTest テストをする予定のclassの中でloadされ、使われる予定のものは、ほぼすべて差し替えが出来ます。 テストを実行する前、した後に 差し替える、差し戻す。 他のclassを利用した処理についてはダミーのclassが値を返し、テストをしたいclassのロジックそのものに注力します。
CIUnitのUnitTest //テスト用に差し替える public funcBon setUp() {
parent::setUp(); //まずload include正しいclass fileがincludeされます $this-‐>CI-‐>load-‐>model('model_news'); $this-‐>CI-‐>load-‐>model('model_auth'); $this-‐>CI-‐>load-‐>library(’session’); //差し替え。 $this-‐>CI-‐>model_news = new Model_news_dummy; $this-‐>CI-‐>model_auth = new Model_auth_dummy; $this-‐>CI-‐>session = new Session_dummy;
}
CIUnitのUnitTest //テスト後差し戻す public funcBon tearDown () {
parent::tearDown (); //差し戻し。 必ずloadしているから //正しいclassのファイルはincludeされています。 $this-‐>CI-‐>model_news = new Model_news; $this-‐>CI-‐>model_auth = new Model_auth; $this-‐>CI-‐>session = new CI_Session;
}
CIUnitのUnitTest テストをする予定のclassの中でloadされているもの ほぼすべて差し替えができます。
全部を置き換えるのは大変なので、生のまま使えるものはそのまま使っています。
DBはテストの都度作り直すのではなくて、 テストが実行される都度テストデータをinsertし テストの実行が終わるとテストデータをdelete 物理削除しています。 (積み上がってるデータの入れ替えめんどい)
CIUnitのUnitTest
今のMY課題 • CodeIgniterでテストを書いた事が無い人のための1歩目と
2歩目を作る仕組み作り • Jenkins等との連動とテスト結果の自動検知
まとめ My impression
参考資料 Reference materials
CodeIgniter 公式サイト hDp://ellislab.com/codeigniter
Github / CodeIgniter hDps://github.com/EllisLab/CodeIgniter/
CodeIgniter+simpleTest hDp://mistymagich.wordpress.com/2011/10/24/codeigniter-‐simpletest/
my_CIUnit hDps://bitbucket.org/kenjis/my-‐ciunit
PHPUnitマニュアル hDp://phpunit.de/manual/3.8/ja/index.html hDp://phpunit.de/manual/3.8/ja/installaBon.html#installing.upgrading
ComporserでPHPUnitのインストール hDp://qiita.com/suin/items/81085381c4281e498cde
ご清聴ありがとうございました Thank you for your hearing
END