Dockerを使ってAtCoder用のPHPのPHP Unitでテストの自動化とxdebugでデバッグをする環境を構築する

# AtCoder用の環境を構築する記事です。
茶色以上を目指す方向けにテストの自動化とデバッグ環境をローカルにdockerで構築する記事です。エディターはVSCodeを使います。私はmacを使ってます。
とりあえずpaiza等のブラウザの実行環境でAtCoderをやってみたのですがテストの自動化とデバッグができる環境が欲しいと思ってDockerで構築してみました。
LinuxとDockerの基本的な操作方法には触れませんしDockerとDocker composeがインストールしてある前提で書きます。しかし、コマンドはとっても簡単なのでコピペで動くはずです。
一番下にGitHubのリンクも載せてます。
## ファイル構成
```
┌ .vscode
│　└ launch.json
├PHP
 └ docker
   ├ composer.json
   ├ docker-compose.yml
   └ Dockerfile
 ├ html
   └index.php
 └ php.ini
```
## php.iniを作成する
xdebugの設定が書いてあります。デバッグ用のポートは9000を使ってます。
```
[xdebug]
xdebug.client_host = host.docker.internal
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 0
xdebug.remote_handler = "dbgp"
xdebug.client_port = 9000
```
## Dockerfileを作成する
```
FROM php:8.0-apache

COPY composer.json /home/

# パッケージリスト更新後にパッケージをインストール
RUN apt-get update && apt-get install -y git zip unzip && \
    # xdebug拡張のインストール
    pecl install xdebug && \
    docker-php-ext-enable xdebug
# composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer

WORKDIR /home

RUN composer install

WORKDIR /var/www/html

```
## docker-compose.yml
```
version: "3.8"

services:
  php-atcoder:
    # カレントディレクトリでイメージを構築
    build: .
    volumes:
      - ../php.ini:/usr/local/etc/php/php.ini
      - ../html:/var/www/html
    # プロセスを継続させてコンテナの正常終了を防ぐ
    stdin_open: true
    ports:
      - "8080:80"
```
## VSCodeでPHP Debug拡張機能を追加する
VSCodeの拡張機能で PHP Debugと検索してください

## launch.jsonを作成する
デバッグ用のポート9000を指定している
pathMappingsの⚪︎の部分はローカルホストのhtmlディレクトリまでの絶対参照パスを表しています。
```
{
  "configurations": [
    {
      "name": "XDebug on docker",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "pathMappings": {
        "/var/www/html": "/Users/○○○○/○○○○/○○○○/html"
      }
    }
  ]
}
```
## index.phpをhtml/以下に作成する
xdebugを試すのに使います。
```
<?php
echo "hello, AtCoder!" .PHP_EOL;
$a = 1;
echo $a .PHP_EOL;
$a = 2;
echo $a .PHP_EOL;
```
## コンテナを起動する
docker-compose.ymlがあるディレクトリに移動して
```
docker compose up -d
```
ブラウザで localhsot:8080に **hello, AtCoder! 1 2**が表示されることを確認する

## デバグを試してみる
1. VSCode上でブレークポイントを作成する
2. デバッグモードをオンにする
3. ブラウザをリロードする
これで任意の箇所で処理を止めて変数の中身などを確認することができます。

# テストを試してみる
## html/以下にtest.phpを作成する
```
function addition()
{
    return 1 + 1;
}
```
## html/以下にCalculationTest.phpを作成する
```
<?php
require_once "test.php";

use PHPUnit\Framework\TestCase;

class CalculationTest extends TestCase
{
    public function testAddition()
    {
        $this->assertSame(2, addition());
    }
}
```
## テストを実行してみる
docker-compose.ymlがあるディレクトリで実行する
```
docker-compose exec php-atcoder /home/vendor/bin/phpunit /var/www/html/CalculationTest.php
```
```
PHPUnit 9.6.13 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.004, Memory: 4.00 MB

OK (1 test, 1 assertion)
```
こんな感じの画面が表示されます。

# 終わりに
GitHubにリポジトリを載せてますので
クローンして試すこともできます。タグ1.0.0をご利用ください。

https://github.com/fukada-m/AtCorder

# 参考
xdebugの環境構築

https://zenn.dev/aono/articles/40be14b1753897

PHP Unitの環境構築

https://qiita.com/y_sone/items/70b98283539b89a709b6

本の参考 PHP本格入門

https://gihyo.jp/book/series?s=%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80