GitHub Actions에서 Laravel의 PHPUnit 병렬 실행

배경


  • GitHub Actions에서 테스트가 너무 많기 때문에 분산 처리를 원합니다
  • 좋은 참고 기사가 있었기 때문에 그것을 바탕으로 Laravel 용으로 설정
  • Laravel은 5.5~6.x를 가정

  • 결론



    github/workflows/phpunit.yml
    name: PHPUnit
    on:
    .
    .
    .
    #略
    
    
    jobs:
      test-php:
        name: Test PHP
        runs-on: ubuntu-latest
        strategy:
          fail-fast: false
          matrix:
            parallelism: [5]
            id: [0,1,2,3,4]
    .
    .
    .
    #略
        services:
          mysql:
            image: mysql:5.7
    .
    .
    .
    #略
        steps:
          - uses: actions/checkout@v2
          - name: Setup PHP
    .
    .
    .
    #略
          - name: Run Tests
            run: |
              find tests/ -name '*Test.php' | sort | awk "NR % ${{ matrix.parallelism }} == ${{ matrix.id }}" | xargs php ./create_multithread_phpunit_xml.php
              ./vendor/bin/phpunit --configuration ./ci_phpunit.xml
    

    create_multithread_phpunit_xml.php
    <?php
    
    $baseDir = realpath('./');
    $files   = array_slice($argv, 1);
    $xmlFileStringData = [];
    foreach ($files as $file) {
        $xmlFileStringData[] = "<file>{$baseDir}/{$file}</file>";
    }
    $testFileString = implode("\n", $xmlFileStringData);
    $template = <<<XML
    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit backupGlobals="false"
             backupStaticAttributes="false"
             bootstrap="vendor/autoload.php"
             colors="true"
             convertErrorsToExceptions="true"
             convertNoticesToExceptions="true"
             convertWarningsToExceptions="true"
             processIsolation="false"
             stopOnFailure="false">
            <testsuite name="Test Case">
                {$testFileString}
            </testsuite>
        <php>
            <env name="APP_ENV" value="testing"/>
            <env name="CACHE_DRIVER" value="array"/>
            <env name="SESSION_DRIVER" value="array"/>
            <env name="QUEUE_DRIVER" value="sync"/>
            <env name="DB_DATABASE" value="test_db"/>
            <env name="DB_USERNAME" value="root"/>
            <env name="DB_PASSWORD" value="root"/>
        </php>
    </phpunit>
    XML;
    
    file_put_contents("ci_phpunit.xml", $template);
    

    기본적으로는 GithubActions에서 phpunit 병렬 실행 를 참조할 수 있으면(자).

    결과



    이렇게 된다.



    참고 기사



    GithubActions에서 phpunit 병렬 실행

    좋은 웹페이지 즐겨찾기