41
CodeIgniter UnitTest 2013.06.22 CodeIgniter Talk #01 ネコネットデザイン事務所 @NEKOGET

Code ignitertalk 01

Embed Size (px)

Citation preview

Page 1: Code ignitertalk 01

CodeIgniter で UnitTest

2013.06.22  CodeIgniter  Talk  #01  ネコネットデザイン事務所  @NEKOGET

Page 2: Code ignitertalk 01

自己紹介  Self-­‐introducBon

TwiDer  @NEKOGET    

•  初に出会ったCodeIgniterは1.6  •  初にCodeIgnierの事をblogに書い

たのが2008年7月28日  •  平日はいつもCodeIgniterと一緒  

****    過去の発表資料等はスライドシェアにUPしてます      ***

Page 3: Code ignitertalk 01

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

CodeIgniterについて  About  CodeIgniter

 現在の 新バージョン  2.1.3  

hDp://ellislab.com/codeigniter/user-­‐guide/license.html  ライセンス  :  CodeIgniter独自ライセンス  

Page 5: Code ignitertalk 01

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

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

CodeIgniterについて  About  CodeIgniter

•  ライブラリの差し替えやすさが素敵。  

•  腹八分目ぐらいの機能が揃ってる。  

•  システム屋さんよりもWeb屋さんにやさしいヤツ。  

•  「ここから先は自分仕様に好きにやればイイよ」が潔い。  

•  UnitTestは割と大変。(本体にはUnitTestコードが無い)  

MojoMoter,  ExpressionEngineがCodeIgniterで作られている間は企業として製品として必要な品質で更

新され保守されるであろう事を個人的にとても期待しています。  

Page 8: Code ignitertalk 01

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

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

CodeIgniterでUnitTestをするには?  The  maDer  that  you  should  do  to  do  UnitTest  in  CodeIgniter

•  PHPUnitが動く環境の準備  

•  CodeIgniterの設置  

•  CIUnitライブラリを利用します。  

•  CIUnitの入手と設置  

•  CIUnitの設定  

Page 11: Code ignitertalk 01

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

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

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

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

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

CIUnitの設定

CIUnit本体の設置

←ApplicaBon/third_party/の中にCIUnitフォルダを設置

Page 17: Code ignitertalk 01

CIUnitの設定

テストコードを書いていくフォルダを設置  サンプルコードも入っています。

←  testsフォルダはApplicaBon/と   同じ階層に設置

Page 18: Code ignitertalk 01

CIUnitの設定

簡単に設置するshもあります

←  toolsフォルダの中にインストール用のshがあります。今回は省略….

Page 19: Code ignitertalk 01

CIUnitの設定

設定ファイルの設置

TesBngフォルダを作成。unitTest用の設定ファイルはここへ保存。

Page 20: Code ignitertalk 01

CIUnitの実行

まずは動かしてみないとね!  phpunit  を実行。  

Page 21: Code ignitertalk 01

実際に書くテストコード  About  a  test  code  to  really  write

•  UnitTestは始めから!  

•  UnitTestを途中からでも!  

•  CodeIgniterで密結合な構造であるという事  

•  Controllerもやろうと思えばやれる  •  $this-­‐>load-­‐>model()問題  

Page 22: Code ignitertalk 01

UnitTestは書き始めから!  

 自動的にいつでもテストできる  ということは….  

今動く事をいつも保証する  

Page 23: Code ignitertalk 01

UnitTestは書き始めから!  

Case:  今ちょっとだけ、ここのコード  修正したんだけど、  このコードを  

今、リリースして大丈夫?  

Page 24: Code ignitertalk 01

UnitTestは書き始めから!  

今ちょっとだけ、ここのコード  修正したんだけど、  このコードを  

今、リリースして大丈夫?  本当に?

Page 25: Code ignitertalk 01

UnitTestは書き始めから!  →コードがまだ小さいうちから躾ける。  →大きく育ってから潜む潜在バグはなかなかやっかい  →仕様変更と運用中の修正や追加機能…  

 →メンテされていない動いてないはずの動かないコード混在      →理想:いつでも安心して機能追加、修正できる健康なコード  

   

→単体が本当に使いやすいメソッドの育成    →テストしやすいということは、      controllerから、modelから呼び出しやすく、      使いやすいということ。

Page 26: Code ignitertalk 01

UnitTestを途中から  

Case  •  すでに運用がはじまっているコード  •  プロジェクトへの途中参加 ….  

Page 27: Code ignitertalk 01

UnitTestを途中から  •  割と大変。  

–  後からでも書いておかないと!危機感から書き始める。  –  書きやすかったわーなんてことは1回もない。  –  テストが全くないコードの修正をするよりもあったほうが楽。  

•  テストが書きやすいコード  –  使われる事を意識したコード  –  再利用性の高いコード  

•  テストが書きにくいコード  –  長い…複雑…..  –  どう使われるか?が意識されていないっぽい?  –  後で困りそう….    なんかやばそう…..  

Page 28: Code ignitertalk 01

UnitTestを途中から  •  割と大変。  

–  後からでも書いておかないと!危機感から書き始める。  –  書きやすかったわーなんてことは1回もない。  –  テストが全くないコードの修正をするよりもあったほうが楽。  

•  テストが書きやすいコード  –  使われる事を意識したコード  –  再利用性の高いコード  

•  テストが書きにくいコード  –  長い…複雑…..    分割したい  –  どう使われるか?が意識されていないっぽい?…動いてるか確認  –  後で困りそう….    なんかやばそう…..  書き直した方がよさそう  

Page 29: Code ignitertalk 01

UnitTestを途中から  

折れそうな心に栄養  

すでにあるコードにテストを書くための教科書。  

Page 30: Code ignitertalk 01

CodeIgniterでどう書く?

Models,  librariesについて、コードを書くと同時にテストコードを書くようにしています。    CIUnitではControllersのテストも可能ですが、  私自身はあまり書いていません。    Controllerは手続きをしている意識でコードを書いています。    

Page 31: Code ignitertalk 01

CIUnitのUnitTest  PHPUnitの書き方については割愛….  

 

Page 32: Code ignitertalk 01

CIUnitのUnitTest  

テストするメソッドの中で呼ばれるモノを上書きできます。    $this-­‐>load-­‐>model(“model_news”);  $this-­‐>model_newsにModel_news  class  が格納されます。  

Page 33: Code ignitertalk 01

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

CIUnitのUnitTest  テストをする予定のclassの中でloadされ、使われる予定のものは、ほぼすべて差し替えが出来ます。    テストを実行する前、した後に  差し替える、差し戻す。    他のclassを利用した処理についてはダミーのclassが値を返し、テストをしたいclassのロジックそのものに注力します。    

 

Page 35: Code ignitertalk 01

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

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

CIUnitのUnitTest  テストをする予定のclassの中でloadされているもの  ほぼすべて差し替えができます。    

全部を置き換えるのは大変なので、生のまま使えるものはそのまま使っています。    

DBはテストの都度作り直すのではなくて、  テストが実行される都度テストデータをinsertし  テストの実行が終わるとテストデータをdelete  物理削除しています。  (積み上がってるデータの入れ替えめんどい)  

   

Page 38: Code ignitertalk 01

CIUnitのUnitTest  

今のMY課題  •  CodeIgniterでテストを書いた事が無い人のための1歩目と

2歩目を作る仕組み作り  •  Jenkins等との連動とテスト結果の自動検知    

       

 

 

Page 39: Code ignitertalk 01

まとめ  My  impression

Page 40: Code ignitertalk 01

参考資料  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

ご清聴ありがとうございました  Thank  you  for  your  hearing

END