Setup : windows server IIS + PHP 8.x + Laravel 8.x + MariaDB 10.x for Unit Testing

#Outline

Unit Test , Integration (Feature) Test をonboadingで使用するために、phpの環境を構築した。
unit testができるまでの構築手順である
versionによって微妙にコマンドが異なったり、windowsでそもそもする人が少ないので、該当する方々の参考になればと思います



#PHP
## 1. install PHP
https://www.php.net/
php windows versionのzipをダウンロードする。
今回、IISでFastCGIModuleで動かすため、<B>Non Thread Safe</B> versionを使う。

その後、任意のフォルダに配置する。
今回は、 <B>C:\php</B>に置く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/a88e68e2-a612-8887-e55d-974bef5ac8cd.png)

## 2. install xdebug
unit testのcoverageを出すために、xdebugを利用する。
このextensionをdownloadし、<B>C:\php\ext</B>に配置する。

https://xdebug.org/wizard

## 3. setup php.ini
php.iniを編集し、一部モジュールをactiveにする

```
extension=fileinfo
extension=mbstring
extension=mysqli
extension=pdo_mysql
extension=openssl

zend_extension = xdebug
```


#IIS setting
## 1. Server Role

Server RoleにIISを追加します。
・Role追加にて、"Web Server (IIS)"を指定する
・Role Servicesにて、"Application Development"の必要な項目を追加する。今回CGI (FastCGIModule)としてphpを動かす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/92bf85e5-afce-07aa-6506-c2cbda17a748.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/098166eb-10f0-53bf-acfb-b2eda2ab486e.png)


## 2. install url-rewrite 
Laravelでは、URL-Rewriteを使う。
そのため、そのパッケージをインストールする

https://www.iis.net/downloads/microsoft/url-rewrite

## 3. handler mapping php
*.phpにアクセスしたときに、phpを実行するように指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c5cc3fb6-06d3-61e4-4555-1454fa3f9b0b.png)

## 4. rewrite URL for laravel

以下のルールを追加する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/1384350f-33b5-cc66-8307-b14a772e666e.png)

| Category | item | parameter |
|:-----------|:-----------|:------------|
| Match URL |Matches the Pattern | ^(.*)$ |
| Conditions |{REQUEST_FILENAME} |Is Not a File |
| Conditions |{REQUEST_FILENAME} |Is Not a Directory|
| Action| Rewrite | index.php/{R:1} |

#Install mariaDB
## 1. Install
LaravelのDBのアプリを作成するために、簡単に使えるMariaDBを採用（mysqlでもよい）
インストールは簡単で、MariaDBからインストーラをダウンロードし、デフォルトの設定で作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/96ee8f15-8600-8f25-6a99-f16f0fe24022.png)

https://mariadb.org/

## 2. Create Account
MariaDB Clientがstartupに作成されるため、それを起動する
ログインは、rootのパスワードでログインする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/b8563ccc-b938-d1dc-f88b-c37174361c5a.png)

Laravelからアクセスするユーザーの作成と権限付与を行う

使用するsqlコマンド
- CREATE USER 
- GRANT ALL


## 3. Create Database

Laravelのサンプルアプリで使う、databaseを作成する。
とりあえず、サンプルアプリ名＝データベース名とする

```
CREATE DATABASE sample_app
```


#Install Composer

Composerとは、PHPと必要なライブラリの依存関係を管理する標準形式を提供するアプリケーションレベルのパッケージ管理システム
Laravelをinstallするときに使う
インストーラーをdownloadして、基本的にデフォルトでインストールを行えばよい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/7876de60-6512-e0b6-2d36-41f24d9a7705.png)

https://getcomposer.org/download/

#Install Laravel

command promptを起動し、以下コマンドを入力する

```
composer global require "laravel/installer"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/bb604cf0-faa8-6d81-4e2e-19b17b862947.png)

## path setting

system settingで以下pathを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/fce43c94-e67e-67c1-317c-48656570dbb1.png)

```
%APPDATA%\Composer\vendor\bin
```


#Create Laravel project

## 1. create laravel project
IISで指定した、アクセス可能なVirtual Directoryに移動する
そこで、command promptを起動する

```
laravel new sample_app
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f74edade-447f-4aea-f601-469f0808df64.png)

完了するまで時間がかかります。
完了すると、Laravelのパッケージが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/bcf4dfd5-5279-f9fd-fdc0-8f32c312ea73.png)


## 2. node.js

laravelはnode.jsを使います
それをインストールします。
まず、対象のプロジェクトに移動し、そこでcommand promptで以下のコマンドを実行する。

```
npm install && npm run dev && npm run watch
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/10a2230f-d27b-8700-399d-bb98e51a11a9.png)

## 3. resolve dependency

packageの依存問題を解決する

```
composer install
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/897fc1a7-528c-140c-f187-689acbab566c.png)


## 4.application encryption key

Laravelを起動させるために、encryption keyを指定する必要がある

```
php artisan key:generate
```

### 5. install phpunit coverage

以下、コマンドを実行する
```
composer require --dev phpunit/php-code-coverage
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/b71b17db-5d76-8b9d-dc46-50de4cb0375e.png)



## 6. test coverage output

test coverageをhtmlで出力できるようにする
すでにXDEBUGを設定しているため、それをつかって実行できるようにする
composer.jsonを編集する

scriptsで以下２つのコマンドを追加する
test:coverage-xml
test:coverage-html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/4527ffa1-81a7-d030-e65b-796485bc62c0.png)

実際に実行してみる

```
composer test:coverage-html
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c98d060c-7ea3-dd0e-06d8-03ea15f32d96.png)

すると、storageにカバレッジレポートが作成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/59d3a603-2999-d8b2-7557-009304289239.png)

htmlをひらくと、以下のようにカバレッジレポートが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/744c81fb-ce4c-0376-ecbb-f5fe473a3c30.png)

## 7. DB setting

対象のprojectが先ほど構築したMariaDBと接続できるようにする

<B>.env</B>で、DBに関する設定を行う
DBのHost,Portが異なる場合、変更する
DB_DATABASEは、先ほどproject名と同じdatabaseを作成したので特に変更は必要ないが、別のdatabaseを使う場合、変更する
DB_USERNAME,DB_PASSWORDは作成したDBのユーザを指定する。
このユーザーはTABLEの作成権限などが必要となる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/ee52ac81-28f2-a395-d14e-4efdf16c15af.png)