La mejor manera de realizar pruebas unitarias de un sitio web con múltiples tipos de usuarios con PHPUnit

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy empezando a aprender a usar PHPUnit para probar el sitio web en el que estoy trabajando.El problema con el que me encuentro es que tengo cinco tipos de usuarios diferentes definidos y necesito poder probar cada clase con los diferentes tipos.Actualmente tengo una clase de usuario y me gustaría pasar esto a cada función, pero no puedo entender cómo pasar esto o probar los diferentes errores que podrían resultar correctos o no.

Editar: Debí decir.Tengo una clase de usuario y quiero pasar una instancia diferente de esta clase a cada prueba unitaria.

¿Fue útil?

Solución

Si sus diversas clases de usuario heredan de una clase de usuario principal, le recomiendo que utilice la misma estructura de herencia para sus clases de casos de prueba.

Considere las siguientes clases de muestra:

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

Podrías hacer lo siguiente con tus clases de casos de prueba:

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

Debido a que cada prueba depende de un método de creación que puede anular, y debido a que los métodos de prueba se heredan de la clase de prueba principal, todas las pruebas de la clase principal se ejecutarán en la clase secundaria, a menos que las anule para cambiar el comportamiento esperado.

Esto ha funcionado muy bien en mi experiencia limitada.

Otros consejos

Si desea probar la interfaz de usuario real, puede intentar usar algo como Selenium (www.openqa.org).Te permite escribir el código en PHP (que supongo que funcionaría con phpUnit) para controlar el navegador.

Otro enfoque sería tener un método común que pueda ser llamado por cada prueba para su tipo de usuario diferente.es decir, algo como 'ValidatePage', que luego podría llamar desde TestAdminUser o TestRegularUser y hacer que el método simplemente realice la misma validación básica de lo que espera.

Solo asegúrate de no encontrarte con un anti-patrón aquí.¿Quizás trabajas demasiado en el constructor?¿O tal vez deberían ser en realidad clases diferentes?Las pruebas a menudo le dan pistas sobre diseño de código. Escúchalos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top