前提
走り書きです。
以前書いた記事ではscoopを使ってAllureを利用していましたが、Dockerイメージがあることを知ったのでメモ
そして、Laravelのバージョン10でスムーズにできなかったのでメモ
Dockerを用意
公式のSingle Project - Docker Composeほぼ同じ
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忘れずに)
$ composer require --dev allure-framework/allure-phpunit
インストールされたら、1.3がインストールされます。
"require-dev": {
"allure-framework/allure-phpunit": "^1.3",
Laravelプロジェクト直下の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
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' => 'build/allure-results',
'outputDirectory' => 'allure-results',
outputDirectory
の値をbuild/allure-results
からDockerのvolumesで指定したパスと合わせてますallure-results
実行してみる
php artisan test
初期のままだとExampleTest2つが実行されて終了。
ファイルが出力され...る...??...はずなんだけど、ない。
phpunitから実行してみる
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をインストールした状態
"phpunit/phpunit": "^10.1",
さあどうしたものか…
allure-phpunitのREADMEを読み返す
インストールは以下の通り
{
"require": {
"php": "^8",
"allure-framework/allure-phpunit": "^2"
}
}
2
ですね。composerコマンドからインストールしたら1.3
がインストールされましたが、2
だそうです。
パッケージの依存関係と戦い
ということで、
"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のバージョンを下げろというので
"require-dev": {
"phpunit/phpunit": "^9.6.10",
に変更して再度インストールし直し
インストールは完了しました。
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じゃないとダメだということで
"require-dev": {
"nunomaduro/collision": "^6.4.0",
に変更して再度インストールし直し
インストールは完了しました。
php artisan test
また…(もう疲れた)
Config key "linkTemplates/tms" contains invalid source of Qameta\Allure\Setup\LinkTemplateInterface
Qameta\Allure\Setup\LinkTemplateInterface
は以下の追加した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 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もありました。
ひとまず、テストレポートとしてはできたので良し!
あとは、アノテーションを付けていく必要がある!
結論
- レポートがあると視覚的に良い(やった感含め)
- 公式のドキュメントは読むべし。(もう少し早く解決できたかな)
- パッケージのバージョンは必要に応じてダウングレードさせるべし。
- 最新だから良いってわけじゃない。けど、プロジェクトで検討必須。
手順まとめ
今回のLaravel(10.19.0)だと、
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
の値と合わせて
"require-dev": {
"allure-framework/allure-phpunit": "^2",
"phpunit/phpunit": "^9.6.10",
"nunomaduro/collision": "^6.4.0",
- allure-phpunitは公式の通りにして
- phpunitとcollisionはバージョン下げる
<?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
以外はコメントアウトしておく
おわり。