code ignitertalk 01
TRANSCRIPT
![Page 1: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/1.jpg)
CodeIgniter で UnitTest
2013.06.22 CodeIgniter Talk #01 ネコネットデザイン事務所 @NEKOGET
![Page 2: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/2.jpg)
自己紹介 Self-‐introducBon
TwiDer @NEKOGET
• 初に出会ったCodeIgniterは1.6 • 初にCodeIgnierの事をblogに書い
たのが2008年7月28日 • 平日はいつもCodeIgniterと一緒
**** 過去の発表資料等はスライドシェアにUPしてます ***
![Page 3: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/3.jpg)
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 より抜粋
![Page 4: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/4.jpg)
CodeIgniterについて About CodeIgniter
現在の 新バージョン 2.1.3
hDp://ellislab.com/codeigniter/user-‐guide/license.html ライセンス : CodeIgniter独自ライセンス
![Page 5: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/5.jpg)
CodeIgniterについて About CodeIgniter
Githubで開発中されています。 hDps://github.com/EllisLab/CodeIgniter
次の3.0からライセンスがOSL3.0になる予定です hDps://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php
![Page 6: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/6.jpg)
CodeIgniterについて About CodeIgniter
個人的な感想 2008年7月28日から2013年6月22日
4年10か月と 26日目の今日
参考 : hDp://www.benricho.org/nenrei/niB-‐conv.html
![Page 7: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/7.jpg)
CodeIgniterについて About CodeIgniter
• ライブラリの差し替えやすさが素敵。
• 腹八分目ぐらいの機能が揃ってる。
• システム屋さんよりもWeb屋さんにやさしいヤツ。
• 「ここから先は自分仕様に好きにやればイイよ」が潔い。
• UnitTestは割と大変。(本体にはUnitTestコードが無い)
MojoMoter, ExpressionEngineがCodeIgniterで作られている間は企業として製品として必要な品質で更
新され保守されるであろう事を個人的にとても期待しています。
![Page 8: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/8.jpg)
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
![Page 9: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/9.jpg)
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
![Page 10: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/10.jpg)
CodeIgniterでUnitTestをするには? The maDer that you should do to do UnitTest in CodeIgniter
• PHPUnitが動く環境の準備
• CodeIgniterの設置
• CIUnitライブラリを利用します。
• CIUnitの入手と設置
• CIUnitの設定
![Page 11: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/11.jpg)
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版です。
![Page 12: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/12.jpg)
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版を使いたい…..
![Page 13: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/13.jpg)
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
![Page 14: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/14.jpg)
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
![Page 15: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/15.jpg)
CIUnitの設定
(1)CIUnitのダウンロード hDps://bitbucket.org/kenjis/my-‐ciunit/get/CI%202.0.3.zip 2.0.3用ですが、2.1.0でも問題なく動きます。
(2)Downdoadしたファイルを解凍 こんな感じのファイルが入っています
![Page 16: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/16.jpg)
CIUnitの設定
CIUnit本体の設置
←ApplicaBon/third_party/の中にCIUnitフォルダを設置
![Page 17: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/17.jpg)
CIUnitの設定
テストコードを書いていくフォルダを設置 サンプルコードも入っています。
← testsフォルダはApplicaBon/と 同じ階層に設置
![Page 18: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/18.jpg)
CIUnitの設定
簡単に設置するshもあります
← toolsフォルダの中にインストール用のshがあります。今回は省略….
![Page 19: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/19.jpg)
CIUnitの設定
設定ファイルの設置
TesBngフォルダを作成。unitTest用の設定ファイルはここへ保存。
![Page 20: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/20.jpg)
CIUnitの実行
まずは動かしてみないとね! phpunit を実行。
![Page 21: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/21.jpg)
実際に書くテストコード About a test code to really write
• UnitTestは始めから!
• UnitTestを途中からでも!
• CodeIgniterで密結合な構造であるという事
• Controllerもやろうと思えばやれる • $this-‐>load-‐>model()問題
![Page 22: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/22.jpg)
UnitTestは書き始めから!
自動的にいつでもテストできる ということは….
今動く事をいつも保証する
![Page 23: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/23.jpg)
UnitTestは書き始めから!
Case: 今ちょっとだけ、ここのコード 修正したんだけど、 このコードを
今、リリースして大丈夫?
![Page 24: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/24.jpg)
UnitTestは書き始めから!
今ちょっとだけ、ここのコード 修正したんだけど、 このコードを
今、リリースして大丈夫? 本当に?
![Page 25: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/25.jpg)
UnitTestは書き始めから! →コードがまだ小さいうちから躾ける。 →大きく育ってから潜む潜在バグはなかなかやっかい →仕様変更と運用中の修正や追加機能…
→メンテされていない動いてないはずの動かないコード混在 →理想:いつでも安心して機能追加、修正できる健康なコード
→単体が本当に使いやすいメソッドの育成 →テストしやすいということは、 controllerから、modelから呼び出しやすく、 使いやすいということ。
![Page 26: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/26.jpg)
UnitTestを途中から
Case • すでに運用がはじまっているコード • プロジェクトへの途中参加 ….
![Page 27: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/27.jpg)
UnitTestを途中から • 割と大変。
– 後からでも書いておかないと!危機感から書き始める。 – 書きやすかったわーなんてことは1回もない。 – テストが全くないコードの修正をするよりもあったほうが楽。
• テストが書きやすいコード – 使われる事を意識したコード – 再利用性の高いコード
• テストが書きにくいコード – 長い…複雑….. – どう使われるか?が意識されていないっぽい? – 後で困りそう…. なんかやばそう…..
![Page 28: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/28.jpg)
UnitTestを途中から • 割と大変。
– 後からでも書いておかないと!危機感から書き始める。 – 書きやすかったわーなんてことは1回もない。 – テストが全くないコードの修正をするよりもあったほうが楽。
• テストが書きやすいコード – 使われる事を意識したコード – 再利用性の高いコード
• テストが書きにくいコード – 長い…複雑….. 分割したい – どう使われるか?が意識されていないっぽい?…動いてるか確認 – 後で困りそう…. なんかやばそう….. 書き直した方がよさそう
![Page 29: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/29.jpg)
UnitTestを途中から
折れそうな心に栄養
すでにあるコードにテストを書くための教科書。
![Page 30: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/30.jpg)
CodeIgniterでどう書く?
Models, librariesについて、コードを書くと同時にテストコードを書くようにしています。 CIUnitではControllersのテストも可能ですが、 私自身はあまり書いていません。 Controllerは手続きをしている意識でコードを書いています。
![Page 31: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/31.jpg)
CIUnitのUnitTest PHPUnitの書き方については割愛….
![Page 32: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/32.jpg)
CIUnitのUnitTest
テストするメソッドの中で呼ばれるモノを上書きできます。 $this-‐>load-‐>model(“model_news”); $this-‐>model_newsにModel_news class が格納されます。
![Page 33: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/33.jpg)
CIUnitのUnitTest
$this-‐>model_news にclass objectが入っていれば、再格納はせずにそのまま使い回す挙動になります。
$this-‐>model_news = new Model_news_dummy; とすると、以降その仕組みの中では、$this-‐>model_newsはModel_news_dummyが仕事をします。
![Page 34: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/34.jpg)
CIUnitのUnitTest テストをする予定のclassの中でloadされ、使われる予定のものは、ほぼすべて差し替えが出来ます。 テストを実行する前、した後に 差し替える、差し戻す。 他のclassを利用した処理についてはダミーのclassが値を返し、テストをしたいclassのロジックそのものに注力します。
![Page 35: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/35.jpg)
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;
}
![Page 36: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/36.jpg)
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;
}
![Page 37: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/37.jpg)
CIUnitのUnitTest テストをする予定のclassの中でloadされているもの ほぼすべて差し替えができます。
全部を置き換えるのは大変なので、生のまま使えるものはそのまま使っています。
DBはテストの都度作り直すのではなくて、 テストが実行される都度テストデータをinsertし テストの実行が終わるとテストデータをdelete 物理削除しています。 (積み上がってるデータの入れ替えめんどい)
![Page 38: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/38.jpg)
CIUnitのUnitTest
今のMY課題 • CodeIgniterでテストを書いた事が無い人のための1歩目と
2歩目を作る仕組み作り • Jenkins等との連動とテスト結果の自動検知
![Page 39: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/39.jpg)
まとめ My impression
![Page 40: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/40.jpg)
参考資料 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
![Page 41: Code ignitertalk 01](https://reader031.vdocuments.net/reader031/viewer/2022032715/55b157b4bb61eb5e028b46ba/html5/thumbnails/41.jpg)
ご清聴ありがとうございました Thank you for your hearing
END