소프트웨어 개발이 지속적으로 발전함에 따라 점점 더 많은 개발자가 테스트의 중요성을 인식하고 있습니다. 테스트는 개발자가 코드에서 오류를 찾고 코드의 품질과 유지 관리성을 향상시키는 데 도움이 될 수 있습니다. 그러나 일반적으로 테스트 횟수가 매우 많으며 수동 테스트에도 시간이 많이 걸리고 힘듭니다. 따라서 자동화된 테스트 도구를 사용하는 것이 특히 중요해졌습니다. 도구 중 하나는 PHPUnit입니다. PHPUnit은 테스트 사례를 빠르고 효율적으로 실행하고 시각적 테스트 보고서를 생성할 수 있는 인기 있는 PHP 테스트 프레임워크입니다. 이 기사에서는 PHPUnit을 사용하여 테스트 범위 분석 및 비교를 구현하는 방법을 소개합니다.
1. 테스트 커버리지란 무엇인가요?
테스트 커버리지란 테스트 케이스별 프로그램 코드 실행 경로의 커버리지, 즉 유스 케이스가 실행될 때 실행되는 코드의 비율을 의미합니다. 이는 테스트 품질을 나타내는 중요한 지표입니다. 실제 개발에서 테스트 커버리지는 크게 스테이트먼트 커버리지, 브랜치 커버리지, 조건 커버리지, 경로 커버리지로 나누어진다. 명령문 적용 범위는 가장 기본적이고 구현하기 가장 쉽습니다.
2. PHPUnit을 사용하여 테스트 커버리지 분석 구현
PHPUnit은 코드 커버리지 정보를 수집하고 보고서를 생성하는 데 사용할 수 있는 매우 편리한 테스트 커버리지 분석 도구인 PHPUnit_Coverage를 제공합니다. PHPUnit_Coverage는 기본적으로 xdebug 확장을 지원하므로 PHPUnit_Coverage를 사용하여 테스트 커버리지를 분석하기 전에 xdebug 확장이 설치되어 있는지 확인해야 합니다. 설치되어 있지 않은 경우 먼저 PECL을 통해 xdebug를 설치해야 합니다. xdebug를 설치한 후 php.ini 파일에 다음 구성을 추가해야 합니다.
[xdebug] zend_extension="/usr/local/opt/php@7.3/pecl/20180731/xdebug.so" xdebug.coverage_enable=On xdebug.profiler_enable_trigger=On xdebug.profiler_output_name="%R.%U" xdebug.profiler_output_dir="/tmp"
위 구성은 xdebug의 커버리지 분석 및 코드 성능 분석 기능을 활성화하고, 분석 결과 자동 출력을 활성화하기 위한 것입니다.
다음으로 phpunit.xml에 코드 적용 범위 생성기를 추가하고 Coverage.xml 파일을 생성할 경로를 지정해야 합니다.
<coverage> <include> <directory suffix=".php">./src</directory> </include> <report> <clover outputFile="build/logs/clover.xml"/> <html outputFile="build/coverage"/> <text outputFile="build/logs/coverage.txt"/> <text outputFile="build/logs/coverage.xml"/> </report> <logging> <log type="coverage-html" target="build/coverage"/> </logging> </coverage>
PHPUnit 테스트 사례를 실행할 때 --coverage-html=build/coverage 명령을 추가하세요. 코드 범위 보고서를 자동으로 생성하는 라인 매개변수입니다.
3. PHPUnit을 사용하여 테스트 커버리지 비교
테스트 커버리지 비교는 테스트 케이스의 변경 사항을 이해하기 위해 두 버전의 테스트 커버리지 보고서를 비교하는 것을 의미합니다. PHPUnit은 이 기능을 구현하기 위해 테스트 범위 비교 도구인 SebastianBergmannDiff를 제공합니다. SebastianBergmannDiff를 사용하여 테스트 커버리지를 비교하는 것은 간단합니다.
1. SebastianBergmannDiff 패키지를 설치합니다.
composer require sebastian/diff
2. 비교 방법을 작성합니다.
public function testCoverage() { $oldCoverage = new PHP_CodeCoverage(); $oldCoverage->append($this->getCoverageData('old_coverage.xml')); $newCoverage = new PHP_CodeCoverage(); $newCoverage->append($this->getCoverageData('new_coverage.xml')); $diff = $this->compareCoverages($oldCoverage, $newCoverage); $this->assertEmpty($diff, 'Coverage has not changed.'); } private function compareCoverages(PHP_CodeCoverage $oldCoverage, PHP_CodeCoverage $newCoverage): string { $oldReport = new CodeCoverageReportHtmlFacade; $oldReport->process($oldCoverage, '/tmp/old-coverage'); $newReport = new CodeCoverageReportHtmlFacade; $newReport->process($newCoverage, '/tmp/new-coverage'); $oldXml = $this->getXml('/tmp/old-coverage/index.html'); $newXml = $this->getXml('/tmp/new-coverage/index.html'); $differ = new SebastianBergmannDiffDiffer; return $differ->diff($oldXml, $newXml); } private function getXml(string $file): SimpleXMLElement { return simplexml_load_string(file_get_contents($file), 'SimpleXMLElement', LIBXML_NOCDATA); } private function getCoverageData(string $filename): array { $result = []; $xml = file_get_contents($filename); $coverage = new PHP_CodeCoverage(); $coverage->setDataToBeUnserialized($xml); $filter = $coverage->getFilter(); $filter->addDirectoryToWhitelist('/app'); $filter->addDirectoryToWhitelist('/tests'); foreach ($coverage->getData() as $filename => $data) { $result[$filename] = [ 'executed' => $data['executedLines'], 'unexecuted' => $data['executableLines'] - $data['executedLines'] ]; } return $result; }
코드에서 먼저 이전 버전과 새 버전으로 비교하고 CompareCoverages 메서드를 통해 비교합니다. 비교 결과가 비어 있으면 테스트 범위가 변경되지 않았음을 의미합니다.
4. 요약
이 글에서는 PHPUnit을 사용하여 테스트 커버리지 분석 및 비교를 구현하는 방법을 소개합니다. 테스트 커버리지는 소프트웨어 테스팅의 중요한 지표 중 하나이며 개발자가 테스트 케이스의 커버리지를 평가하는 데 도움을 주어 코드의 품질과 유지 관리성을 향상시킬 수 있습니다. PHPUnit은 다양한 테스트 도구와 보고서 생성기를 제공하고 테스트 범위 분석 및 비교를 완벽하게 지원할 수 있는 인기 있는 PHP 테스트 프레임워크입니다.
위 내용은 PHP 및 PHPUnit을 사용한 테스트 커버리지 분석 및 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!