こんにちは。よっしーです(^^)
今日は、docker で環境構築した CodeIgniter に PHPUnit を追加する方法についてご紹介します。
前提条件
この記事では、Dockerでの環境構築が完了していることを前提にしています。環境構築の方法については、下記の記事を参考にお願いします。
修正内容
Dockerfile
Dockerfileを下記のように修正します。赤字が修正箇所です。
FROM amazonlinux:2
# amazon-linux-extras install
RUN amazon-linux-extras install -y epel
# yum update & install
RUN yum update -y \
&& yum install -y \
systemd \
httpd \
wget \
git \
graphviz
# PHP
RUN yum install -y 'http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'
RUN yum install -y php74
RUN yum install -y php74-php
RUN yum install -y php74-php-fpm
RUN yum install -y php74-php-pear
RUN yum install -y php74-php-devel
RUN yum install -y php74-php-mbstring
RUN ln -s /usr/bin/php74 /usr/bin/php \
&& ln -s /opt/remi/php74/root/usr/bin/phpize /usr/bin/phpize \
&& ln -s /opt/remi/php74/root/usr/bin/php-config /usr/bin/php-config \
&& ln -s /opt/remi/php74/root/usr/bin/pecl /usr/bin/pecl
# composer
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY ./CodeIgniter-3.1.13/composer.json /var/www/composer.json
RUN cd /var/www \
&& composer install
# xhprof
RUN cd /tmp \
&& git clone https://github.com/tideways/php-xhprof-extension \
&& cd /tmp/php-xhprof-extension \
&& phpize \
&& ./configure \
&& make \
&& make test \
&& make install
RUN mkdir -vp /var/log/xhprof \
&& chmod 777 /var/log/xhprof
RUN echo 'extension=tideways_xhprof.so' >> /etc/opt/remi/php74/php.d/tideways.ini \
&& echo 'tideways.auto_prepend_library=0' >> /etc/opt/remi/php74/php.d/tideways.ini
RUN cd /var/www/ \
&& git clone https://github.com/sters/xhprof-html.git ./xhprof-html \
&& cd ./xhprof-html \
&& sed -i "81c\$xhprof_runs_impl = new XHProfRuns_Default('\/var\/log\/xhprof');" callgraph.php
# xdebug
RUN pecl install xdebug-3.1.6
# httpd
RUN echo "Mutex posixsem" >> /etc/httpd/conf/httpd.conf
RUN systemctl enable httpd
# init
CMD ["/sbin/init"]
xdebug.ini
xdebug.iniを下記のように修正します。赤字が修正箇所です。
zend_extension=xdebug
# for XDebug3
[xdebug]
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.mode=debug,coverage
#xdebug.idekey = PHPSTORM
xdebug.start_with_request=yes
ビルド&起動
docker compose build
docker compose up -d
テストに必要なライブラリの追加
composer.jsonにphpunitやci-phpunit-test、application/testsのディレクトリが既に存在する場合は、ここの手順は実施する必要はありません。
docker compose exec -it app bash
cd /var/www
composer require --dev phpunit/phpunit ^9.6
composer require --dev kenjis/ci-phpunit-test
php vendor/kenjis/ci-phpunit-test/install.php --from-composer
「php vendor/kenjis/ci-phpunit-test/install.php –from-composer」を実施した際に下記のエラーがでるかも知れませんが、解消方法については調査中です。
たぶん、index.phpの場所の指定をしないといけないのだと思います。
PHP Fatal error: Uncaught Exception: Can't find "index.php". in /var/www/vendor/kenjis/ci-phpunit-test/lib/Installer.php:160
Stack trace:
#0 /var/www/vendor/kenjis/ci-phpunit-test/lib/Installer.php(97): Installer->fixPath()
#1 /var/www/vendor/kenjis/ci-phpunit-test/install.php(14): Installer->install()
#2 {main}
thrown in /var/www/vendor/kenjis/ci-phpunit-test/lib/Installer.php on line 160
テストの動作確認
pushd /var/www/application/tests
/var/www/vendor/bin/phpunit
問題なければ、下記のようにOKと表示されます。
bash-4.2# /var/www/vendor/bin/phpunit
Xdebug: [Step Debug] Could not connect to debugging client. Tried: host.docker.internal:9003 (through xdebug.client_host/xdebug.client_port) :-(
PHPUnit 9.6.6 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 00:00.814, Memory: 14.00 MB
OK (3 tests, 3 assertions)
Generating code coverage report in Clover XML format ... done [00:00.122]
Generating code coverage report in HTML format ... done [00:00.446]
また、「app/CodeIgniter-3.1.13/application/tests/build/coverage/dashboard.html」のファイルをブラウザで開くと、下図のようなレポートを参照することができます。
composer.jsonの更新
下記のコマンドでコンテナからomposer.jsonをダウンロードします。赤字の部分は動作環境によって変わるので、動作環境に合わせて読み替えてください。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93ea71bd2056 app-app "/sbin/init" 4 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp amzn-linux-2-app
docker cp 93ea71bd2056:/var/www/composer.json composer.json
ダウンロードしたcomposer.jsonをCodeIgniter-3.1.13配下にコピー(上書き)します。
上書きする前のファイルとの差分は下記のようになっていると思います。
diff composer.json CodeIgniter-3.1.13/composer.json
33c33,34
< "phpunit/phpunit": "4.* || 5.* || 9.*"
---
> "phpunit/phpunit": "^9.6",
> "kenjis/ci-phpunit-test": "^3.0"
テストケースの追加
PHPUnitとは
Blog_test.phpを下記の内容で新規作成します。
<?php
class Blog_test extends TestCase
{
public function test_index()
{
$output = $this->request('GET', 'blog/index');
$this->assertStringContainsString('Hello World!', $output);
}
}
下記のパスになるように配置します。
app/CodeIgniter-3.1.13/application/tests/controllers/Blog_test.php
テスト実施
下記のコマンドでテストを実施します。
docker-compose run app sh -c "cd /var/www/application/tests && /var/www/vendor/bin/phpunit"
下記の結果になっていればOKです。
% docker-compose run app sh -c "cd /var/www/application/tests && /var/www/vendor/bin/phpunit"
Xdebug: [Step Debug] Could not connect to debugging client. Tried: host.docker.internal:9003 (through xdebug.client_host/xdebug.client_port) :-(
PHPUnit 9.6.6 by Sebastian Bergmann and contributors.
.... 4 / 4 (100%)
Time: 00:00.968, Memory: 14.00 MB
OK (4 tests, 4 assertions)
Generating code coverage report in Clover XML format ... done [00:00.093]
Generating code coverage report in HTML format ... done [00:00.454]
%
解説
PHPUnitとは
PHPUnitは、PHP言語向けのオープンソースのテストフレームワークです。このフレームワークを使用することで、開発者はPHPコードをテストするためのテストケースを作成できます。
PHPUnitは、以下のような機能を提供します。
- テストケースの作成と実行:PHPUnitを使用して、テストクラスを作成し、テストメソッドを実行して、テストの合格・不合格を判断できます。
- アサーション:PHPUnitは、テストメソッド内でアサーションを使用して、期待される値と実際の値を比較します。このようにして、テストが期待どおりに実行されたかどうかを確認できます。
- データプロバイダ:PHPUnitは、テストメソッドの実行に複数の異なる入力値を提供するためのデータプロバイダをサポートしています。これにより、より多くの場合を網羅的にテストすることができます。
- テストスイート:PHPUnitは、テストスイートを作成することができます。これにより、複数のテストクラスをまとめて実行することができます。
- カバレッジレポート:PHPUnitは、コードカバレッジを測定してレポートを生成する機能を提供しています。これにより、テストがどの程度コードをカバーしているかを確認できます。
PHPUnitは、PHPアプリケーションの品質を確保するために不可欠なツールです。また、PHPUnitを使用することで、コードを変更しても意図しない副作用が発生しないことを保証することができます。
詳細については、PHPUnitの公式ドキュメントを参照してください。
おわりに
今日は、docker で環境構築した CodeIgniter に PHPUnit を追加する方法についてご紹介しました。PHPのバグ取りに是非使ってみてください。
また明日お会いしましょう!
コメント