Skip to content

Parallelize pytest execution jobs #333

Parallelize pytest execution jobs

Parallelize pytest execution jobs #333

Workflow file for this run

name: Pull Request Check
on: [pull_request]
jobs:
build:
name: 'Build docker image'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-test-image
lint-ruff:
name: 'Lint check (ruff)'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: chartboost/ruff-action@v1
unit-test:
name: 'Unit tests'
runs-on: ubuntu-latest
needs: build
strategy:
fail-fast: true
matrix:
db: [postgres, mysql]
test_target: [
'tests/app/admin_* tests/app/company_* tests/app/config_* tests/app/contract_*',
'tests/app/dex_*',
'tests/app/e2e_* tests/app/eth_*',
'tests/app/events_*',
'tests/app/messaging_* tests/app/node_info_* tests/app/notification_* tests/app/openapi_*',
'tests/app/position_ListAllCouponConsumptions_*',
'tests/app/position_Position_*',
'tests/app/position_PositionCoupon* tests/app/position_PositionMembership*',
'tests/app/position_PositionShare*',
'tests/app/position_PositionStraightBond*',
'tests/app/token_*',
'tests/app/userinfo_*',
'tests/batch/indexer_Block_* tests/batch/indexer_CompanyList_* tests/batch/indexer_Consume_*',
'tests/batch/indexer_DEX_*',
'tests/batch/indexer_Position_Bond_*',
'tests/batch/indexer_Position_Coupon_*',
'tests/batch/indexer_Position_Membership_*',
'tests/batch/indexer_Position_Share_*',
'tests/batch/indexer_Token_Detail_*',
'tests/batch/indexer_Token_Holders_*',
'tests/batch/indexer_Token_List_*',
'tests/batch/indexer_Transfer_*',
'tests/batch/indexer_TransferApproval_*',
'tests/batch/processor_*',
]
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-test-image
- name: build image on compose
run: docker compose build
- name: Change owner of output directory
run: |
sudo chown runner:docker /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov
sudo chmod 777 /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov
- name: run unit test using ${{ matrix.db }}
run: docker compose run -e TEST_TARGET="${{ matrix.test_target }}" ibet-wallet-api-${{ matrix.db }}
- run: mv cov/.coverage cov/.coverage-${{ strategy.job-index }}
- uses: actions/upload-artifact@v4
if: matrix.db == 'postgres'
with:
name: .coverage-${{ strategy.job-index }}
path: cov/.coverage-${{ strategy.job-index }}
include-hidden-files: true
- run: mv cov/pytest.xml cov/pytest-${{ strategy.job-index }}.xml
- uses: actions/upload-artifact@v4
if: matrix.db == 'postgres'
with:
name: pytest-${{ strategy.job-index }}
path: cov/pytest-${{ strategy.job-index }}.xml
collect_coverage:
runs-on: ubuntu-latest
needs: unit-test
permissions:
actions: read
contents: read
packages: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-test-image
- name: build image on compose
run: docker compose build
- name: Change owner of output directory
run: |
sudo chown runner:docker /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov
sudo chmod 777 /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov
- uses: actions/download-artifact@v4
with:
pattern: '.coverage-*'
path: cov/
merge-multiple: true
- name: combine coverage files
run: docker compose run -w /app/ibet-Wallet-API/cov ibet-wallet-api-postgres bash --login -c 'poetry run coverage combine .coverage-*'
- name: generate coverage xml file
run: docker compose run -w /app/ibet-Wallet-API ibet-wallet-api-postgres bash --login -c 'poetry run coverage xml --data-file=cov/.coverage -o cov/coverage.xml'
- uses: actions/download-artifact@v4
with:
pattern: 'pytest-*'
path: cov/
merge-multiple: true
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install junit-report-merger
run: npm install -g junit-report-merger
- name: Merge reports
run: jrm cov/pytest.xml "cov/pytest-*.xml"
- name: Pytest coverage comment
id: coverageComment
uses: MishaKav/pytest-coverage-comment@main
with:
report-only-changed-files: true
pytest-xml-coverage-path: cov/coverage.xml
junitxml-path: cov/pytest.xml
- name: Count test cases in repository
id: countTest
run: |
RESULT=$(docker compose run -w /app/ibet-Wallet-API ibet-wallet-api-postgres bash --login -c 'poetry run pytest --collect-only | grep -e "<Function" -e "<Coroutine"' | wc -l)
echo "::set-output name=test_count::$RESULT"
- name: Check the count of test cases in CI
if: steps.coverageComment.outputs.tests != steps.countTest.outputs.test_count
run: exit 1
migration-test:
name: 'Migration tests'
runs-on: ubuntu-latest
needs: build
strategy:
fail-fast: true
matrix:
db: [postgres, mysql]
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-test-image
- name: run unit test using ${{ matrix.db }}
run: docker compose run ibet-wallet-api-${{ matrix.db }} bash --login -c "cd /app/ibet-Wallet-API && poetry run pytest -vv --test-alembic -m 'alembic'"