Partage
  • Partager sur Facebook
  • Partager sur Twitter

test unitaire

comment tester unitairement des fonctions ?

    9 novembre 2017 à 11:13:55

    Bonjour à tous ;)

    Je viens de l'univers JAVA et dans cet environnement on peut utiliser certains framework comme Junit pour tester son code en utilisant les mock.

    j'utilise php sans utiliser de class juste avec des appels de fonctions, et je me demandais du coup comment faire pour tester l'ensemble de mes fonction unitairement.

    Pour faire simple, si j'ai 3 fonction :

    function op($cond,$entier)
    {
       if($cond)
          increment($entier);
       else
          decrement($entier);
    }
    
    function increment($entier)
    {
       return $entier+1;
    }
    
    function decrement($entier)
    {
       return $entier-1;
    }

    En java si on voyait ça dans une classe il aurait suffit de faire des mocks dans la fonction "op" sur "increment" et "decrement".

    Mais pour php (sans classe) pour tester "increment" et "decrement" c'est facile il suffit de tester quelques valeurs et on voit bien que ça marche.

    En revanche pour tester "op" je voudrais juste savoir si "increment" à été appellé si cond == true et "decrement" a été appellé si cond == false. L'ennuie c'est que je ne veut pas appeller réellement les fonctions "increment" ou "decrement". je voudrais jsute vérifier si elle sont appellé mais ne pas executer leurs code. En gros je voudrais mocker ces fonctions. Mais comment le faire en php sans utiliser de classe juste avec des fonctions ? 

    L'objectif étant de faire des tests de non regression automatique, il ne faut pas que j'ai a modifier le code source pour remplacer les appel des fonctions à chaque fois que je veux vérifier...

    Tout ça pour dire que j'ai du mal à isoler une fonction pour la tester sans avoir a appeller toutes les autres fonctions qui en découle.

    Je sais pas si j'ai été clair ?

    Merci d'avance de votre aide :)

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2017 à 20:25:25

      Bonjour,

      PHPUnit ne convient pas ? https://phpunit.de/

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        10 novembre 2017 à 8:09:00

        Si, si tu utilises des classes pour mocker les fonctions que tu veux contrôler. Mais quand tu utilises une programmation uniquement fonctionnel ben tu ne peux pas mocker un objet si il n'existe pas ^^

        Ah moins que je ne sache pas faire et dans ce cas là je suis ouvert à un éclaircissement :)

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2017 à 9:11:50

          https://stackoverflow.com/questions/11269707/phpunit-test-function-outside-class

          ça a l'air possible avec PHPUnit à creuser

          -
          Edité par refschool 10 novembre 2017 à 9:11:56

          • Partager sur Facebook
          • Partager sur Twitter
            25 novembre 2017 à 20:54:10

            C'est possible en effet comme je l'ai dit sur mon message. La question ce n'est pas est ce que c'est possible mais comment faire pour réussir à tester des fonction sans pour autant devoir tester les fonctions interne à la fonction testé

            • Partager sur Facebook
            • Partager sur Twitter
              26 novembre 2017 à 11:48:32

              C'est justement l'intérêt des tests unitaires, en testant ta fonction op tu vas aussi tester tes fonctions increment et decrement. Donc si demain tu changes ton increment en + 2 au lieu de + 1 tes tests passeront plus.

              • Partager sur Facebook
              • Partager sur Twitter
                26 novembre 2017 à 23:37:06

                Bonjour,

                non mais en fait, ça n'est pas possible, il faut faire une classe. Comme en java en fait :) en java le test unitaire est possible, mais pas seulement parce que c'est des classes : c'est surtout parce que tu fais de l'injection : tu peux injecter les mocks 'increment' et 'decrement' dans ta fonction 'op' et donc faire un test unitaire sur 'op' sans aucune dépendance sur les fonctions appelées.

                Ici avec des fonctions tu ne peux rien injecter. Donc comme le dit Succelos tu en es réduis à tester en même temps 'op' et tout ce qu'il y a dedans. Tu ne peux pas casser ces dépendances sans passer à un modèle objet.

                • Partager sur Facebook
                • Partager sur Twitter
                  26 décembre 2017 à 8:36:02

                  C'est bien ce que je pensais mais je me demandais si il n'y avait pas des "hack" ^^

                  Tant pis, merci pour vos réponse ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 décembre 2017 à 8:34:31

                    Je crois que c'est possible ... 

                    Je suis allé à un meetup Symfony dernièrement et un intervenant a montré comment faire des tests unitaires en faisant des mocks sur les fonctions.

                    J'avoue ne pas m'y être replongé pour bien comprendre ... au détriment des tests fonctionnels que je réalise.

                    Je fournis le lien de ses exemples : https://github.com/charlycoste/meetup-20171213

                    A+

                    • Partager sur Facebook
                    • Partager sur Twitter

                    test unitaire

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown