テスト分割のトラブルシューティング

1+ year ago1 min read
Last updated • Read time
クラウド
This document is applicable to CircleCI クラウド
Server v4.x
This document is applicable to CircleCI Server v4.x
Server v3.x
This document is applicable to CircleCI Server v3.x

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" で検索すると確認できます。

タイミング基準で正しく分割するサンプルプロジェクト

下記は、 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)