SlideShare a Scribd company logo
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
質疑応答
ご静聴ありがとう
ございました!

More Related Content

What's hot

FlutterでGraphQLを扱う
FlutterでGraphQLを扱うFlutterでGraphQLを扱う
FlutterでGraphQLを扱う
IgaHironobu
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
Fixstars Corporation
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
増田 亨
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
増田 亨
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
増田 亨
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
 
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化についてマルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
Fixstars Corporation
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps 長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
Google Cloud Platform - Japan
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 

What's hot (20)

FlutterでGraphQLを扱う
FlutterでGraphQLを扱うFlutterでGraphQLを扱う
FlutterでGraphQLを扱う
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化についてマルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps 長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 

Similar to 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 Koa
kamiyam .
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
kamiyam .
 
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 100
ichikaway
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
Ryo Tomidokoro
 

Similar to 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エクステンションの作り方
 

More from 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次期バージョンから、しっかり学ぶ Symfony
Kentaro 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-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
 

More from 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 を創るためのアクセス解析
 

Recently uploaded

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 

Recently uploaded (16)

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 

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

Editor's Notes

  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