How to shard PHPUnit tests with GitHub Actions


This post goes over how to shard PHPUnit tests with GitHub Actions.

Motivation

If you run your PHPUnit tests sequentially in GitHub Actions, it can take a long time if you have a lot of tests.

With test sharding, you divide your tests to speed up test runtime. As a result, this means your tests run in parallel for faster build times.

Although you can write a Bash script to do this, there’s already a GitHub Action called find-and-split that automates this for you.

Test Sharding

Let’s say you have a GitHub Actions workflow that runs PHPUnit tests sequentially:

# .github/workflows/test.yml
name: test
on: push

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install dependencies
        run: composer install

      - name: Run tests
        run: vendor/bin/phpunit tests

With find-and-split and the matrix strategy, you can split your tests into 2 jobs based on the number of test files:

 # .github/workflows/test.yml
 name: test
 on: push

 jobs:
   test:
     runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        shard: [1/2, 1/2]

     steps:
       - name: Checkout repository
         uses: actions/checkout@v4

       - name: Install dependencies
         run: composer install

+      - name: Find and split files
+        uses: remarkablemark/find-and-split@v1
+        id: tests
+        with:
+          chunk: ${{ matrix.shard }}
+          directory: tests
+          pattern: '*Test.php'

       - name: Run tests
-        run: vendor/bin/phpunit tests
+        run: vendor/bin/phpunit ${{ steps.tests.outputs.files }}

Resources

For more details, check out the test repository.



Please support this site and join our Discord!