Rumah >pembangunan bahagian belakang >tutorial php >Analisis liputan ujian dan perbandingan menggunakan PHP dan PHPUnit

Analisis liputan ujian dan perbandingan menggunakan PHP dan PHPUnit

WBOY
WBOYasal
2023-06-25 08:04:251177semak imbas

Dengan kemajuan berterusan pembangunan perisian, semakin ramai pembangun menyedari kepentingan ujian. Ujian boleh membantu pembangun mencari ralat dalam kod dan meningkatkan kualiti serta kebolehselenggaraan kod. Walau bagaimanapun, bilangan ujian biasanya sangat besar, dan ujian manual juga sangat memakan masa dan susah payah. Oleh itu, penggunaan alat ujian automatik telah menjadi sangat penting. Salah satu alat ialah PHPUnit ialah rangka kerja ujian PHP yang popular yang boleh melaksanakan kes ujian dengan cepat dan cekap dan menjana laporan ujian visual. Artikel ini akan memperkenalkan cara menggunakan PHPUnit untuk melaksanakan analisis dan perbandingan liputan ujian.

1. Apakah itu perlindungan ujian?

Liputan ujian merujuk kepada liputan laluan pelaksanaan kod program mengikut kes ujian, iaitu, perkadaran kod yang dilaksanakan apabila kes penggunaan dilaksanakan. Ia adalah penunjuk penting kualiti ujian. Dalam pembangunan sebenar, liputan ujian secara amnya dibahagikan kepada liputan penyata, liputan cawangan, liputan keadaan dan liputan laluan. Liputan penyata adalah yang paling asas dan paling mudah untuk dilaksanakan.

2. Gunakan PHPUnit untuk melaksanakan analisis liputan ujian

PHPUnit menyediakan alat analisis liputan ujian PHPUnit_Coverage, yang boleh digunakan untuk mengumpul maklumat liputan kod dan menjana laporan. PHPUnit_Coverage menyokong sambungan xdebug secara lalai, jadi sebelum menggunakan PHPUnit_Coverage untuk menganalisis liputan ujian, anda perlu memastikan sambungan xdebug telah dipasang. Jika ia tidak dipasang, anda perlu memasang xdebug melalui PECL terlebih dahulu. Selepas memasang xdebug, anda perlu menambah konfigurasi berikut pada fail 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"

Konfigurasi di atas adalah untuk mendayakan analisis liputan xdebug dan fungsi analisis prestasi kod, dan untuk mendayakan output automatik keputusan analisis.

Seterusnya, kita perlu menambah penjana liputan kod dalam phpunit.xml dan nyatakan laluan untuk menjana fail 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>

Apabila menjalankan kes ujian PHPUnit, tambah perintah --coverage-html=build/coverage parameter baris untuk menjana laporan liputan kod secara automatik.

3. Gunakan PHPUnit untuk mencapai perbandingan liputan ujian

Perbandingan liputan ujian merujuk kepada membandingkan laporan liputan ujian dua versi untuk memahami perubahan dalam kes ujian. PHPUnit menyediakan alat perbandingan liputan ujian SebastianBergmannDiff untuk melaksanakan fungsi ini. Membandingkan liputan ujian menggunakan SebastianBergmannDiff adalah mudah, cuma ikuti langkah berikut:

1 Pasang pakej SebastianBergmannDiff

composer require sebastian/diff

2 Tulis kaedah perbandingan

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;
}

Dalam kod, kami memuatkan laporan liputan ujian versi lama dan versi lama. versi baharu , dan bandingkan melalui kaedah compareCoverages Jika hasil perbandingan kosong, ini bermakna liputan ujian tidak berubah.

4. Ringkasan

Artikel ini memperkenalkan cara menggunakan PHPUnit untuk melaksanakan analisis dan perbandingan liputan ujian. Liputan ujian ialah salah satu penunjuk penting ujian perisian, yang boleh membantu pembangun menilai liputan kes ujian, dengan itu meningkatkan kualiti dan kebolehselenggaraan kod. PHPUnit ialah rangka kerja ujian PHP yang popular yang menyediakan pelbagai alat ujian dan penjana laporan, serta boleh menyokong analisis dan perbandingan liputan ujian dengan sempurna.

Atas ialah kandungan terperinci Analisis liputan ujian dan perbandingan menggunakan PHP dan PHPUnit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn