Meilleure façon de tester unitairement un site Web avec plusieurs types d'utilisateurs avec PHPUnit

StackOverflow https://stackoverflow.com/questions/58969

  •  09-06-2019
  •  | 
  •  

Question

Je commence à apprendre à utiliser PHPUnit pour tester le site Web sur lequel je travaille.Le problème que je rencontre est que j'ai cinq types d'utilisateurs différents définis et que je dois pouvoir tester chaque classe avec les différents types.J'ai actuellement une classe d'utilisateurs et j'aimerais la transmettre à chaque fonction mais je n'arrive pas à comprendre comment la transmettre ou tester les différentes erreurs qui pourraient revenir comme étant correctes ou non.

Modifier: J'aurais du dire.J'ai une classe d'utilisateurs et je souhaite transmettre une instance différente de cette classe à chaque test unitaire.

Était-ce utile?

La solution

Si vos différentes classes d'utilisateurs héritent d'une classe d'utilisateurs parent, je vous recommande d'utiliser la même structure d'héritage pour vos classes de scénarios de test.

Considérez les exemples de classes suivants :

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

Vous pouvez effectuer les opérations suivantes avec vos classes de cas de test :

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

Étant donné que chaque test dépend d'une méthode de création que vous pouvez remplacer et que les méthodes de test sont héritées de la classe de test parent, tous les tests de la classe parent seront exécutés sur la classe enfant, sauf si vous les remplacez pour modifier le comportement attendu.

Cela a très bien fonctionné dans mon expérience limitée.

Autres conseils

Si vous souhaitez tester l'interface utilisateur réelle, vous pouvez essayer d'utiliser quelque chose comme Selenium (www.openqa.org).Il vous permet d'écrire le code en PHP (qui, je suppose, fonctionnerait avec phpUnit) pour piloter le navigateur.

Une autre approche consisterait à disposer d'une méthode commune qui pourrait être appelée par chaque test pour vos différents types d'utilisateurs.c'est-à-dire quelque chose comme « ValidatePage », que vous pouvez ensuite appeler depuis TestAdminUser ou TestRegularUser et demander à la méthode d'effectuer simplement la même validation de base de ce que vous attendez.

Assurez-vous simplement de ne pas tomber sur un anti-modèle ici.Peut-être faites-vous trop de travail chez le constructeur ?Ou peut-être qu’il devrait s’agir de classes différentes ?Les tests vous donnent souvent des indices sur conception du code. Écoute-les.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top