Maison  >  Article  >  développement back-end  >  Utilisation de base du framework de test PHP PHPUnit

Utilisation de base du framework de test PHP PHPUnit

Guanhui
Guanhuiavant
2020-05-07 09:49:473714parcourir

1. Préface

Dans cet article, nous utilisons l'outil de gestion des packages de dépendances de composer pour installer et gérer les packages phpunit. getcomposer.org/, suivez simplement les instructions pour l'installer globalement. De plus, nous utiliserons également un composant de journalisation Monolog très facile à utiliser pour enregistrer les journaux pour notre commodité.

Créez le fichier de configuration de coomposer.json dans le répertoire racine et entrez le contenu suivant :

{
    "autoload": {
        "classmap": [
            "./"
        ]
    }
}

Ce qui précède signifie charger tous les fichiers de classe dans le répertoire racine et l'exécuter sur la commande line Après l'installation de composer, un dossier fournisseur sera généré dans le répertoire racine. Tout code tiers que nous installerons via composer à l'avenir sera généré ici.

2. Pourquoi les tests unitaires ?

Chaque fois que vous pensez à taper quelque chose dans une instruction d'impression ou une expression de débogage, remplacez-le par un test. --Martin Fowler

PHPUnit est un logiciel open source développé dans le langage de programmation PHP et est un framework de tests unitaires. PHPUnit a été créé par Sebastian Bergmann, dérivé de SUnit de Kent Beck, et est l'un des frameworks de la famille xUnit.

Les tests unitaires sont le processus de test d'objets de code individuels, tels que les fonctions, les classes et les méthodes. Les tests unitaires peuvent utiliser n'importe quel morceau de code de test qui a été écrit, ou vous pouvez utiliser certains frameworks de tests existants, tels que JUnit, PHPUnit ou Cantata++. Le framework de tests unitaires fournit une série de fonctions courantes et utiles pour aider les utilisateurs à écrire des unités de détection automatisées. , comme une assertion qui vérifie si une valeur réelle correspond à la valeur attendue. Les frameworks de tests unitaires incluent souvent des rapports pour chaque test et vous donnent la couverture de code que vous avez couverte.

En un mot, l'utilisation de phpunit pour les tests automatiques rendra votre code plus robuste et réduira le coût de la maintenance ultérieure. Il s'agit également d'une spécification relativement standard. Les frameworks PHP populaires d'aujourd'hui sont tous livrés avec des tests unitaires. , Symfony, Yii2, etc., les tests unitaires sont devenus la norme.

De plus, le scénario de test unitaire contrôle le script de test via des commandes, plutôt que d'accéder à l'URL via le navigateur.

3. Installez PHPUnit

Utilisez composer pour installer PHPUnit, veuillez voir ici

composer require --dev phpunit/phpunit ^6.2

Installer. Package de journal Monolog, utilisé pour les tests et la journalisation PHPunit.

composer require monolog/monolog

Après l'installation, nous pouvons voir que le fichier coomposer.json contient déjà ces deux packs d'extension :

"require": {  
     "monolog/monolog": "^1.23",
    },
"require-dev": {
        "phpunit/phpunit": "^6.2"
    },

Utilisation simple de PHPUnit

1. Test de fichier unique

Créez le répertoire tests, créez un nouveau fichier StackTest.php, éditez-le comme suit :

<?php
/**
 * 1、composer 安装Monolog日志扩展,安装phpunit单元测试扩展包
 * 2、引入autoload.php文件
 * 3、测试案例
 *
 *
 */
namespace App\tests;
require_once __DIR__ . &#39;/../vendor/autoload.php&#39;;
define("ROOT_PATH", dirname(__DIR__) . "/");
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
    public function testPushAndPop()
    {
        $stack = [];
        $this->assertEquals(0, count($stack));
        array_push($stack, &#39;foo&#39;);
        // 添加日志文件,如果没有安装monolog,则有关monolog的代码都可以注释掉
        $this->Log()->error(&#39;hello&#39;, $stack);
        $this->assertEquals(&#39;foo&#39;, $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals(&#39;foo&#39;, array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
    public function Log()
    {
        // create a log channel
        $log = new Logger(&#39;Tester&#39;);
        $log->pushHandler(new StreamHandler(ROOT_PATH . &#39;storage/logs/app.log&#39;, Logger::WARNING));
        $log->error("Error");
        return $log;
    }
}

Code explication :

StackTest est une classe de test

StackTest hérite de PHPUnitFrameworkTestCase

méthode de test testPushAndPop() La méthode de test doit avoir des autorisations publiques et commence généralement par test, ou vous. peut choisir d'y ajouter des commentaires. @test vient représenter

Dans la méthode de test, des méthodes d'assertion similaires à assertEquals() sont utilisées pour faire des assertions sur la correspondance entre la valeur réelle et la valeur attendue.

Exécution de la ligne de commande :

Nom du fichier de test de la commande phpunit

➜  framework#  ./vendor/bin/phpunit tests/StackTest.php
// 或者可以省略文件后缀名
//  ./vendor/bin/phpunit tests/StackTest

Résultats de l'exécution :

➜  framework# ./vendor/bin/phpunit tests/StackTest.php
PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
.                                                                   1 / 1 (100%)
Time: 56 ms, Memory: 4.00MB
OK (1 test, 5 assertions)

Nous pouvons voir ce que nous avons imprimé dans le fichier app.log Informations de journal.

2. Introduction au fichier de classe

Calculator.php

<?php  
class Calculator  
{  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

Classe de test unitaire :

CalculatorTest.php

<?php
namespace App\tests;
require_once __DIR__ . &#39;/../vendor/autoload.php&#39;;
require "Calculator.php";
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
    public function testSum()
    {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }
}

Exécution de la commande :

> ./vendor/bin/phpunit tests/CalculatorTest

Résultat de l'exécution :

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
F                                                                   1 / 1 (100%)
Time: 117 ms, Memory: 4.00MB
There was 1 failure:

Si nous écrivons délibérément l'assertion ici de manière erronée, $this->assertEquals(1, $obj->sum(0 , 0));

Regardez les résultats de l'exécution :

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
F                                                                   1 / 1 (100%)
Time: 117 ms, Memory: 4.00MB
There was 1 failure:
1) App\tests\CalculatorTest::testSum
Failed asserting that 0 matches expected 1.
/Applications/XAMPP/xamppfiles/htdocs/web/framework/tests/CalculatorTest.php:22
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

signalera directement le message d'erreur de la méthode et le numéro de ligne, ce qui nous aide à trouver rapidement le bug

3. Utilisation avancée

En avez-vous assez d'ajouter test devant chaque nom de méthode de test ? Avez-vous du mal à écrire plusieurs cas de test car les paramètres que vous appelez sont différents ? Ma fonctionnalité avancée préférée, que je vous recommande maintenant, s'appelle Frame Builder.

Calculator.php

<?php  
class Calculator  
{  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

Ligne de commande pour démarrer le scénario de test, utilisez le mot-clé --skeleton

> ./vendor/bin/phpunit --skeleton Calculator.php

Résultat de l'exécution :

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
Wrote test class skeleton for Calculator to CalculatorTest.php.

N'est-ce pas c'est très simple ? Parce qu'il n'y a pas de données de test, ajoutez des données de test ici, puis réexécutez la commande ci-dessus

<?php  
class Calculator  
{  
    /** 
     * @assert (0, 0) == 0 
     * @assert (0, 1) == 1 
     * @assert (1, 0) == 1 
     * @assert (1, 1) == 2 
     */  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

Chaque méthode de la classe d'origine est testée pour l'annotation @assert. Ceux-ci sont transformés en code de test, comme ceci

    /**
     * Generated from @assert (0, 0) == 0.
     */
    public function testSum() {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }

Résultats d'exécution :

Tutoriel recommandé : "

Tutoriel PHP"

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer