Pcov를 사용하여 Xdebug보다 2배 이상 빠른 PHPUnit 코드 덮어쓰기 방법

PHPUnit은 실제로 PHP의 테스트 라이브러리입니다.PCov를 사용하면 PHP7.0+ 어플리케이션의 PHPUnit 코드 커버율을 2~5배 높일 수 있습니다.본문에서 우리는 내가 Laravel 프레임워크 테스트에서 한 실험의 결과를 비교할 것이다.테스트는 덮어쓰지 않고 실행한 다음 Xdebug 덮어쓰기를 사용하고 마지막으로 PCov all on Github 작업을 사용합니다.Xdebug에 비해 Pcov가 코드 커버율 측면에서 PHPUnit 테스트를 실행하는 데 걸리는 시간은 Xdebug의 절반이다. 숫자를 살펴보자.

CI 구축 시간 단축


장기적으로 볼 때 매번 구축할 때마다 12초를 절약하는 것은 무엇을 의미하는가?만약 당신이 매번 구축에서 12초를 절약할 수 있다면, 그것은 5번의 구축에서 1분을 절약하는 것과 같다.

In just 100 builds you save 20 minutes and in 1000 builds that number becomes 3 hours and 20 mins.


이것도 당신의 동료를 위해 얼마나 많은 대기 시간을 절약할 수 있는지 생각해 보세요.

Xdebug 대신 PHP 코드를 덮어쓰기


XDebug는 디버거이며 덮어쓸 수도 있습니다.PHPdbg는 Xdebug의 또 다른 대체품이다.Pcov는 PHPUnit 코드를 덮어쓰기 위해 만들어진 것이지 다른 것이 아니다.
Michael Dyrynda도 이 문제를 언급했다. 그는 다음과 같이 말했다.

You have access to the same output formats that are available to PHPUnit (formatted output, clover, JSON, HTML, etc.) with none of the overhead.


그는 또 타격max_nesting_limit과 같은 Xdebug의 다른 문제도 지적했다. 너도 그의 블로그 글을 읽어야 한다.

PCov 덮어쓰기 코드 고려 사항


  • Pcov는 PHP7 이상 버전
  • 의 독립 PHP 코드 오버레이율 드라이버입니다.
  • PHPUnit 8 이상 지원 PCOV 구입 즉시 사용 가능, PHPUnit 7 및 이하 릴리즈의 경우pcov-clobber
  • Pcov는 지속적인 통합(CI) 환경에서 매우 의미가 있습니다. CI에서 코드를 디버깅할 필요가 없기 때문입니다.)
  • To show a real-life scenario we are going to see how long Laravel Framework’s 5700+ tests with 15500+ assertions are going to take in our quick experiment.


    우리 시작합시다!

    PHPUnit 코드 덮어쓰기 속도 향상


    저는 Laravel 프레임워크를 선택했습니다. 유행하기 때문일 뿐만 아니라 테스트가 많아서 5700개가 넘었습니다.무엇보다 라벨 8번을 위해서다.x분기, 테스트가 Github Actions에서 실행 중입니다.
    라벨 8번 테스트.x는 PHP의 여러 버전에서 운행한다. 예를 들어 7.3, 7.4, 8은 최저에서 안정적인 변체에서 운행한다.같은 테스트도 윈도우즈에서 실행됩니다.

    Another reason to choose Laravel 8.x was it is using PHPUnit 9.3 which does not need pcov-clobber to get the PHPUnit coverage.


    나는 이전에 블로그에 입문에 관한 글을 쓴 적이 있다Unit testing in Laravel. 이것은 좋은 단원 테스트 복습일 것이다.Data provider for PHPunit도 테스트 코드를 더 적게 작성하지만 더 많은 코드 커버율을 실현하는 좋은 방법이다.
    다음은 PHPUnit 코드를 덮어쓰는 데 있어서 Pcov가 Xdebug에 얼마나 빠른지 알아보기 위한 절차입니다.

    Fork Laravel/framework repo 및 PHP7.4에 대해서만 테스트 실행


    간단하게 보기 위해서 저는 Laravel/framework Githubrepo를 사용했습니다.이후에 Github 운영 테스트 워크플로우를 현재 안정적인 버전의 PHP 7.4에서만 테스트를 실행하도록 변경했습니다.너는 내가 이 pull request 에서 한 변경 사항을 볼 수 있다.

    Opening the pull requests ran the tests without PHPUnit code coverage and it took 33 seconds to run the tests consuming 257MB of memory.


    Gitub Actions page 에서 이 테스트가 실행되는 상세한 정보를 볼 수 있습니다. 다음은 빠른 화면 캡처입니다.

    XDebug를 사용하여 PHPUnit 코드 덮어쓰기 실행


    위의 pull 요청을 병합했습니다. PHP 7.4에 대해서만 테스트를 실행합니다.그런 다음 Xdebug를 드라이버로 사용하여 PHPUnit 테스트를 코드 오버레이로 수정했습니다.Gitub action은 shivammathur/setup-php@v2 action을 사용하기 때문에 변경이 매우 간단합니다.구글에서 검색한 후에 나는 이 동작이 이미 성공했고 Code Coverage support 사용하기 쉽다는 것을 발견했다.
    덮어쓰기 범위를 none에서 xdebug로 변경하고 PHPUnit 명령에 --coverage-text를 추가해야 합니다.
    vendor/bin/phpunit --verbose --coverage-text
    
    나는 tests.yml 파일의 두 군데에서 이러한 변경을 했는데 결과는pull request이었다.새 pull 요청 = Github Actions CI에서 다시 실행되는 테스트.
    Xdebug 코드 덮어쓰기가 생겨서 테스트를 실행하는 데 걸리는 시간에 큰 차이가 있는지 몇 번 더 실행했습니다.대체로 같다.

    In one of the runs of code coverage with Xdebug took 2 mins 34 seconds and consumed 395 MB of memory.


    나는 단지 Execute tests 임무를 살펴보는 시간일 뿐이다.다음과 같은 화면 표시를 볼 수 있습니다.

    코드 덮어쓰기 비율은 Xdebug를 사용하는 PHPUnit 코드의 덮어쓰기 비율은 75.65%의 행과 68.90%의 방법을 포함한다.

    Pcov의 PHPUnit 코드 커버율 2배 향상


    현재 Xdebug의 시간은 154 seconds 입니다. 새로운 덮어쓰기 드라이버 Pcov 가 얼마나 걸리는지 보고 싶습니다.나는 답을 찾기 위해 다시 비슷한 방법을 써서 라레빌 8번지로 갔다.x 분기, 편집을 시작합니다 .github/workflows/tests.yml.PHP action 지원pcov에 감사드립니다. 범위는 none에서 pcov로 변경합니다.
    내가 변경한 것은 이것pull request에 있다.이것은 Github 기반의 또 다른 구축 작업을 촉발시켰다.

    This time surprisingly it took just 1 minute 17 seconds and consumed 393 MB of memory.


    이 작업은 다음과 같이 Execute tests 작업에도 적용됩니다.

    Xdebug와 마찬가지로 PHPUnit 코드 오버레이율은 PCov 오버레이의 75.65% 행과 68.90% 방법으로 보고됩니다.내 Laravel Framework fork Actions tab에서 다른 테스트 실행을 볼 수 있습니다.

    코드 덮어쓰기의 빠른 비교


    PHPUnit 테스트가 코드 덮어쓰기와 코드 덮어쓰기 없이 얼마나 오래 걸리는지 빠르게 살펴보겠습니다.
    PHPUnit 테스트 실행(PHP 7.4 Linux)
    시간을 소모하다
    메모리 소모
    무보험
    33초
    257 MB
    XDebug 오버레이율
    2분 34초(154초)
    395 MB
    Pcov 적용 범위
    1분 17초(77초)
    393MB

    It is very clear that Pcov took half the time as Xdebug and even consumed lesser memory. PHPUnit code coverage with Pcov took 77 seconds and with Xdebug took double of that at 154 seconds.


    docker 용기에서 로컬로 실행하는 동안 결과가 매우 다르다.Xdebug의 경우 이들 Laravel 프레임워크 테스트는 15분 15초(403MB), Pcov 드라이버를 사용하는 테스트는 3분 25초(399MB)가 소요됩니다.

    Pcov was 4.43 times faster on my local machine inside a docker container.


    저뿐만 아니라 Xdebug 대신 PCov로 코드 커버율을 5배 높였다고 보고했습니다.순수 숫자에 대해 말하자면 나는 테스트를 실시했는데 그 중에서 Xdebug 테스트17 seconds를 사용했고 PCov 테스트1 second를 사용했다.그것은 Xdebug보다 17배 빠르지만, 이것은 Xdebug와 Pcov의 코드 커버율을 비교하는 표준이 되어서는 안 된다.
    PHPDbg는 PHP Github action에서 사용할 수 없기 때문에 옵션으로 사용하지 않았습니다.Xdebug와 Pcov 사이를 빠르게 전환하려면 본문guide을 읽으십시오.

    결론


    PHPUnit 코드 범위는 일반적으로 Xdebug과 결합됩니다.XDebug의 코드 수렴 보고 속도가 느린 것이 문제입니다.PCov는 디버깅이 아닌 PHPUnit 코드 덮어쓰기를 위해 만들어졌으며, 코드 수집 덮어쓰기를 더욱 빠르게 한다.

    If you want to speed up your code coverage and save time on your CI builds use Pcov in place of Xdebug. You will surely like the time saved after the process is done. Happy faster testing and coverage reports!

    좋은 웹페이지 즐겨찾기