ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2012-12-14

[][] 3分でできる俺PHPテスト環境

※この記事はVOYAGE GROUP エンジニアブログ : Advent Calendar 2012の15日目の記事として書いてます。

3種の神器 PHPUnit, Stagehand_TestRunner, Phake

初めての方はじめまして。いつもの方こんにちは。

VOYAGE GROUP の adingo という会社で 広告配信に関わる Webアプリケーション開発エンジニアをしている @brtriver です。

今日は実際の現場でも使っているPHPの開発環境構築Tipsということで みんな大好き PHPUnit 、 自分は大好き Phake 、毎回テストを手動で実行するのが許されるのは小学生までだよねー Stagehand_TestRunner の 3つを3分でプロジェクトごとにインストールする方法を書いてみます。

何も考えず composer.jsonコピペで用意

プロジェクトのルートディレクトリを prj としましょう。

そこに 以下の内容の composer.json ファイルを用意します。

{
  "require": {
    "phake/phake": "v1.0.3",
    "piece/stagehand-testrunner": "v3.5.0"
  },
  "require-dev": {
      "phpunit/phpunit": "3.7.*"
  }
}

そうです。composerを使ってライブラリをプロジェクト内にインストールします。

composer.phar を用意する

あとは、以下のコマンドを黙って叩いて最新のcomposer.pharをダウンロードしてくる

$ curl -s https://getcomposer.org/installer | php

もし、curlがなければ以下でもOk

$ php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

れっつ インストール

さぁ composerを使ってインストールしましょう

$ php composer.phar install --dev

composerのインストールはパッケージの確認などに時間が結構かかります。

お茶でもすすってお待ちください。

これで、vendorディレクトリが作成されコードが配置されます。

PHPUnit を実行してみる

testsディレクトリを作成してテストコードを書いてみましょう。

  • tests/SampleTest.php

<?php
Class SampleTest extends PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function テストが実行できること()
    {
        $this->assertTrue(true);
    }
}

これを phpunitで動かしてみます

$ ./vendor/bin/phpunit --tap tests
TAP version 13
ok 1 - SampleTest::テストが実行できること
1..1

簡単ですね。ちなみに説明は端折ってますがphakeも使えます。

Stagehand_TestRunner を使ってみる

最後にStagehand_TestRunner の用意です。

何も考えずに以下のおまじないコマンドを叩けば準備Ok

$ ./vendor/bin/testrunner compile -p vendor/autoload.php

あとは、testrunnerを起動しておきます。

$ ./vendor/bin/testrunner phpunit -p vendor/autoload.php -a tests
PHPUnit 3.7.10 by Sebastian Bergmann.

.

Sample

 [x] テストが実行できること

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

この状態でSampleTest.phpのテストを assetTrue(false) に書き換えてみましょう。

すると次のようにファイルの更新をキャッチし自動的にテストが実行されます。

PHPUnit 3.7.10 by Sebastian Bergmann.

F

Sample
 [ ] テストが実行できること

Time: 0 seconds, Memory: 5.50Mb

There was 1 failure:

1) SampleTest::テストが実行できること
Failed asserting that false is true.

/tmp/prj/tests/SampleTest.php:9
/tmp/prj/vendor/piece/stagehand-testrunner/src/Stagehand/TestRunner/Runner/PHPUnitRunner.php:81
/tmp/prj/vendor/piece/stagehand-testrunner/src/Stagehand/TestRunner/Process/TestRun.php:103
/tmp/prj/vendor/piece/stagehand-testrunner/src/Stagehand/TestRunner/CLI/TestRunner.php:69
/tmp/prj/vendor/piece/stagehand-testrunner/src/Stagehand/TestRunner/CLI/TestRunnerApplication/Command/PluginCommand.php:145
/tmp/prj/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:238
/tmp/prj/vendor/symfony/console/Symfony/Component/Console/Application.php:192
/tmp/prj/vendor/symfony/console/Symfony/Component/Console/Application.php:105

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

なんと素敵なことでしょう!

まとめ

たった3分で、PHPで継続的にテストを書いて開発する俺環境ができてしまいました。

簡単というところがミソで、実プロジェクトでも 今回の環境+α を make install で自動構築できるようにしています。

明日の Advent Calendar は いつも笑顔が素敵な @bash0C7 です。お楽しみに!

2012-12-01

[] Symfony を楽しむためのポイント - Symfony Advent Calender 2012 1日目 -

この記事は Symfony Advent Calender 2012 の1日目の記事です。

全体のカレンダーは Symfony Advent Calender 2012で見ることができます。

Symfonyの基礎

まず最初に、Symfonyをあまり知らない方のために簡単に特徴をまとめます。

Symfony はフランス Sensio Labs社 が開発するオープンソースPHPウェブアプリケーションフレームワークソフトウェアです。 2007年にバージョン1.0が公開されて以降、大規模なサイトを含む多数のウェブサイト、E-コマースサイトで利用されてきました。2012年12月1日現在の最新版は 2.1.4 です。

日本国内では日本Symfonyユーザー会で翻訳や勉強会を行なっています。

Symfony の開発は github で開発が行われており、PHPに分類された世界中のリポジトリの中では hiphop-php の次に2番目に注目を集めているリポジトリです。

とはいえ日本語の情報をあまり見ないので、その部分もふくめて Symfony を楽しむポイントを書いて行きたいと思います。

Symfonyはモデルには無関心

SymfonyはWebアプリケーションフレームワークです。関心があるのは、コントローラとビュー *だけ* です。

あなたが開発しようとしているドメイン部分(モデル)については全くもって関心はありません。

ドメイン部分については自分の好きなように開発することができます。

他のよくあるPHPのフルスタックフレームワークはモデル部分を作成しようとすると、class User extends FrameworkModel のようにフレームワークに依存したコードになってしまったりしますが、Symfonyではそもそもモデルは関与しないので、フレームワークに依存せずに、ドメイン部分を育てていくことが自然にできます。

この部分はテストでも地味に影響してきます。たとえば、モデルにテストコードを書くことを考えてみましょう。さきほどのような extends が必須なモデルクラスのテストコードを書くことはフレームワークの基底モデルクラス(FrameworkModel)に依存しているので、本来気にしなくてもよいフレームワークのクラスをテストとの依存を何らかの方法で解決しなければなりません。

ドメイン部分をアジャリティに開発したい場合は Symfony はとても優れているとおもいます。

逆にいうと、ドメイン部分はあなたが正しく設計していかないと、簡単に廃れてしまいます。そのための知識が要求されるということになりますが、この知識はフレームワーク限定の知識ではありませんし、これからのエンジニアとして必要とされる知識なので、Symfony を使ってフレームワークに限定されないエンジニアとして必要な知識も勉強できるとも言えます。

Symfony Componentの存在

SymfonyはSymfony Component を組み合わせたフルスタックフレームワークです。Symfony Componentとは単なるライブラリ群です。

Webアプリケーションで必ず必要となるRequestやResponseをオブジェクトで扱えるようにしたHTTP Foundation

コンソールアプリをPHPで作るときに便利なConsoleなどがあります。

自分が見ているOSSの中ではテストコードも比較的しっかり書かれつつコミュニティベースで開発されているライブラリだと思います。

実際に、Symfonyそのものではなく、Symfony Componentの一部を使って別のフレームワークを開発しているプロジェクトもあります。

その代表的なのがSilexという、RubySinatra風にアプリケーションをPHPで構築できるフレームワークです。

私自身もCodeIgniterの既存プロジェクト内でSymfony Componentを組み合わせて使っていたりもします。

これらのコンポーネントのドキュメントから読み始めてみるのも面白いとおもいます。

とりあえず十分すぎるドキュメント

本家の公式ドキュメントはPDFでダウンロードできるのですが900ページ以上あります。なので、ググる前にPDF内検索することで大体やりたいことを見つけることができます。

how to 的なブログが少ないのもその影響があるのかもしれません。

また、日本語訳は全然追いつけていませんが、それでも多くのドキュメントやチュートリアルがオンラインで見ることができます。

海外ではカンファレンスも多く開催されており、そのときのセッションの多くが動画で見れるようになっています。

自分自身も全部を読み切れていない充実ぶりです。

また、翻訳作業については随時募集していますので、読むだけではなくコントリビューターとしても楽しむこともできます。興味がある方は日本Symfonyユーザー会のMLに声をかえてください。

難しいと感じるかわかりやすいと感じるか

SymfonyでWebアプリケーションを開発するときに、DDD(ドメイン駆動設計)に関する知識が必要になってきます。

また、普通にDIも使うことになります。

でも、このあたりの知識が不足しているものはアプリケーションが *ただ動く* だけで、ドメイン領域を反映できていないものになり、結果として普通のテストすらも書けなくなってしまいます。

PHPは歯ブラシですが、偉大な先人たちの経験を活かした普通のWebアプリケーションをPHPでも書くことができるのです。

デザインパターンを勉強した結果、チームが「ここはシングルトンパターンで...」というだけで共通認識を持てるのと同じですよね。「Userはエンティティだから...」というだけで共通認識が持てて開発できるのですから。

覚えることは多いかもしれませんが、フレームワークを使う以上フレームワークの知識が必要なのは避けれませんし、それはどのフレームワークでも必要な初期コストです。

どうせ勉強するなら今後も自身のキャリアで活かすことができる領域について勉強していきたいですよね。Symfonyはそういったエンジニアの方が楽しめるフレームワークだと思います。


とはいえ、Symfony自体の設計でまだまだイケていない部分もありますが、そういった部分と向き合いながらSymfonyにフィードバックをしてSymfonyを進化させることをコントリビューターとして楽しむというのが究極の楽しみ方かもしれません。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |