PHP5.2の開発環境にPHPUnit3.4をいれる

制約多すぎて挫けそうだ。

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 余談はここから ↓-------------------

 * 関連記事:[PHP5.2の開発環境にPHPUnit3.6をいれる](http://qiita.com/dozo/items/d76c36e911059951f1b6)

PHPに限らず何かしら開発をするときに、
テストの実行環境がないと厳しい。
PHPにはPHPUnitという単体テストツールが古くから存在するが、
紆余曲折あって古い環境にインストールするのが非常に難しくなっている。

PHPUnitの最新バージョンはPHPUnit5.7(2017/2/1時点) 。
PHP7をサポートする強力なもの。

ところが、手持ちの開発環境はPHPは5.2.17 (2017/2/1時点) 。
PHPUnit3.7すら動かず3.6以前のどれかということになる。

当然root権限はなく、PHARモジュールすらない。
PEARを使えばと思われるかもだが、
PHPUnitがPEARから離脱してしまっていて、
リポジトリ自体が存在しない。 
そんな状況でインストールするには？

(ーー;) ベタにやるしかない・・・よね。

実はPHPUnitのGitHubにインストール方法が書いてある。
https://github.com/sebastianbergmann/phpunit/tree/3.5#using-phpunit-from-a-git-checkout

ただ、試したところ3.6も3.5もインストールできなかった。
(間接的に使ってるモジュールのパスが変わってる)

そこでPHPUnit3.4を使ってインストールを行った。


ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 本題はここから ↓-------------------

# PHPUnitのインストール

インストール先をphpunitというディレクトリとしている

## 必要なモジュールをGitHubからダウンロード

```
mkdir phpunit && cd phpunit
git clone git://github.com/sebastianbergmann/phpunit.git
git clone git://github.com/sebastianbergmann/dbunit.git
git clone git://github.com/sebastianbergmann/php-file-iterator.git
git clone git://github.com/sebastianbergmann/php-text-template.git
git clone git://github.com/sebastianbergmann/php-code-coverage.git
git clone git://github.com/sebastianbergmann/php-token-stream.git
git clone git://github.com/sebastianbergmann/php-timer.git
git clone git://github.com/sebastianbergmann/phpunit-mock-objects.git
git clone git://github.com/sebastianbergmann/phpunit-selenium.git
```

## 各ブランチを変更

```
cd phpunit && git checkout 3.4 && cd ..
cd dbunit && git checkout 1.0 && cd ..
cd php-file-iterator && git checkout 1.2 && cd ..
cd php-code-coverage && git checkout 1.0 && cd ..
cd php-token-stream && git checkout 1.0 && cd ..
cd phpunit-mock-objects && git checkout 1.0 && cd ..
cd phpunit-selenium && git checkout 1.0 && cd ..
```

## 実行用のシェルを作成

```shell-session:phpunit.sh
#!/bin/sh
 
php -d include_path='.:./phpunit/:./dbunit/:./php-code-coverage/:./php-file-iterator/:./php-invoker/:./php-text-template/:./php-timer:./php-token-stream:./phpunit-mock-objects/:./phpunit-selenium/:./phpunit-story/:/usr/local/lib/php' ./phpunit/phpunit.php $*
```

## テスト実行

```php:unittest.php
<?php
require_once 'PHPUnit/Framework.php';

/**
 * Test class for Hello.
 * Generated by PHPUnit on 2010-03-29 at 03:14:15.
 */
class HelloTest extends PHPUnit_Framework_TestCase
{
    protected function setUp(){
    }

   /**
     * @dataProvider abcProvider
     */
    public function testAbc($actual, $expected){
        $this->assertEquals($actual, $expected);
    }

    public function abcProvider(){
         return array(
             array(1,0),
         );
    }

}
```

### 実行
```shell-session
$ chmod +x phpunit.sh
$ ./phpunit.sh test.php
PHPUnit @package_version@ by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 2.50Mb

There was 1 failure:

1) HelloTest::testAbc with data set #0 (1, 0)
Failed asserting that 0 matches expected 1.

/home/dozo/tmp/unittest.php:16

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

```

ちゃんと動作していて、
dataproviderも使えている。

ヽ(*＾ω＾*)ﾉ ヤッタネ


----
ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 後書はここから ↓-------------------

## インストール時のエラー
上記ではPHPUnit3.4をインストールしたが、
3.5や3.6ももちろん試した。
その前にPEARインストール、PEARローカルインストール、composerインストールも試したわけだが、
どれもこれもうまくいかなかった。

(・_・;) 詰んだな・・・

ハックすれば使うこともできたかもだが、
そこまでやらんでええかとやめたわけだが、
どんなエラーが出たのかは残しておこう。

### composerインストールのエラー

```shell-session
$ wget https://getcomposer.org/download/1.3.2/composer.phar
$ php composer.phar

Fatal error: Class 'Phar' not found in /home/dozo/composer.phar on line 23
```

(ﾟДﾟ;) あ・・・PHARモジュール入ってない。。。

```shell-session
$ pecl download https://pecl.php.net/get/phar-2.0.0.tgz
$ tar xvfz phar-2.0.0.tgz
$ cd phar-2.0.0
$ phpize
$ ./configure
$ make
・・・
/usr/include/php/ext/spl/spl_iterators.h:27 から include されたファイル中,
                 /usr/include/php/ext/spl/spl_array.h:26 から,
                 /home/dozo/phar-2.0.0/phar_internal.h:59 から,
                 /home/dozo/phar-2.0.0/util.c:23 から:
/usr/include/php/ext/pcre/php_pcre.h:29:18: error: pcre.h: そのようなファイルやディレクトリはありません
In file included from /usr/include/php/ext/spl/spl_iterators.h:27,
                 from /usr/include/php/ext/spl/spl_array.h:26,
                 from /home/dozo/phar-2.0.0/phar_internal.h:59,
                 from /home/dozo/phar-2.0.0/util.c:23:
```

あかん、ライブラリ足らんっぽい。。。
断念。

### PEARインストールのエラー

```shell-session
$ pear config-create /home/dozo/pear /home/dozo/.pearrc
$ pear -c ./.pearrc install
$ pear -c ./.pearrc install PHPUnit
WARNING: "pear/PHPUnit" is deprecated in favor of "channel://pear.phpunit.de/PHPUnit"
Did not download dependencies: pear/PHP_Compat, use --alldeps or --onlyreqdeps to download automatically
pear/PHPUnit can optionally use package "pear/PHP_Compat"
downloading PHPUnit-1.3.2.tgz ...
Starting to download PHPUnit-1.3.2.tgz (20,913 bytes)
........done: 20,913 bytes
install ok: channel://pear.php.net/PHPUnit-1.3.2
```

(ﾟДﾟ)!? 1.3.2が入ってもうた。
流石に古すぎる。

```shell-session
$ pear -c ./.pearrc install pear.phpunit.de/PHPUnit
Attempting to discover channel "pear.phpunit.de"...
downloading phpunit.de ...
Starting to download phpunit.de (5,378 bytes)
.....done: 5,378 bytes
unknown channel "pear.phpunit.de" in "pear.phpunit.de/PHPUnit"
invalid package name/package file "pear.phpunit.de/PHPUnit"
install failed
```

チャンネルがもうない・・・ですよねぇ。
断念。

### PHPUnit3.6のエラー

```shell-session
$ ./phpunit.sh ../test.php
Warning: require_once(File/Iterator/Autoload.php): failed to open stream: No such file or directory in /home/dozo/phpunit/phpunit/PHPUnit/Autoload.php on line 45

Fatal error: require_once(): Failed opening required 'File/Iterator/Autoload.php' (include_path='.:./phpunit/:./dbunit/:./php-code-coverage/:./php-file-iterator/:./php-invoker/:./php-text-template/:./php-timer:./php-token-stream:./phpunit-mock-objects/:./phpunit-selenium/:./phpunit-story/:/usr/local/lib/php') in /home/dozo/phpunit/phpunit/PHPUnit/Autoload.php on line 45
```

Autoload.phpがないか・・・。

### PHPUnit3.5のエラー

```shell-session
$ ./phpunit.sh ../test.php

Notice: Please no longer include "PHPUnit/Framework.php". in /home/dozo/phpunit/phpunit/PHPUnit/Framework.php on line 50

Warning: require_once(Text/Template.php): failed to open stream: No such file or directory in /home/dozo/phpunit/phpunit/PHPUnit/Framework/TestCase.php on line 46

Fatal error: require_once(): Failed opening required 'Text/Template.php' (include_path='/home/dozo/phpunit/phpunit:.:./phpunit/:./dbunit/:./php-code-coverage/:./php-file-iterator/:./php-invoker/:./php-text-template/:./php-timer:./php-token-stream:./phpunit-mock-objects/:./phpunit-selenium/:./phpunit-story/:/usr/local/lib/php') in /home/dozo/phpunit/phpunit/PHPUnit/Framework/TestCase.php on line 46

```

こっちもファイルが見つからないとのこと。
ファイル構成がいろいろ変ったみたいやね。