公開日:2021.09.30

Unitテストについて②LaravelでUnitテストの実行とカバレッジレポート出力

テクログphp

こんにちは!

第二回は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テストを掘り下げていきたいと思います!

それでは!

この記事を書いた人

棒人間

入社年2019年

出身地東京都

業務内容開発

特技または趣味スケボー

棒人間の記事一覧へ

テクログに関する記事一覧