テスト分割のトラブルシューティング
Python Django テストでのテスト分割の使用
CircleCI でテスト分割を活用するには、実行するテストの一覧を渡す必要があります。 しかし、Django を使用する場合、テストの実行方法によっては、テストをグロブして渡すことができません。
独自のユースケースに合わせたテスト分割では、問題が発生することがあります。 Python Django でテスト分割を行えない問題については、 Discuss[こちらの投稿 に解決例が示されています。
この例を使用してテスト分割を実行する簡単な例を以下に示します。
- run:
command: |
# get test files while ignoring __init__ files
TESTFILES=$(circleci tests glob "catalog/tests/*.py" | sed 's/\S\+__init__.py//g')
echo $TESTFILES | tr ' ' '\n' | sort | uniq > circleci_test_files.txt
cat circleci_test_files.txt
TESTFILES=$(circleci tests split --split-by=timings circleci_test_files.txt)
# massage filepaths into format manage.py test accepts
TESTFILES=$(echo $TESTFILES | tr "/" "." | sed 's/\.py$//g')
echo $TESTFILES
pipenv run python manage.py test --verbosity=2 $TESTFILES
その他のテスト分割方法
pytest で複数のコンテナにテストを分割しようとすると、以下のいずれかのエラーが発生することがあります。
No timing found for "tests/commands/__init__.py"
No timing found for "tests/commands/test_1.py"
No timing found for "tests/commands/test_2.py"
これらのエラーのいずれかが返された場合は、以下に示すような多少の調整が必要です。
カスタムの working_directory を設定している場合
この場合は、テストメタデータの XML ファイルに保存するファイルパスを調整してみてください。 または、可能であれば、コンテナの標準作業ディレクトリを使用して、エラーを解決できるかどうか試してください。 具体的には、テスト実行ジョブに含まれる working_directory
をすべて削除します。
pytest.ini
の場所を確認する
テスト分割を正しく行うには、ルートディレクトリでテストを実行する必要があります。 テストの実行場所がルートディレクトリではない場合、run
コマンドをテストする前に以下のコマンドを実行してみてください。
cp -f .circleci/resources/pytest_build_config.ini pytest.ini
.circleci/resources/pytest_build_config.ini
パスは、プロジェクト内でこのファイルが実際に置かれている場所に合わせて置き換えてください。
pytest.ini に junit_family を設定している場合
pytest.ini ファイルに junit_family=legacy
のような設定があるかどうかを確認してください。 junit_family
の設定方法については、 pytestこちら のページを参照してください。 上記ページの該当箇所は、"families" で検索すると確認できます。
pytest 6.1 では互換性を損なう変更が行われ、junit_family xml 形式がファイル名を含まない xunit2 に変更されました。 つまり、--split-by=timings は xunit1 を指定しないと動作しません。 詳細については、 pytest changelog を参照してください。 |
タイミング基準で正しく分割するサンプルプロジェクト
下記は、 sample-python-cfd
project からのテスト分割の実装を示すサンプルです。
version: 2.1
orbs:
python: circleci/python@1.2
jobs:
build-and-test:
parallelism: 2
docker:
- image: cimg/python:3.8
steps:
- checkout
- python/install-packages:
pkg-manager: pip
- run:
name: Run tests
command: |
set -e
TEST_FILES=$(circleci tests glob "openapi_server/**/test_*.py" | circleci tests split --split-by=timings)
mkdir -p test-results
pytest --verbose --junitxml=test-results/junit.xml $TEST_FILES
- store_test_results:
path: test-results
- store_artifacts:
path: test-results
workflows:
sample:
jobs:
- build-and-test
その他のテスト分割方法
一部のサードパーティのアプリケーションやライブラリでも、テストスイートの分割がサポートされていますが、 これらのアプリケーションは、CircleCI では開発およびサポートが行われていません。 CircleCI でこれらのアプリケーションを使用して問題が発生した場合は、オーナーに確認してください。 問題が解決しない場合は、CircleCI のフォーラム、 Discuss で対処方法を検索するか、質問してみてください。
-
Knapsack Pro: 並列 CI ノード間でテストを動的に割り当て、テストスイートの実行を高速化します。 CI のビルド時間のサンプルグラフ もご覧ください。
-
phpunit-finder:
phpunit.xml
ファイルに対してクエリを行い、テストファイル名の一覧を取得して出力するヘルパー CLI ツールです。 テストを分割して CI ツールのタイミングに基づいて並列に実行する場合に、このツールを使用すると便利です。 -
go list: Golang パッケージをグロブするには、組み込まれている Go コマンド
go list ./…
を使用します。 これにより、パッケージ テストを複数のコンテナに分割できます。
go test -v $(go list ./... | circleci tests split)