Maison >développement back-end >tutoriel php >Analyse et comparaison de la couverture des tests à l'aide de PHP et PHPUnit

Analyse et comparaison de la couverture des tests à l'aide de PHP et PHPUnit

WBOY
WBOYoriginal
2023-06-25 08:04:251161parcourir

Avec l'avancement continu du développement logiciel, de plus en plus de développeurs sont conscients de l'importance des tests. Les tests peuvent aider les développeurs à détecter les erreurs dans le code et à améliorer la qualité et la maintenabilité du code. Cependant, le nombre de tests est généralement très important et les tests manuels sont également très longs et laborieux. Par conséquent, l’utilisation d’outils de tests automatisés est devenue particulièrement importante. L'un des outils est PHPUnit. PHPUnit est un framework de test PHP populaire qui peut exécuter rapidement et efficacement des cas de test et générer des rapports de test visuels. Cet article explique comment utiliser PHPUnit pour implémenter l'analyse et la comparaison de la couverture des tests.

1. Qu'est-ce que la couverture des tests ?

La couverture des tests fait référence à la couverture du chemin d'exécution du code du programme par les cas de test, c'est-à-dire la proportion de code exécuté lorsque le cas d'utilisation est exécuté. C'est un indicateur important de la qualité des tests. Dans le développement réel, la couverture des tests est généralement divisée en couverture de déclaration, couverture de branche, couverture de condition et couverture de chemin. La couverture des relevés est la plus basique et la plus simple à mettre en œuvre.

2. Utilisez PHPUnit pour implémenter l'analyse de la couverture des tests

PHPUnit fournit un outil d'analyse de la couverture des tests très pratique PHPUnit_Coverage, qui peut être utilisé pour collecter des informations sur la couverture du code et générer des rapports . PHPUnit_Coverage prend en charge l'extension xdebug par défaut, donc avant d'utiliser PHPUnit_Coverage pour analyser la couverture des tests, vous devez vous assurer que l'extension xdebug a été installée. S'il n'est pas installé, vous devez d'abord installer xdebug via PECL. Après avoir installé xdebug, vous devez ajouter la configuration suivante au fichier 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"

La configuration ci-dessus sert à activer les fonctions d'analyse de couverture et d'analyse des performances du code de xdebug, ainsi qu'à activer la sortie automatique des résultats d'analyse. .

Ensuite, nous devons ajouter le générateur de couverture de code dans phpunit.xml et spécifier le chemin pour générer le fichier cover.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>

Lors de l'exécution du scénario de test PHPUnit, ajoutez le paramètre de ligne de commande --coverage-html=build/coverage pour générer automatiquement un rapport de couverture de code.

3. Utilisez PHPUnit pour réaliser une comparaison de couverture de test

La comparaison de couverture de test fait référence à la comparaison des rapports de couverture de test de deux versions pour comprendre les changements dans les cas de test. PHPUnit fournit un outil de comparaison de couverture de test SebastianBergmannDiff pour implémenter cette fonction. Utiliser SebastianBergmannDiff pour comparer la couverture des tests est simple, suivez simplement ces étapes :

1 Installez le package SebastianBergmannDiff

composer require sebastian/diff

2. Écrivez une méthode de comparaison

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;
}
#🎜. 🎜 #Dans le code, nous chargeons d'abord le rapport de couverture de test de l'ancienne version et de la nouvelle version, et les comparons via la méthode compareCoverages. Si le résultat de la comparaison est vide, cela signifie que la couverture de test n'a pas changé.

4. Résumé

Cet article présente comment utiliser PHPUnit pour implémenter l'analyse et la comparaison de couverture de tests. La couverture des tests est l'un des indicateurs importants des tests logiciels, qui peut aider les développeurs à évaluer la couverture des cas de test, améliorant ainsi la qualité et la maintenabilité du code. PHPUnit est un framework de test PHP populaire qui fournit une multitude d'outils de test et de générateurs de rapports, et peut parfaitement prendre en charge l'analyse et la comparaison de la couverture des tests.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn