LoginSignup
6
5

More than 1 year has passed since last update.

DockerとAllure Reportを使って今風のイケてるテストレポートを作成しよう!

Last updated at Posted at 2023-01-14

前提

  • コンテナを使用
  • フレームワークはDjangoを使用

Allureとは?

公式ドキュメントにも記載している通りテストレポートを自動生成するツールです

Allure Framework is a flexible lightweight multi-language test report tool

  • PythonのPytest
  • RailsのRSpec
  • JavaのjUnit
  • PHPのPHPUnit
  • KotlinのKotest
  • JavaScriptのJasmine

にも対応しています
今あげたテストフレームワーク以外にも対応しているので詳細は公式ドキュメントを参照してください

今回私はPytestでいくつかテストコードを作成してますが

  • テスト数
  • カバレージ
  • 所要時間

などさまざまな情報を表示できます

スクリーンショット 2023-01-14 22.23.04.png

しかも日本語にも対応しているのでありがたいです
記事の後半でレポートの内容を詳細に説明をしたいと思います

allure-docker-serviceとallure-docker-service-ui

ローカルで実行している記事が多いですが私はローカル環境を汚したくないので今回はDockerを使います

  • allure-docker-service
  • allure-docker-service-ui

の2つのDocker Imageを使用します

docker-compose.ymlに以下を記載します

docker-compose.yml
version: '3'
services:
  allure:
    container_name: allure
    image: "frankescobar/allure-docker-service"
    environment:
      # 毎秒テスト結果を確認するかどうかの設定です
      # マシンへの負担が大きいとのことなので今回はNONEにします
      CHECK_RESULTS_EVERY_SECONDS: NONE
      # テストの履歴を保存したいのでKEEP_HISTORYを有効化(TRUE)にします
      KEEP_HISTORY: 1
      # 直近25回分までを保存します
      KEEP_HISTORY_LATEST: 25
    ports:
      - "5050:5050"
    volumes:
      - ${PWD}/allure-results:/app/allure-results
      - ${PWD}/allure-reports:/app/default-reports

  allure-ui:
    container_name: allure-ui
    image: "frankescobar/allure-docker-service-ui"
    environment:
      ALLURE_DOCKER_PUBLIC_API_URL: "http://localhost:5050"
      ALLURE_DOCKER_PUBLIC_API_URL_PREFIX: ""
    ports:
      - "5252:5252"

公式ドキュメントに記載されている通りvolumesのディレクトリを変更してしまうとコンテナ側でテスト結果の保存や反映ができなくなってしまいます
今回はcontainer_nameだけ変更してポートも含めて公式に書いてある通りの構成にします

The /app/allure-results directory is inside of the container. You MUST NOT change this directory, otherwise, the container won't detect the new changes.
The /app/default-reports directory is inside of the container. You MUST NOT change this directory, otherwise, the history reports won't be stored.

docker-compose.ymlを作成後、

docker-compose up -d

を実行します
すると、プロジェクトのルートディレクトリに以下のフォルダが作成されます

❯ tree
.
├── allure-reports
└── allure-results
  • allure
  • allure-ui

のコンテナが起動できていることも確認できました

docker ps -a
3b88c08ffc9e   frankescobar/allure-docker-service      "/bin/sh -c '$ROOT/r…"   2 minutes ago   Up 2 minutes (healthy)   4040/tcp, 0.0.0.0:5050->5050/tcp                 allure
becb4e3f0b5d   frankescobar/allure-docker-service-ui   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:5252->5252/tcp                           allure-ui

テストレポートを作成しよう!

テストレポートを作成する際は以下の順で行います

  • プロジェクトの作成
  • テストを実行し、テスト結果をJSONで出力
  • JSONファイルをallureコンテナへアップロード
  • レポートの作成

手順は多いですが順番にやっていきましょう

プロジェクトの作成

http://127.0.0.1:5050  にアクセスすると以下の画面が表示されます

スクリーンショット 2023-01-14 21.38.29.png

Allure Reportを使用する際はプロジェクトごとにproject-idを設定します
/projectsに任意のidを入力し、POSTリクエストを送ります
今回はtest-projというidで作成し、Executeを押します

スクリーンショット 2023-01-14 21.41.20.png

以下の画面が表示されたら成功です

スクリーンショット 2023-01-14 21.42.18.png

テストを実行し、テスト結果をJSONで出力

任意のテストフレームワークを使ってテストを実行し、実行したテストの結果をJSONに出力する必要があります
その際は

各テストフレームワークでのやり方は以下の公式ドキュメントを参照してください

今回私はPytestを使用するのでallure-pytestをインストールします

pip install allure-pytest

その後、以下のコマンドを使用します

pytest --alluredir=allure-results 

テストが実行されるとallure-resultsフォルダ内にJSONファイルが作成されます

JSONファイルをallureコンテナへアップロード

先ほどJSONファイルをもとにテストレポートを作成しました
しかし、現状ではローカル上にはあるもののallureコンテナ(サーバ)内にありません
そのため、ローカル上のJSONファイルをallureコンテナへアップロードする必要があります
公式ではアップロード用のシェルスクリプトを用意しています
allure-reportsやallure-resultsと同じプロジェクトのルートディレクトリにシェルスクリプトを作成し、実行します

❯ tree
.
├── allure-reports
├── allure-results
└── send_results.sh

PROJECT_IDの箇所に自身が作成されたプロジェクトidを入れます
今回私はtest-projを入れます

send_results.sh
#!/bin/bash

# This directory is where you have all your results locally, generally named as `allure-results`
ALLURE_RESULTS_DIRECTORY='allure-results'
# This url is where the Allure container is deployed. We are using localhost as example
ALLURE_SERVER='http://localhost:5050'
# Project ID according to existent projects in your Allure container - Check endpoint for project creation >> `[POST]/projects`
PROJECT_ID='test-proj'

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
FILES_TO_SEND=$(ls -dp $DIR/$ALLURE_RESULTS_DIRECTORY/* | grep -v /$)
if [ -z "$FILES_TO_SEND" ]; then
  exit 1
fi

FILES=''
for FILE in $FILES_TO_SEND; do
  FILES+="-F files[]=@$FILE "
done

set -o xtrace
echo "------------------SEND-RESULTS------------------"
curl -X POST "$ALLURE_SERVER/allure-docker-service/send-results?project_id=$PROJECT_ID" -H 'Content-Type: multipart/form-data' $FILES -ik


#If you want to generate reports on demand use the endpoint `GET /generate-report` and disable the Automatic Execution >> `CHECK_RESULTS_EVERY_SECONDS: NONE`
#echo "------------------GENERATE-REPORT------------------"
#EXECUTION_NAME='execution_from_my_bash_script'
#EXECUTION_FROM='http://google.com'
#EXECUTION_TYPE='bamboo'

#You can try with a simple curl
#RESPONSE=$(curl -X GET "$ALLURE_SERVER/allure-docker-service/generate-report?project_id=$PROJECT_ID&execution_name=$EXECUTION_NAME&execution_from=$EXECUTION_FROM&execution_type=$EXECUTION_TYPE" $FILES)
#ALLURE_REPORT=$(grep -o '"report_url":"[^"]*' <<< "$RESPONSE" | grep -o '[^"]*$')

#OR You can use JQ to extract json values -> https://stedolan.github.io/jq/download/
#ALLURE_REPORT=$(echo $RESPONSE | jq '.data.report_url')

シェルスクリプトを作成したら実行します

sh send_results.sh

JSONのレスポンスが帰ってくるので以下のようなメッセージが含まれていたら成功です

"meta_data":{"message":"Results successfully sent for project_id 'test-proj'"}

レポートの作成

ここでいよいよテストレポートを作成します

スクリーンショット 2023-01-14 21.56.37.png

少し時間がかかるので待ちます

以下のようなレスポンスが帰ってきたら成功です
スクリーンショット 2023-01-14 21.57.41.png

テストレポートを見てみよう!

/projects/{id}
へGETリクエストを送ります
idにプロジェクトidを指定し、Executeを押します

スクリーンショット 2023-01-14 22.01.07.png

レスポンス内にindex.htmlのパスがあります
今回は最新のものが見たいので
http://127.0.0.1:5050/allure-docker-service/projects/test-proj/reports/latest/index.html
を選択します
スクリーンショット 2023-01-14 22.01.47.png

以下の画面が表示されたら成功です
スクリーンショット 2023-01-14 22.23.04.png

スイート

テストをステータス別で分類できます
分類の種類は以下の通りです

分類
失敗
黄色 故障
成功
グレー スキップ
不明

スクリーンショット 2023-01-14 22.24.04.png

また、ステータスの真上に結果をCSVファイルに出力するボタンがあります

スクリーンショット 2023-01-14 22.26.38.png

グラフ

テストの分類や速度をグラフで表示することができます

スクリーンショット 2023-01-14 22.17.13.png

タイムライン

どの順番で、どのテストが、どれくらい時間がかかったかを表示することができます

スクリーンショット 2023-01-14 22.30.40.png

振る舞い

各テストの詳細を閲覧できます
テストのdocstring、異常テストのログも確認できます

スクリーンショット 2023-01-14 22.28.06.png

また、セットアップ作業なども確認できます
スクリーンショット 2023-01-14 22.32.08.png

Allure Reportの使い方は以上です

Makefileを作成してコマンド一つでテストレボートの作成から表示まで行おう!

手順が多いうえにコマンドが長いので覚えられないです
そこでMakefileを使って楽にテストレポートを作成しましょう
ルートディレクトリにMakefileを作成し、以下のように記載します

Makefile
CONTAINER_NAME = app
PROJECT = test-proj
RUN_APP = docker-compose exec $(CONTAINER_NAME)
RUN_POETRY =  $(RUN_APP) poetry run
RUN_PYTEST = $(RUN_POETRY) pytest

make_report:
	-@ $(RUN_PYTEST) --alluredir=allure-results
	sh send_results.sh
	echo "Generating test report. This may take a while..."
	curl -X GET "http://127.0.0.1:5050/allure-docker-service/generate-report?project_id=$(PROJECT)" -H  "accept: */*"
	echo "Successfully generated test report. Redirecting to allure server."
	open http://127.0.0.1:5050/allure-docker-service/projects/$(PROJECT)/reports/latest/index.html

show_report:
	open http://127.0.0.1:5050/allure-docker-service/projects/$(PROJECT)/reports/latest/index.html

-@をつけることでテストが失敗しても処理を続行させます

make make_report

と打つと
http://127.0.0.1:5050/allure-docker-service/projects/test-proj/reports/latest/index.html
に遷移します

スクリーンショット 2023-01-15 13.04.40.png

コマンド1つでレポートが表示される上にエラーが出た箇所が分かりやすく表示されていい感じですね!
スクリーンショット 2023-01-15 13.05.34.png

今回はレポートは生成しなくていいから見るたけでいいよ!と思ったら以下のコマンドを実行します

make show_report

Allure Docker Service UI

http://127.0.0.1:5252/
にアクセスするとAllure Docker Service UIを開くこともできます
該当するプロジェクトを開くとこちらもAllure Reportと同様の使い方ができます

スクリーンショット 2023-01-14 22.33.57.png

スクリーンショット 2023-01-14 22.35.40.png

まとめ

最初は設定が多いのとREADMEの内容を読むのに時間がかかって大変でした
やり方さえわかれば簡単にいい感じのテストレポートを作成できることがわかったので大満足です

記事の紹介

以下の記事も作成してみたのでよかったら読んでいただけると幸いです

参考

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5