pytest を AWS CodeBuild に組み込む

pytest を AWS CodeBuild に組み込む

はじめに

前回、pytest の使用方法についてまとめました。今回は pytest を AWS CodeBuild に組み込んで自動テストを行う方法について解説します。 前回の記事はこちら

https://poota.net/archives/444

環境

今回使用する環境は以下の通りです。

$ python --version
Python 3.7.10
$ pytest --version
pytest 7.1.0

フォルダ構成は以下の通りです。

pytest_project
├── mypkg
│ ├── check_leapyear.py
├── tests
│ └── test_check_leapyear.py

各ファイルの内容です。

# check_leapyear.py
def check_leapyear(year):
 if year % 100 == 0 and year % 400 != 0:
 return False
 elif year % 4 == 0:
 return True
 else:
 return False
# test_check_leapyear.py
import pytest
from mypkg.check_leapyear import check_leapyear

@pytest.mark.parametrize(('year', 'expected'), [
 (1900, False),
 (2000, True),
 (2001, False),
 (2004, True),
])
def test_check_leapyear(year, expected):
 assert check_leapyear(year) == expected

手順

ビルドプロジェクト の作成

AWS 公式ドキュメントに従って、ビルドプロジェクトを作成します。 今回、ソースプロバイダには CodeCommit を使用し、buildspec.yml ファイルは以下のものを使用しました。

version: 0.2

phases:
 install:
 runtime-versions:
 python: 3.7
 commands:
 - pip3 install pytest
 build:
 commands:
 - python -m pytest --junitxml=reports/pytest_results.xml

reports:
 pytest_reports:
 files:
 - '**/*'
 base-directory: reports/
 file-format: JUNITXML

各セクションの詳細

report-group-name-or-arn

レポートの送信先のレポートグループを指定します。上記 buildspec.yml の pytest_reports: の部分。 名前を指定した場合、CodeBuild は、プロジェクト名と指定した - 形式でレポートグループを作成します。

reports//files

テストレポートのファイルを指定します。後述する base-directory が指定されている場合は base-directory から、設定されていない場合は CodeBuild 実行ディレクトリを基準にして、テストファイルを検索するディレクトリを表します。’**/*‘を指定することで全てのファイルに再帰的にマッチさせることが可能です。

reports//file-format

レポートファイルのフォーマット形式を指定します。未指定の場合は JUNITXML が使用されます。

reports//base-directory

テストレポートファイルの探索先を指定します。

reports//discard-paths

レポートファイルが S3 にアップロードされる際に、パスを保持するかを指定します。例えばテスト結果のパスが com/myapp/mytests/TestResult.xml の場合に、このパラメータに yes を設定すると TestResult.xml としてアップロードされます。

実行結果の確認

ビルドを実行するとレポートが出力されます。今回は4つのテストを行い、4つとも成功したことがレポートから分かります。

おわりに

今回は、実際に pytest を AWS CodeBuild に組み込んで、自動テストを行う手順について解説しました。この記事がどなたかの参考になれば幸いです。

参考