2011-01-03 28 views
10

Estoy tratando de enfocarme un poco en las pruebas unitarias usando PHPunit.Prueba de Phpunit con la base de datos

he encontrado un tutorial muy bueno aquí http://blog.nickbelhomme.com/php/phpunit-training-course-for-free_282

pero hay algo extraño y todavía no entiendo cómo hacerlo.

Tengo un módulo de usuario que mantiene toda la información sobre los usuarios. Y hay una función de guardar que guarda al usuario en la base de datos. Así que tengo una TestFunction

public function testCanCreateUser() 
{ 
    $userData = array(
     'userName' => 'User1', 
     'firstName' => 'Joey', 
     'lastName' => 'Hendricks', 
     'email'  => '[email protected]', 
     'password' => 'f$tfe8F' 

    ); 
    $user = new Model_User($userData); 
    $user->save(); 

} 

La primera vez cuando voy a correr mi prueba de este trabajo Wil. Como la base de datos está vacía Pero cuando ejecuto mis pruebas por segunda vez, no funcionará, ya que mi sistema no permite al mismo usuario dos veces en la base de datos. Entonces, para hacer esto, tengo que volver a crear mi base de datos de prueba cada vez antes de ejecutar mis pruebas. ¿Cuál es la mejor manera de hacer esto? ¿O es este problema para ser resuelto de una manera diferente?

Tnx.

Respuesta

21

Si desea probar su lógica de negocio: Mock distancia a la clase de base de datos y devolver datos falsos

Si desea probar la clase que dispara las sentencias SQL (y en mi humilde opinión que podría probar que también, ya que un poco quiero saber si mi código funciona bien con una base de datos real en el back-end) se pone un poco complicado, pero hay maneras de hacerlo:

  • Uso de la configuración () y tearDown() para obtener un estado coherente para sus datos antes de ejecutar sus pruebas es (en mi caso) una forma excelente de escribir pruebas unitarias controladas por db. Sin embargo, puede ser molesto escribir muchas páginas sql personalizadas a mano.

  • Para que su vida sea más fácil, puede consultar el DbUnit extension y ver si eso funciona para su Aplicación.

  • Si realmente desea sumergirse en las interacciones de bases de datos la mejor prueba unitaria de lectura sobre el tema es (en mi humilde opinión) el capítulo sobre db-prueba unitaria en Sebastian Bergmanns phpqa book.

  • Si su aplicación permite un nombre de base de datos personalizado y una configuración automática de todas las tablas, también es posible establecer el archivo db una vez con muchos datos de prueba y usar esos datos en todas sus pruebas. Sin embargo, podría tener cuidado, ya que una prueba no se basa en datos escritos por otra.

+2

Me pregunto cómo sabes que hay un buen artículo en el libro de Sebastion Bergmanns mientras aún no está disponible. Pero sigue siendo algo complicado. – sanders

7

Ejecute pruebas con otra copia de la base de datos que esté vacía y/o borrada en los métodos setUp() o tearDown(), pero tenga cuidado de no hacer lo que github did.

Si está utilizando una buena base de datos (es decir, no MySQL las tablas MyISAM) se puede envolver en una transacción de prueba y rodar de nuevo después de la prueba:

function setUp() { $this->db->exec("BEGIN"); } 
function tearDown() { $this->db->exec("ROLLBACK"); } 

La desventaja es que no se puede código de prueba que usa transacciones (a menos que abstraiga eso y emule con savepoints, pero eso es dudoso).

una buena idea usar la inyección de dependencia y las pruebas se ejecutan en la clase de base de datos falsos:

$fakedb = new DatabaseThatDoesntReallySaveThings(); 
$user = new Model_User($fakedb, $userData); 
$user->save(); 
$this->assertTrue($fakedb->wasAskedToSaveUser()); 
2

Creo que se puede utilizar tearDown() método para limpiar los datos guardados.

protected $_user; 

public function testCanCreateUser() 
{ 
    ... 

    $this->_user = new Model_User($userData); 
    $this->_user->save(); 
} 

public function tearDown() 
{ 
    $this->_user->delete(); 
} 
Cuestiones relacionadas