SlideShare une entreprise Scribd logo
1  sur  47
EC-CUBE + PHPUnit で
 実践テスト駆動開発
         2010/6/26(土)
    有限会社Loop AZ 大河内健太郎
自己紹介
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日

•   FreeBSD / Mac OS X / Solaris 使ってます
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日

•   FreeBSD / Mac OS X / Solaris 使ってます

•   本業は Java のフレームワーク開発とか
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日

•   FreeBSD / Mac OS X / Solaris 使ってます

•   本業は Java のフレームワーク開発とか

•   Emacs23 のアイコン作りました
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日

•   FreeBSD / Mac OS X / Solaris 使ってます

•   本業は Java のフレームワーク開発とか

•   Emacs23 のアイコン作りました
自己紹介
•   名前: 大河内健太郎(id:nanasess) 年齢: 33才

•   出身: 愛知県

•   前職: 寿司屋の板前

•   資格: 調理師・ふぐ処理師

•   EC-CUBEとの出会いは初回リリース当日

•   FreeBSD / Mac OS X / Solaris 使ってます

•   本業は Java のフレームワーク開発とか

•   Emacs23 のアイコン作りました
PHPUnitとは
PHPUnitとは
• テスティングフレームワーク
PHPUnitとは
• テスティングフレームワーク
• テストプログラムを実行し確認するた
 めの仕組み
PHPUnitとは
• テスティングフレームワーク
• テストプログラムを実行し確認するた
 めの仕組み

• プログラマーの精神安定剤
PHPUnitとは
• テスティングフレームワーク
• テストプログラムを実行し確認するた
 めの仕組み

• プログラマーの精神安定剤
• レガシーコードをカイゼン
PHPUnitとは
• テスティングフレームワーク
• テストプログラムを実行し確認するた
 めの仕組み

• プログラマーの精神安定剤
• レガシーコードをカイゼン
• 変更の恐怖を開放して自信をつける
セットアップ
   •   前提

       •   cli 版の PHP がインストールされていること

       •   --with-pear で構築されていること

1. pear.phpunit.de を channel に追加
> pear channel-discover pear.phpunit.de

2. phpunit/PHPUnit をインストール
> pear install phpunit/PHPUnit


             参考: http://www.phpunit.de/manual/3.4/ja/installation.html
EC-CUBEで使うためには
   • EC-CUBE は SVN からチェックアウト
    • 2.4.4 からは同梱します!
   • EC-CUBE をインストールしておくこと
1. svn からチェックアウト
> svn checkout http://svn.ec-cube.net/open/tags/eccube-2.4.3

2. EC-CUBE をインストール
3. テストディレクトリへ移動
> cd eccube-2.4.3/test
TestSuite の実行

  • 動作に問題が無いか確認する
  • 必ず test ディレクトリから実行
TestSuite を実行
> phpunit TestSuite.php TestSuite
PHPUnit 3.4.14 by Sebastian Bergmann.

.....................

Time: 1 second, Memory: 12.50Mb

OK (21 tests, 24 assertions)
PHPUnit ことはじめ
PHPUnit ことはじめ
•   テンポが大事! 楽しく書こう!

    •   必ずしもテストファーストでなくて良い

•   メソッドベースとシナリオベース

•   実装コード以上に見やすく

•   サンプルコードの役割も果す

•   苦しいのは最初だけ. 書かなきゃずっと不安を
    抱える羽目に
PHPUnit の基本
PHPUnit の基本
•   テストメソッドは必ず test で始まる関数名をつける

•   assertEquals() などの関数で, 予想される結果と実際の結果を確認する

    •   結果が同じであればテスト成功) assertEquals(‘hoge’, ‘hoge’);

    •   結果が異なる場合はテスト失敗) assertEquals(‘hoge’, ‘boke’);

•   setUp() は必ず各テストメソッドの実行前に実行される

    •   データの前準備やトランザクションの開始

•   tearDown() は必ず各テストメソッドの実行後に実行される

    •   後処理やトランザクションのロールバック
テスト駆動開発1
テスト駆動開発1
•   EC-CUBE管理画面のテストを書いてみよう

•   まずは必ず成功する最小のテストを書く

•   実行してテストが成功することを確認する
テスト駆動開発1
    •   EC-CUBE管理画面のテストを書いてみよう

    •   まずは必ず成功する最小のテストを書く

    •   実行してテストが成功することを確認する


test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php

require_once("../html/require.php");
require_once("../data/class/pages/admin/design/LC_Page_Admin_Design_Expart.php");
require_once("PHPUnit/Framework.php");

class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase {

    function testInit() {
        // まずは必ず成功させる
        $this->assertEquals(true, true);
    }
}
テスト駆動開発2
テスト駆動開発2
• 更にテストを書いてテストが失敗する
 ことを確認する

• 何らかのバグで失敗するはずのテスト
 が成功してしまい, 気づかないのを防ぐ
 ため

• テスト成功と失敗を繰替えして開発を
 進める
テストの失敗を確認
data/class/page/admin/desigin/LC_Page_Admin_design_Expart.php

class LC_Page_Admin_Design_Expart extends LC_Page {

    function init() {
        // do nothing...
    }

    function process() {
        // do nothing...
    }
}
test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php

class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase {

    function setUp() {
        $this->objPage = new LC_Page_Admin_Design_Expart();
        $this->objPage->init();
    }

    function testInit() {
        $expected = “高度な設定”;
        $actual = $this->objPage->tpl_subtitle;
        // 失敗を確認
        $this->assertEquals($expected, $actual);
    }
}
テスト駆動開発3
テスト駆動開発3
•   細かくテストしながら本体のコードを仕上げてい
    く

•   テストが見にくくなったらリファクタリング

•   バグが見つかったら画面で確認する代わりにテス
    トを書く
test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php

class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase {

    function setUp() {
        $this->objPage = new LC_Page_Admin_Design_Expart();
        $this->objPage->init();
    }

    // 何をしているテストか解るように
    function testRegister() {
        $this->setParam(“サンプルデータ1”, “サンプルデータ2”);
        $this->argunment = “register 関数の引数”;
        $this->expected = “register 関数の予想する結果”;

        $this->scenario();
        $this->verify();
    }
    // DBへのテスト用データ投入処理など
    function setParam($value1, $value2) {
        // ...
    }
    // register 関数のサンプルコードになるように
    function scenario() {
        $this->actual = $this->objPage->register($this->argunment);
    }
    // 検証コードは共通化しやすい
    function verify() {
        $this->assertEquals($this->expected, $this->actual);
    }
}
Pageクラスのテスト
Pageクラスのテスト
•   インナークラスを使う

•   オーバーライドは積極的に

    •   認証や sendRedirect() はオーバーライド
        してしまおう

•   1テスト1フローで小さくテストすること
    を心掛ける
data/class/page/admin/desigin/LC_Page_Admin_design_Expart.php

class LC_Page_Admin_Design_Expart extends LC_Page {

    function process() {
        // 認証
        $this->authorization();

        switch ($_POST['mode']) {
        case "register":
            // 本番ではちゃんとエラーチェックすること
            $this->register($_POST['data']);
            $this->sendRedirect($this->getLocation(“/admin/index.php”));
            return;
            break;
        default:
        }
        // Smartyの assign
        $this->assignView();
    }

    function authorization() {
        SC_Utils_Ex::sfIsSuccess(new SC_Session());
    }

    function assignView() {
        $objView = new SC_AdminView();
        $objView->assignobj($this);
        $objView->display(MAIN_FRAME);
    }
}
test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php

class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase {

    function setUp() {
        $this->objPage = new LC_Page_Admin_Design_Expart_Mock();
        $this->objPage->init();
    }

    function testProcessBy登録時() {
        $_POST[‘mode’] = ‘register’;
        $_POST[‘data’] = ‘data’;

        $this->objPage->process();
        // 遷移先を確認
        $this->assertEquals(“http://example.jp/admin/index.php”,
                            $this->objPage->location);
    }
}
// ユーザー認証と Smarty の assign, sendRedirect はオーバーライドして遷移先の URL を確認
class LC_Page_Admin_Design_Expart_Mock extends LC_Page_Admin_Design_Expart {

    function authorization() {
        // quiet.
    }

    function assignView() {
        // quiet.
    }

    function sendRedirect($location) {
        $this->location = $location;
    }
}
美しく書くために
美しく書くために
•   テストメソッドにロジックは書かない

    •   scenario() や verify() を活用

•   テストが書きにくいと感じたらリファクタリン
    が必要な証拠

•   テストクラスは冗長に書く

•   why なコメントを積極的に書く

•   関数名に日本語使っちゃえ!

•   美しく書ければモチベーションアップ!
もっと活用
もっと活用
•   コードカバレッジ

    •   phpunit --coverege-html ./outputdir TestCase
•   継続的インテグレーション

    •   Maven
        •   http://maven.apache.org/
    •   hudson
        •   http://hudson-ci.org/
参考
• JUnit実践講座
 • http://www.objectclub.jp/community/
    memorial/homepage3.nifty.com/masarl/
    article/junit.html
• PHPUnitのマニュアル
 • http://www.phpunit.de/manual/3.4/ja/
宣伝
•   http://launchpad.net/xdo
    •   Java の JDO (Java Data Object - JSR243) を
        意識した O/R Mapper

    •   複雑に JOIN した SQL でも使える!

    •   EC-CUBE の次期バージョンに入れたい...

    •   鋭意開発中!
宣伝2

• 開発コミッター募集中!!
• EC-CUBE を一緒に開発しましょう!
• https://www.ec-cube.net/comitter/
  index.php
質疑応答
ご静聴ありがとう
ございました!

Contenu connexe

Tendances

(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめMitsutoshi Kiuchi
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようPythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようShinya Takamaeda-Y
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについてmoai kids
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話Preferred Networks
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケットTakaaki Hoyo
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
第二回CTF勉強会資料
第二回CTF勉強会資料第二回CTF勉強会資料
第二回CTF勉強会資料Asuka Nakajima
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Hiroki Nakahara
 
ドキュメントシステムはこれを使え2015年版
ドキュメントシステムはこれを使え2015年版ドキュメントシステムはこれを使え2015年版
ドキュメントシステムはこれを使え2015年版Keiichiro Shikano
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxTakayuki Shimizukawa
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門KnowledgeGraph
 

Tendances (20)

(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようPythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
No skk, no life.
No skk, no life.No skk, no life.
No skk, no life.
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
第二回CTF勉強会資料
第二回CTF勉強会資料第二回CTF勉強会資料
第二回CTF勉強会資料
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
 
ドキュメントシステムはこれを使え2015年版
ドキュメントシステムはこれを使え2015年版ドキュメントシステムはこれを使え2015年版
ドキュメントシステムはこれを使え2015年版
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinx
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門
 

Similaire à EC-CUBE + PHPUnit で 実践テスト駆動開発

T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~normalian
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12Ryuji Yamashita
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koakamiyam .
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript cihisame64
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングKazuki Takai
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100ichikaway
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 

Similaire à EC-CUBE + PHPUnit で 実践テスト駆動開発 (20)

T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Haikara
HaikaraHaikara
Haikara
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koa
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript ci
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 

Plus de Kentaro Ohkouchi

PHP7.3へのバージョンアップ対策
PHP7.3へのバージョンアップ対策PHP7.3へのバージョンアップ対策
PHP7.3へのバージョンアップ対策Kentaro Ohkouchi
 
中小ネットショップの 軽減税率対策を学ぼう!
中小ネットショップの 軽減税率対策を学ぼう!中小ネットショップの 軽減税率対策を学ぼう!
中小ネットショップの 軽減税率対策を学ぼう!Kentaro Ohkouchi
 
他人事ではないぞ!
ECサイトのセキュリティ強化
他人事ではないぞ!
ECサイトのセキュリティ強化他人事ではないぞ!
ECサイトのセキュリティ強化
他人事ではないぞ!
ECサイトのセキュリティ強化Kentaro Ohkouchi
 
ネットショップのアクセス解析超入門
ネットショップのアクセス解析超入門ネットショップのアクセス解析超入門
ネットショップのアクセス解析超入門Kentaro Ohkouchi
 
EC-CUBEデザインカスタマイズの ベストプラクティス!
EC-CUBEデザインカスタマイズの ベストプラクティス!EC-CUBEデザインカスタマイズの ベストプラクティス!
EC-CUBEデザインカスタマイズの ベストプラクティス!Kentaro Ohkouchi
 
EC-CUBE と PayPal の縁結び
EC-CUBE と PayPal の縁結びEC-CUBE と PayPal の縁結び
EC-CUBE と PayPal の縁結びKentaro Ohkouchi
 
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョンKentaro Ohkouchi
 
EC-CUBE次期バージョンから、しっかり学ぶ Symfony
EC-CUBE次期バージョンから、しっかり学ぶ SymfonyEC-CUBE次期バージョンから、しっかり学ぶ Symfony
EC-CUBE次期バージョンから、しっかり学ぶ SymfonyKentaro Ohkouchi
 
EC-CUBE と PayPal は仲良しか?
EC-CUBE と PayPal は仲良しか?EC-CUBE と PayPal は仲良しか?
EC-CUBE と PayPal は仲良しか?Kentaro Ohkouchi
 
フロントエンドだけで完結! checkout.js でペイパろう
フロントエンドだけで完結! checkout.js でペイパろうフロントエンドだけで完結! checkout.js でペイパろう
フロントエンドだけで完結! checkout.js でペイパろうKentaro Ohkouchi
 
EC-CUBE API プラグイン勉強会
EC-CUBE API プラグイン勉強会EC-CUBE API プラグイン勉強会
EC-CUBE API プラグイン勉強会Kentaro Ohkouchi
 
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介Kentaro Ohkouchi
 
EC-CUBE最新情報!3.1開発進捗説明会の報告します!
EC-CUBE最新情報!3.1開発進捗説明会の報告します!EC-CUBE最新情報!3.1開発進捗説明会の報告します!
EC-CUBE最新情報!3.1開発進捗説明会の報告します!Kentaro Ohkouchi
 
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?Kentaro Ohkouchi
 
EC-CUBE をアップロードしよう!
EC-CUBE をアップロードしよう!EC-CUBE をアップロードしよう!
EC-CUBE をアップロードしよう!Kentaro Ohkouchi
 
超簡単になった EC-CUBE3 のインストール
超簡単になった EC-CUBE3 のインストール超簡単になった EC-CUBE3 のインストール
超簡単になった EC-CUBE3 のインストールKentaro Ohkouchi
 
PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!Kentaro Ohkouchi
 
EC-CUBE on SQL データベース勉強会
EC-CUBE on SQL データベース勉強会EC-CUBE on SQL データベース勉強会
EC-CUBE on SQL データベース勉強会Kentaro Ohkouchi
 
よりよい UI/UX を創るためのアクセス解析
よりよい UI/UX を創るためのアクセス解析よりよい UI/UX を創るためのアクセス解析
よりよい UI/UX を創るためのアクセス解析Kentaro Ohkouchi
 

Plus de Kentaro Ohkouchi (20)

PHP7.3へのバージョンアップ対策
PHP7.3へのバージョンアップ対策PHP7.3へのバージョンアップ対策
PHP7.3へのバージョンアップ対策
 
中小ネットショップの 軽減税率対策を学ぼう!
中小ネットショップの 軽減税率対策を学ぼう!中小ネットショップの 軽減税率対策を学ぼう!
中小ネットショップの 軽減税率対策を学ぼう!
 
他人事ではないぞ!
ECサイトのセキュリティ強化
他人事ではないぞ!
ECサイトのセキュリティ強化他人事ではないぞ!
ECサイトのセキュリティ強化
他人事ではないぞ!
ECサイトのセキュリティ強化
 
ネットショップのアクセス解析超入門
ネットショップのアクセス解析超入門ネットショップのアクセス解析超入門
ネットショップのアクセス解析超入門
 
EC-CUBEデザインカスタマイズの ベストプラクティス!
EC-CUBEデザインカスタマイズの ベストプラクティス!EC-CUBEデザインカスタマイズの ベストプラクティス!
EC-CUBEデザインカスタマイズの ベストプラクティス!
 
EC-CUBE と PayPal の縁結び
EC-CUBE と PayPal の縁結びEC-CUBE と PayPal の縁結び
EC-CUBE と PayPal の縁結び
 
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン
開発者視点で選ぶ「2系」と「3系」。
そして3系の次期バージョン
 
EC-CUBE次期バージョンから、しっかり学ぶ Symfony
EC-CUBE次期バージョンから、しっかり学ぶ SymfonyEC-CUBE次期バージョンから、しっかり学ぶ Symfony
EC-CUBE次期バージョンから、しっかり学ぶ Symfony
 
EC-CUBE と PayPal は仲良しか?
EC-CUBE と PayPal は仲良しか?EC-CUBE と PayPal は仲良しか?
EC-CUBE と PayPal は仲良しか?
 
フロントエンドだけで完結! checkout.js でペイパろう
フロントエンドだけで完結! checkout.js でペイパろうフロントエンドだけで完結! checkout.js でペイパろう
フロントエンドだけで完結! checkout.js でペイパろう
 
EC-CUBE API プラグイン勉強会
EC-CUBE API プラグイン勉強会EC-CUBE API プラグイン勉強会
EC-CUBE API プラグイン勉強会
 
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
 
EC-CUBE最新情報!3.1開発進捗説明会の報告します!
EC-CUBE最新情報!3.1開発進捗説明会の報告します!EC-CUBE最新情報!3.1開発進捗説明会の報告します!
EC-CUBE最新情報!3.1開発進捗説明会の報告します!
 
EC-CUBE はいいぞ
EC-CUBE はいいぞEC-CUBE はいいぞ
EC-CUBE はいいぞ
 
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?
俺、エバンジェリストだけど、 EC-CUBEについて何か聞きたいことある?
 
EC-CUBE をアップロードしよう!
EC-CUBE をアップロードしよう!EC-CUBE をアップロードしよう!
EC-CUBE をアップロードしよう!
 
超簡単になった EC-CUBE3 のインストール
超簡単になった EC-CUBE3 のインストール超簡単になった EC-CUBE3 のインストール
超簡単になった EC-CUBE3 のインストール
 
PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!
 
EC-CUBE on SQL データベース勉強会
EC-CUBE on SQL データベース勉強会EC-CUBE on SQL データベース勉強会
EC-CUBE on SQL データベース勉強会
 
よりよい UI/UX を創るためのアクセス解析
よりよい UI/UX を創るためのアクセス解析よりよい UI/UX を創るためのアクセス解析
よりよい UI/UX を創るためのアクセス解析
 

EC-CUBE + PHPUnit で 実践テスト駆動開発

  • 1. EC-CUBE + PHPUnit で 実践テスト駆動開発 2010/6/26(土) 有限会社Loop AZ 大河内健太郎
  • 3. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才
  • 4. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県
  • 5. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前
  • 6. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師
  • 7. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日
  • 8. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日 • FreeBSD / Mac OS X / Solaris 使ってます
  • 9. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日 • FreeBSD / Mac OS X / Solaris 使ってます • 本業は Java のフレームワーク開発とか
  • 10. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日 • FreeBSD / Mac OS X / Solaris 使ってます • 本業は Java のフレームワーク開発とか • Emacs23 のアイコン作りました
  • 11. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日 • FreeBSD / Mac OS X / Solaris 使ってます • 本業は Java のフレームワーク開発とか • Emacs23 のアイコン作りました
  • 12. 自己紹介 • 名前: 大河内健太郎(id:nanasess) 年齢: 33才 • 出身: 愛知県 • 前職: 寿司屋の板前 • 資格: 調理師・ふぐ処理師 • EC-CUBEとの出会いは初回リリース当日 • FreeBSD / Mac OS X / Solaris 使ってます • 本業は Java のフレームワーク開発とか • Emacs23 のアイコン作りました
  • 17. PHPUnitとは • テスティングフレームワーク • テストプログラムを実行し確認するた めの仕組み • プログラマーの精神安定剤 • レガシーコードをカイゼン
  • 18. PHPUnitとは • テスティングフレームワーク • テストプログラムを実行し確認するた めの仕組み • プログラマーの精神安定剤 • レガシーコードをカイゼン • 変更の恐怖を開放して自信をつける
  • 19. セットアップ • 前提 • cli 版の PHP がインストールされていること • --with-pear で構築されていること 1. pear.phpunit.de を channel に追加 > pear channel-discover pear.phpunit.de 2. phpunit/PHPUnit をインストール > pear install phpunit/PHPUnit 参考: http://www.phpunit.de/manual/3.4/ja/installation.html
  • 20. EC-CUBEで使うためには • EC-CUBE は SVN からチェックアウト • 2.4.4 からは同梱します! • EC-CUBE をインストールしておくこと 1. svn からチェックアウト > svn checkout http://svn.ec-cube.net/open/tags/eccube-2.4.3 2. EC-CUBE をインストール 3. テストディレクトリへ移動 > cd eccube-2.4.3/test
  • 21. TestSuite の実行 • 動作に問題が無いか確認する • 必ず test ディレクトリから実行 TestSuite を実行 > phpunit TestSuite.php TestSuite PHPUnit 3.4.14 by Sebastian Bergmann. ..................... Time: 1 second, Memory: 12.50Mb OK (21 tests, 24 assertions)
  • 23. PHPUnit ことはじめ • テンポが大事! 楽しく書こう! • 必ずしもテストファーストでなくて良い • メソッドベースとシナリオベース • 実装コード以上に見やすく • サンプルコードの役割も果す • 苦しいのは最初だけ. 書かなきゃずっと不安を 抱える羽目に
  • 25. PHPUnit の基本 • テストメソッドは必ず test で始まる関数名をつける • assertEquals() などの関数で, 予想される結果と実際の結果を確認する • 結果が同じであればテスト成功) assertEquals(‘hoge’, ‘hoge’); • 結果が異なる場合はテスト失敗) assertEquals(‘hoge’, ‘boke’); • setUp() は必ず各テストメソッドの実行前に実行される • データの前準備やトランザクションの開始 • tearDown() は必ず各テストメソッドの実行後に実行される • 後処理やトランザクションのロールバック
  • 27. テスト駆動開発1 • EC-CUBE管理画面のテストを書いてみよう • まずは必ず成功する最小のテストを書く • 実行してテストが成功することを確認する
  • 28. テスト駆動開発1 • EC-CUBE管理画面のテストを書いてみよう • まずは必ず成功する最小のテストを書く • 実行してテストが成功することを確認する test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php require_once("../html/require.php"); require_once("../data/class/pages/admin/design/LC_Page_Admin_Design_Expart.php"); require_once("PHPUnit/Framework.php"); class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase { function testInit() { // まずは必ず成功させる $this->assertEquals(true, true); } }
  • 30. テスト駆動開発2 • 更にテストを書いてテストが失敗する ことを確認する • 何らかのバグで失敗するはずのテスト が成功してしまい, 気づかないのを防ぐ ため • テスト成功と失敗を繰替えして開発を 進める
  • 31. テストの失敗を確認 data/class/page/admin/desigin/LC_Page_Admin_design_Expart.php class LC_Page_Admin_Design_Expart extends LC_Page { function init() { // do nothing... } function process() { // do nothing... } } test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase { function setUp() { $this->objPage = new LC_Page_Admin_Design_Expart(); $this->objPage->init(); } function testInit() { $expected = “高度な設定”; $actual = $this->objPage->tpl_subtitle; // 失敗を確認 $this->assertEquals($expected, $actual); } }
  • 33. テスト駆動開発3 • 細かくテストしながら本体のコードを仕上げてい く • テストが見にくくなったらリファクタリング • バグが見つかったら画面で確認する代わりにテス トを書く
  • 34. test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase { function setUp() { $this->objPage = new LC_Page_Admin_Design_Expart(); $this->objPage->init(); } // 何をしているテストか解るように function testRegister() { $this->setParam(“サンプルデータ1”, “サンプルデータ2”); $this->argunment = “register 関数の引数”; $this->expected = “register 関数の予想する結果”; $this->scenario(); $this->verify(); } // DBへのテスト用データ投入処理など function setParam($value1, $value2) { // ... } // register 関数のサンプルコードになるように function scenario() { $this->actual = $this->objPage->register($this->argunment); } // 検証コードは共通化しやすい function verify() { $this->assertEquals($this->expected, $this->actual); } }
  • 36. Pageクラスのテスト • インナークラスを使う • オーバーライドは積極的に • 認証や sendRedirect() はオーバーライド してしまおう • 1テスト1フローで小さくテストすること を心掛ける
  • 37. data/class/page/admin/desigin/LC_Page_Admin_design_Expart.php class LC_Page_Admin_Design_Expart extends LC_Page { function process() { // 認証 $this->authorization(); switch ($_POST['mode']) { case "register": // 本番ではちゃんとエラーチェックすること $this->register($_POST['data']); $this->sendRedirect($this->getLocation(“/admin/index.php”)); return; break; default: } // Smartyの assign $this->assignView(); } function authorization() { SC_Utils_Ex::sfIsSuccess(new SC_Session()); } function assignView() { $objView = new SC_AdminView(); $objView->assignobj($this); $objView->display(MAIN_FRAME); } }
  • 38. test/class/page/admin/desigin/LC_Page_Admin_design_Expart_Test.php class LC_Page_Admin_Design_Expart_Test extends PHPUnit_Framework_TestCase { function setUp() { $this->objPage = new LC_Page_Admin_Design_Expart_Mock(); $this->objPage->init(); } function testProcessBy登録時() { $_POST[‘mode’] = ‘register’; $_POST[‘data’] = ‘data’; $this->objPage->process(); // 遷移先を確認 $this->assertEquals(“http://example.jp/admin/index.php”, $this->objPage->location); } } // ユーザー認証と Smarty の assign, sendRedirect はオーバーライドして遷移先の URL を確認 class LC_Page_Admin_Design_Expart_Mock extends LC_Page_Admin_Design_Expart { function authorization() { // quiet. } function assignView() { // quiet. } function sendRedirect($location) { $this->location = $location; } }
  • 40. 美しく書くために • テストメソッドにロジックは書かない • scenario() や verify() を活用 • テストが書きにくいと感じたらリファクタリン が必要な証拠 • テストクラスは冗長に書く • why なコメントを積極的に書く • 関数名に日本語使っちゃえ! • 美しく書ければモチベーションアップ!
  • 42. もっと活用 • コードカバレッジ • phpunit --coverege-html ./outputdir TestCase • 継続的インテグレーション • Maven • http://maven.apache.org/ • hudson • http://hudson-ci.org/
  • 43. 参考 • JUnit実践講座 • http://www.objectclub.jp/community/ memorial/homepage3.nifty.com/masarl/ article/junit.html • PHPUnitのマニュアル • http://www.phpunit.de/manual/3.4/ja/
  • 44. 宣伝 • http://launchpad.net/xdo • Java の JDO (Java Data Object - JSR243) を 意識した O/R Mapper • 複雑に JOIN した SQL でも使える! • EC-CUBE の次期バージョンに入れたい... • 鋭意開発中!
  • 45. 宣伝2 • 開発コミッター募集中!! • EC-CUBE を一緒に開発しましょう! • https://www.ec-cube.net/comitter/ index.php

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n