composerを使ってみた時のメモ


pearの後継版のパッケージ管理の機能とかなんとかどっかに書いてあった。

使ってみた感想は便利!!

## 環境

* centos6.3（ゲストOS）
* macosx10.8(ホストOS)

## 事前準備に必要なもの
* php5.3以上

## 参考にしたサイト

* [PHP環境メモ](http://ksauzz.github.com/blog/2012/11/16/setup-php/)
* [PHPの外部ライブラリの管理にComposerを使う](http://www.ryuzee.com/contents/blog/5681)
* [ComposerでPHPUnit一式+Mockeryをインストール](http://qiita.com/items/81085381c4281e498cde)

## composerをインストールする

サクッとワンライナー

```shell
curl -s https://getcomposer.org/installer | php && mv -v composer.phar /usr/local/bin/composer
```

自分は/usr/local/binに置きました

### 動作確認

```shell
$composer -help


   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 98ada572ec52875dfa70e0cb9851dd5f8a34f006

Usage:
  [options] command [arguments]

Options:
  --help           -h Display this help message.
  --quiet          -q Do not output any message.
  --verbose        -v Increase verbosity of messages.
  --version        -V Display this application version.
  --ansi              Force ANSI output.
  --no-ansi           Disable ANSI output.
  --no-interaction -n Do not ask any interactive question.
  --profile           Display timing and memory usage information
  --working-dir    -d If specified, use the given directory as working directory.

Available commands:
  about            Short information about Composer
  config           Set config options
  create-project   Create new project from a package into given directory.
  depends          Shows which packages depend on the given package
  dump-autoload    Dumps the autoloader
  dumpautoload     Dumps the autoloader
  help             Displays help for a command
  init             Creates a basic composer.json file in current directory.
  install          Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  list             Lists commands
  require          Adds required packages to your composer.json and installs them
  search           Search for packages
  self-update      Updates composer.phar to the latest version.
  selfupdate       Updates composer.phar to the latest version.
  show             Show information about packages
  status           Show a list of locally modified packages
  update           Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate         Validates a composer.json

```

## composerの設定ファイルを書く

### ディレクトリ構成について

composerコマンドはcomposerコマンド実行時のカレントの設定ファイルを読みに行くのがデフォルトです。
設定ファイルもバージョン管理化に置きたいのでファイル構成はこんな感じで

```shell
├── composer.json
├── composer.lock
├── phpunit.bootstrap.php
├── phpunit.xml.dist
├── tests #テスト本体
│   └── ExampleTest.php
├── vendor #composerのインストールしたパッケージの置き場
└── www #ドキュメントルート
    ├── index.html
    └── phpinfo.php
```

### 設定ファイルを新規で追加

[phpunit本家](http://www.phpunit.de/manual/3.7/ja/installation.html#installing.upgrading)からcomposerを対応しているモジュール郡をグバっと入れてます。

```shell:composer.json
{
    "require": {
        "phpunit/phpunit": "3.7.*",
        "mockery/mockery": "0.7.*",
        "phpunit/dbunit": ">=1.2",
        "phpunit/phpunit-selenium": ">=1.2",
        "phpunit/phpunit-story": "*"
    },
    "config": {
        "bin-dir": "/usr/local/bin/"
    }
}

```

## composer install

シンプル

```shell
composer install
```

## phpunitの設定を書く

[ComposerでPHPUnit一式+Mockeryをインストール](http://qiita.com/items/81085381c4281e498cde)を真似ました。

### phpunit.xml.dist

```xml:phpunit.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    bootstrap="phpunit.bootstrap.php"
    processIsolation="false"
    verbose="true"
    strict="false"
    colors="true">
    <testsuites>
        <testsuite name="PHPUnit">
            <!-- テストケースがあるディレクトリを列挙する -->
            <directory>tests</directory>
            <!-- <directory>MyProject2</directory> -->
            <!-- <directory>MyProject3</directory> -->
            <!-- <directory>MyProject4</directory> -->
        </testsuite>
    </testsuites>

    <logging>
        <!-- コードカバレッジ率 -->
        <log
            type="coverage-html"
            target="metrics/coverage"
            charset="UTF-8"
            yui="true"
            highlight="false"
            lowUpperBound="35"
            highLowerBound="70" />
        <!-- <log type="coverage-text" target="php://stdout" lowUpperBound="35" highLowerBound="70" /> -->
        <!-- 上行をアンコメントアウトするとカバレッジ率がプロンプトにも表示される -->
    </logging>

    <filter>
        <!-- コードカバレッジ率を計測する対象の指定 -->
        <whitelist>
            <directory suffix=".php">src</directory>
            <!-- <file>/path/to/file</file> -->
            <exclude>
                <file>public/index.php</file>
            </exclude>
        </whitelist>
        <!-- コードカバレッジ測定対象から除外 -->
        <blacklist>
            <directory suffix=".php" group="PHPUNIT">vendor</directory>
        </blacklist>
    </filter>
    <listeners>
        <!-- mockery統合のため必要 -->
        <listener class="\Mockery\Adapter\Phpunit\TestListener" file="Vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php" />
    </listeners>
</phpunit>
```

### phpunit.bootstrap.php

```php:phpunit.bootstrap.php
<?php

// For composer
require_once 'vendor/autoload.php';
```


### tests/ExampleTest.php

```php:tests/ExampleTest.php
<?php

class ExampleTest extends PHPUnit_Framework_TestCase
{
        public function testSomething()
        {
                $this->assertTrue(true);
        }
}
```

## phpunit実行

実行

```shell
$phpunit


PHPUnit 3.7.14 by Sebastian Bergmann.

Configuration read from /home/web/lo.test.org/phpunit.xml.dist

.

Time: 9 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)
```

以上。