Laravel（10.19.0）でAllureReportを使う

# 前提
走り書きです。
以前書いた記事ではscoopを使ってAllureを利用していましたが、Dockerイメージがあることを知ったのでメモ

https://qiita.com/ijohnny/items/be60456746a48464ddca

そして、Laravelのバージョン10でスムーズにできなかったのでメモ

# Dockerを用意

公式のSingle Project - Docker Composeほぼ同じ

https://github.com/fescobar/allure-docker-service#single-project---docker-compose

```yml:docker-compose.yml
version: "3"
services:
  # アプリケーション関連は割愛 #
  allure:
    container_name: allure
    image: "frankescobar/allure-docker-service"
    user: 1000:1000
    environment:
      CHECK_RESULTS_EVERY_SECONDS: 1
      KEEP_HISTORY: 1
    ports:
      - "5050:5050"
    volumes:
      - ../app/allure-results:/app/allure-results
      - ../app/allure-reports:/app/default-reports
```

マウントのパスを少し変えた。
ここは個人的にLaravelのプロジェクト内に入れて、`.gitignore`は忘れずに追記。
後のパッケージ側で外に出すように指定しても良いかと。
個人やプロジェクトの判断かと。

他は
- `user: 1000:1000`
- `container_name: allure`
を追加したぐらい


# 立ち上げてみる

`app/allire-results`と`app/allire-reports`ができている


# laravevl側でパッケージをインストール


前回の記事でも利用した通り、composerを利用してインストールしました（--dev忘れずに）
```bash:cmd
$ composer require --dev allure-framework/allure-phpunit
```

インストールされたら、1.3がインストールされます。

```json:composer.json
    "require-dev": {
        "allure-framework/allure-phpunit": "^1.3",
```

Laravelプロジェクト直下の`phpunit.xml`に追記

```xml:phpunit.xml
<extensions>
    <extension class="Qameta\Allure\PHPUnit\AllureExtension">
        <!-- Optional arguments block; omit it if you want to use default values -->
        <arguments>
            <!-- Path to config file (default is config/allure.config.php) -->
            <string>config/allure.config.php</string>
        </arguments>
    </extension>
</extensions>
```

configファイルが必要だそうで公式からいただきます。

```php:config/allure.config.php
<?php

return [
    // Path to output directory (default is build/allure-results)
    'outputDirectory' => 'allure-results',
    'linkTemplates' => [
        // Class or object must implement \Qameta\Allure\Setup\LinkTemplateInterface
        'tms' => \My\LinkTemplate::class,
    ],
    'setupHook' => function (): void {
        // Some actions performed before starting the lifecycle
    },
     // Class or object must implement \Qameta\Allure\PHPUnit\Setup\ThreadDetectorInterface
    'threadDetector' => \My\ThreadDetector::class,
    'lifecycleHooks' => [
        // Class or object must implement one of \Qameta\Allure\Hook\LifecycleHookInterface descendants.
        \My\LifecycleHook::class,
    ],
];
```

```php
  // 'outputDirectory' => 'build/allure-results',
  'outputDirectory' => 'allure-results',
```
`outputDirectory`の値を`build/allure-results`からDockerのvolumesで指定したパスと合わせてます`allure-results`


# 実行してみる

```bash:cmd
php artisan test
```

初期のままだとExampleTest2つが実行されて終了。
ファイルが出力され...る...？？...はずなんだけど、ない。

# phpunitから実行してみる

```bash:cmd
vendor/bin/phpunit
```

同じく2件実行されはしたけど、以下の警告が…

```
There was 1 PHPUnit test runner warning:

1) Test results may not be as expected because the XML configuration file did not pass validation:

  Line 16:
  - Element 'extension': This element is not expected. Expected is ( bootstrap ).
```

これはphpunitのバージョンが起因していて、exceptedというタグは`10`以降はなくなったみたい。

Laravelをインストールした状態
```json:composer.json
"phpunit/phpunit": "^10.1",
```

さあどうしたものか…

# allure-phpunitのREADMEを読み返す

https://github.com/allure-framework/allure-phpunit

インストールは以下の通り

```json:composer.json
{
    "require": {
	    "php": "^8",
	    "allure-framework/allure-phpunit": "^2"
    }
}
```

`2`ですね。composerコマンドからインストールしたら`1.3`がインストールされましたが、`2`だそうです。

# パッケージの依存関係と戦い

ということで、

```json:composer.json
    "require-dev": {
        "allure-framework/allure-phpunit": "^2",
```

に変更してインストールし直し。

スムーズにいかない…
```
  ~ 略 ~
  Problem 1
    - Root composer.json requires allure-framework/allure-phpunit ^2 -> satisfiable by allure-framework/allure-phpunit[v2.0.0, v2.1.0].
    - allure-framework/allure-phpunit[v2.0.0, ..., v2.1.0] require phpunit/phpunit ^9 -> found phpunit/phpunit[9.0.0, ..., 9.6.10] but it conflicts with your root composer.json require (^10.1).

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
```

phpunitのバージョンを下げろというので
```json:composer.json
    "require-dev": {
        "phpunit/phpunit": "^9.6.10",
```

に変更して再度インストールし直し

インストールは完了しました。

```bash:cmd
php artisan test
```

またエラー
```
   NunoMaduro\Collision\Adapters\Laravel\Exceptions\RequirementsException 

  Running Collision 7.x artisan test command requires at least PHPUnit 10.x.
```

Collisionのバージョン7.xだとPHPUnitは10.xじゃないとダメだということで

```json:composer.json
    "require-dev": {
        "nunomaduro/collision": "^6.4.0",
```
に変更して再度インストールし直し

インストールは完了しました。

```bash:cmd
php artisan test
```

また…（もう疲れた）

```
Config key "linkTemplates/tms" contains invalid source of Qameta\Allure\Setup\LinkTemplateInterface
```

`Qameta\Allure\Setup\LinkTemplateInterface`は以下の追加した`allure.config.php`で定義してます。
サンプルなので、とりあえずはファイル出力の箇所以外はコメントアウトしときましょう。

```php:config/allure.config.php
<?php

return [
    // Path to output directory (default is build/allure-results)
    'outputDirectory' => 'allure-results',
    // 'linkTemplates' => [
    //     // Class or object must implement \Qameta\Allure\Setup\LinkTemplateInterface
    //     'tms' => \My\LinkTemplate::class,
    // ],
    // 'setupHook' => function (): void {
    //     // Some actions performed before starting the lifecycle
    // },
    //  // Class or object must implement \Qameta\Allure\PHPUnit\Setup\ThreadDetectorInterface
    // 'threadDetector' => \My\ThreadDetector::class,
    // 'lifecycleHooks' => [
    //     // Class or object must implement one of \Qameta\Allure\Hook\LifecycleHookInterface descendants.
    //     \My\LifecycleHook::class,
    // ],
];
```

修正したので、再度テスト（涙目）

```bash:cmd
php artisan test
```

allure-results`にファイルができてる！！（歓喜）

次は、レポート作成

# allure-docker-serviceのAPIを利用する

## 作成レポートを作成するAPI
GETなのでブラウザでアクセスするだけでOK
http://localhost:5050/generate-report?project_id=default

## 最新のレポートを確認する
とりあえず最新でOK
http://localhost:5050/allure-docker-service/projects/default/reports/latest/index.html#
ここで2件テストしたということが確認できればOK

できなかった場合は、コンテナを再起動してみる。


なお、最初の`dokcer-compose.yml`で、
`user: 1000:1000`を追加したのは、allure-docker-service内でパーミッションエラーでディレクトリやファイルを作れなかったことがあり、追加しました。
作れなくても、レポート作成のAPIレスポンスは作ったぜ！なので困った。
issueもありました。

https://github.com/fescobar/allure-docker-service/issues/97

ひとまず、テストレポートとしてはできたので良し！
あとは、アノテーションを付けていく必要がある！




# 結論
- レポートがあると視覚的に良い（やった感含め）
- 公式のドキュメントは読むべし。（もう少し早く解決できたかな）
- パッケージのバージョンは必要に応じてダウングレードさせるべし。
    - 最新だから良いってわけじゃない。けど、プロジェクトで検討必須。

## 手順まとめ

今回のLaravel（10.19.0）だと、

```yml:docker-compose.yml
version: "3"
services:
  # アプリケーション関連は割愛 #
  allure:
    container_name: allure
    image: "frankescobar/allure-docker-service"
    user: 1000:1000
    environment:
      CHECK_RESULTS_EVERY_SECONDS: 1
      KEEP_HISTORY: 1
    ports:
      - "5050:5050"
    volumes:
      - ../app/allure-results:/app/allure-results
      - ../app/allure-reports:/app/default-reports
```
- userを明示して
- volumesをのちの`allure.config.php`の`outputDIrectory`の値と合わせて


```json:composer.json
    "require-dev": {
        "allure-framework/allure-phpunit": "^2",
        "phpunit/phpunit": "^9.6.10",
        "nunomaduro/collision": "^6.4.0",
```
- allure-phpunitは公式の通りにして
- phpunitとcollisionはバージョン下げる


```php:config/allure.config.php
<?php

return [
    // Path to output directory (default is build/allure-results)
    'outputDirectory' => 'allure-results',
    // 'linkTemplates' => [
    //     // Class or object must implement \Qameta\Allure\Setup\LinkTemplateInterface
    //     'tms' => \My\LinkTemplate::class,
    // ],
    // 'setupHook' => function (): void {
    //     // Some actions performed before starting the lifecycle
    // },
    //  // Class or object must implement \Qameta\Allure\PHPUnit\Setup\ThreadDetectorInterface
    // 'threadDetector' => \My\ThreadDetector::class,
    // 'lifecycleHooks' => [
    //     // Class or object must implement one of \Qameta\Allure\Hook\LifecycleHookInterface descendants.
    //     \My\LifecycleHook::class,
    // ],
];
```
- `outputDirectory`以外はコメントアウトしておく


---

おわり。