SlideShare a Scribd company logo
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

More Related Content

PPTX
QtでHello, World!!
PDF
Open binder
PDF
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
PPT
mobylet ケータイサイト30分クッキング
PDF
Flutter のリアクティブ戦略 set state 〜 redux まで
PDF
Binderのはじめの一歩とAndroid
PDF
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
PDF
JIT for PHP を試した
QtでHello, World!!
Open binder
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
mobylet ケータイサイト30分クッキング
Flutter のリアクティブ戦略 set state 〜 redux まで
Binderのはじめの一歩とAndroid
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
JIT for PHP を試した

Viewers also liked (10)

PPTX
CodeIgniter4 (PHPカンファレンス関西2016 懇親会LT)
PDF
CodeIgniter東京勉強会 2011.05.14
PDF
CodeIgniter をモダンに改造してみた
PDF
CodeIgniter入門
PDF
Code igniter + ci phpunit-test
PDF
Codeigniter4の比較と検証
PDF
Codeigniter3フレームアップデート
PDF
PHPUnitでリファクタリング
PPTX
PHPCON fukuoka 2015 CodeIgniter update
PDF
Code igniterを初めて使うときにはまった4つのポイント
CodeIgniter4 (PHPカンファレンス関西2016 懇親会LT)
CodeIgniter東京勉強会 2011.05.14
CodeIgniter をモダンに改造してみた
CodeIgniter入門
Code igniter + ci phpunit-test
Codeigniter4の比較と検証
Codeigniter3フレームアップデート
PHPUnitでリファクタリング
PHPCON fukuoka 2015 CodeIgniter update
Code igniterを初めて使うときにはまった4つのポイント
Ad

Similar to Code ignitertalk 01 (20)

PDF
Php勉強会資料20090629
PDF
Code igniterでテスト駆動開発 資料作成中
PDF
PHPカンファレンス関西 2011
PDF
はじめてのCodeIgniter
PDF
Testing PHP extension on Travis CI
PDF
phpmatsuri2013 LT大会 資料
PDF
PHPUnit でテスト駆動開発を始めよう
PDF
PHP勉強会 #51
PPT
PHP agile test tips
PPT
ビジネス的に高価値なアジャイルテスト
PDF
Getting Started with Testing using PHPUnit
PDF
あなたの安心を高速に守る Container-based CI
PDF
PHPUnitTest勉強会スライド
PDF
PHPUnitTest勉強会スライド
PPT
Code Igniterについて
PDF
2011 PHPカンファレンス関西 懇親会LT
PDF
最近のCodeIgniter 2014.06.19
PDF
CodeIgniterによるPhwittr
PDF
CodeIgniter 貴方はどのフレームワークを使うべきか?
PDF
Introduction to Continuous Test Runner MakeGood
Php勉強会資料20090629
Code igniterでテスト駆動開発 資料作成中
PHPカンファレンス関西 2011
はじめてのCodeIgniter
Testing PHP extension on Travis CI
phpmatsuri2013 LT大会 資料
PHPUnit でテスト駆動開発を始めよう
PHP勉強会 #51
PHP agile test tips
ビジネス的に高価値なアジャイルテスト
Getting Started with Testing using PHPUnit
あなたの安心を高速に守る Container-based CI
PHPUnitTest勉強会スライド
PHPUnitTest勉強会スライド
Code Igniterについて
2011 PHPカンファレンス関西 懇親会LT
最近のCodeIgniter 2014.06.19
CodeIgniterによるPhwittr
CodeIgniter 貴方はどのフレームワークを使うべきか?
Introduction to Continuous Test Runner MakeGood
Ad

More from Takako Miyagawa (13)

PPTX
OmegaTでドキュメント翻訳
PPTX
CodeIgniter4 PHPCon 2016
PPTX
Idcfクラウド 初心者の事始め(2)資料
PPTX
Idcfクラウド 初心者の事始め
PPTX
もっとドキュメントが日本語になりますように
PDF
Fuelphp & codeigniterユーザの集い
PDF
Net commons3 開発環境
PDF
Net commons3 研究会 2014 0616
PDF
gitを使って、レポジトリの一部抽出forkしてみました
PPTX
CodeIgniterのライセンスについて
PDF
Bear.sunday meetup #2 自己紹介LT
PDF
PHPMATSURI2011 LT大会
PDF
CodeIgniter Con Tokyo 2011 資料
OmegaTでドキュメント翻訳
CodeIgniter4 PHPCon 2016
Idcfクラウド 初心者の事始め(2)資料
Idcfクラウド 初心者の事始め
もっとドキュメントが日本語になりますように
Fuelphp & codeigniterユーザの集い
Net commons3 開発環境
Net commons3 研究会 2014 0616
gitを使って、レポジトリの一部抽出forkしてみました
CodeIgniterのライセンスについて
Bear.sunday meetup #2 自己紹介LT
PHPMATSURI2011 LT大会
CodeIgniter Con Tokyo 2011 資料

Code ignitertalk 01