2021.09.30
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
こんにちは!
第二回はLaravelでUnitテストの実行とカバレッジレポート出力を実践してみます!
実行環境
- Docker(php:7.2-fpm-alpine3.7)
- Laravel6系
構成は下記の通りです
docker/
└db/
└.env_db
└.gitignore
└my.conf
└php/
└Dockerfile
└php.ini
└web
└default.conf
docker-compose.yml
docker/php/Dockerfile
FROM php:7.2-fpm-alpine3.7
COPY php.ini /usr/local/etc/php/
RUN apk --no-cache update && \
apk --no-cache upgrade && \
apk --no-cache add \
curl-dev \
freetype-dev \
libjpeg-turbo-dev \
libpng-dev \
libxml2-dev \
zlib-dev \
pcre-dev \
g++ \
make \
autoconf \
openssl \
nodejs-npm \
bash \
vim \
git \
&& docker-php-ext-install \
curl \
dom \
mbstring \
pdo \
pdo_mysql \
simplexml \
zip \
opcache \
&& docker-php-ext-configure gd \
--with-freetype-dir=/usr/include/ \
--with-jpeg-dir=/usr/include/ \
--with-png-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& chmod +x /usr/local/bin/composer \
&& rm -rf /var/cache/apk/*
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
docker/php/php.ini
date.timezone = "Asia/Tokyo"
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[xdebug]
xdebug.mode=coverage
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log=/tmp/xdebug.log
docker-compose.yml
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- "8000:80"
depends_on:
- app
volumes:
- ./docker/web/default.conf:/etc/nginx/conf.d/default.conf # 別ファイルで定義
- ./html:/var/www/html
app:
build: ./docker/php # Dockerfileでビルド
depends_on:
- mysql
volumes:
- ./html:/var/www/html
mysql:
image: mysql:5.7
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
env_file: ./docker/db/.env_db # 別フォルダで環境変数を定義
ports:
- "3306:3306"
volumes:
- mysql:/var/lib/mysql # volumeコンテナとマウント
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
volumes:
mysql: # volumeコンテナ用意
docker-compose buidでビルド、docker-compose up -dでコンテナ起動
ここは割愛します!
phpコンテナに入り、laravel newで新規プロジェクト作成
ここは割愛します!
コンテナ内でUnitテスト実行
標準でサンプルのテストクラスが準備されているので、今回はこのままUnitテストを実行します。
テスト成功です!
続いて失敗パターン
html/orientation_app/tests/Unit/ExampleTest.php
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
* @test
* @return void
*/
public function testBasicTest()
{
$this->assertTrue(false); //falseに変えてわざと失敗させる
}
}
しっかりテスト失敗です!
Unitテストのカバレッジレポートを出力
カバレッジレポートとはざっくり言うとテスト実行の網羅率のレポートです!
※詳しくは下記ドキュメント参照
https://phpunit.readthedocs.io/ja/latest/code-coverage-analysis.html
PHPUnitでカバレッジレポートを出力するためにはxdebugが必要なのでインストールします!(Dockerfileの下記部分)
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
インストールしたらphp.iniに設定を書きます!
[xdebug]
xdebug.mode=coverage
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log=/tmp/xdebug.log
xdebug.mode=coverage
「xdebug.mode=coverage」がミソでdebugのモードをcoverageに変更する必要があります!
次にcomposer.jsonの「script」部分に「 “test:coverage”: “phpunit –coverage-html coverage”」を追記します!
html/orientation_app/composer.json
~中略~
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
],
"test:coverage": "phpunit --coverage-html coverage" ←これを追加
}
長くなりましたがこれで準備OKです!
~いざ実行~
そうすると「html/orientation_app/coverage/index.html」が出力されます
ブラウザで見てみるとこんな感じでレポートを見ることができます!
次回はUnitテストのアサーションやモックを使用したテストに焦点を当ててUnitテストを掘り下げていきたいと思います!
それでは!