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

Code ignitertalk 01