Debacle de prueba pronunciada... Supongo que puedes omitir la parte -db- si quieres una palabra un poco más corta y te sientes inclinado.
Test-DB-Acle es una biblioteca PHP para facilitar la escritura de pruebas sencillas y concisas para la capa de base de datos.
Creo que escribir pruebas debería ser lo más fácil posible para el desarrollador, y también deberían ser lo más fáciles de leer posible para que otros desarrolladores las lean.
Esto significa que cualquier dato de prueba en la prueba debe ser relevante únicamente para el escenario de prueba. Sin embargo, la mayoría de las tablas de bases de datos tienen columnas no nulas que requieren que usted ingrese datos ficticios que solo introducen ruido cognitivo en la prueba.
Test-Db-Acle tiene como objetivo aliviar esta carga al desarrollador. El marco de prueba no hace suposiciones sobre cómo funcionan las clases de la capa de su base de datos, si usan un ORM como Doctrine, procedimientos almacenados o SQL directo, el principio es siempre el mismo, en algún momento el código interactúa con los datos en las tablas de la base de datos. , y necesitamos probar esto.
Instalación a través del compositor.
deshabilita las comprobaciones de claves externas en la base de datos
trata automáticamente con columnas no nulas
recorta automáticamente las columnas de fecha/hora en MySQL cuando se afirma que los valores están en tablas de base de datos; útil para marcas de tiempo insertadas (en Sqlite, estas columnas deben especificarse)
Prácticamente todos los componentes se pueden intercambiar y reemplazar por variedades personalizadas.
soporta Mysql y Sqlite actualmente
Es independiente del marco, no supone si se utilizan ORM, por ejemplo, y debería ser fácilmente adaptable a otros marcos de pruebas unitarias.
Las bases de datos soportadas son, actualmente, MySql (y por extensión MariaDB) y Sqlite.
La arquitectura debería permitir que se agreguen más bases de datos.
Esta biblioteca se puede utilizar de forma inmediata con PHPUnit. Debería ser bastante fácil usarlo con otros marcos de prueba usando los rasgos proporcionados y delegando el método 'assertEquals' al método equivalente (por ejemplo, recuerdo que era 'assertEqual' en SimpleTest).
He proporcionado un TestDbAclePhpUnitAbstractTestCase sencillo, así como TestDbAclePhpUnitTraitsDatabaseHelperTrait si estás usando PHP 5.4 y no te importa usar rasgos.
Ok, para ser justos, probar la capa de base de datos es costoso y ralentiza las pruebas, y siempre que sea posible se debe burlar de cualquier dependencia en la base de datos. Pero a veces simplemente tenemos que hacer esto; con suerte, en una aplicación bien estructurada esto se puede mantener al mínimo.
Hay muchas herramientas y enfoques disponibles (por ejemplo DBUnit o el uso de métodos de fábrica en sus pruebas unitarias) para ayudar con las pruebas de bases de datos, cada uno con sus propias fortalezas, este enfoque funciona para mí porque:
No tengo que preocuparme por columnas nulas o restricciones de clave externa
Proporciono un conjunto mínimo de datos para mis pruebas.
Puedo ver los datos de la prueba en un formato similar a una cuadrícula encima de las pruebas y nuevamente al afirmar los datos en la base de datos.
Entonces configuré mi propia solución.
### Entonces, ¿cómo funciona y qué aspecto tiene? ¡Muéstrame un ejemplo!###
La idea es utilizar una cadena de texto de "valores separados por tuberías", llamémosla PSV (como en CSV, pero con tuberías) para configurar dispositivos de prueba como este:
(El formato del PSV es muy similar al formato utilizado por el excelente marco Behat BDD (https://github.com/Behat/Behat))
$dbTablesToSetup="[table_name]id |fecha |nombre |valor |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//usa esto si no quieres utilice los rasgos proporcionados o los casos de prueba abstractos$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//use esto si extendió su caso de prueba desde TestDbAclePhpUnitAbstractTestCase o está usando el TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
El marco en sí sabe qué columnas no son compatibles con NULL en la tabla e inserta valores predeterminados... De hecho, supongamos que la tabla nombre_tabla tiene 30 columnas, todas las cuales no son nulas...
Además, puede haber varias restricciones de clave externa en segundo plano. Test-Db-Acle deshabilita temporalmente las comprobaciones de claves externas, por lo que no tenemos que preocuparnos por esto ni por el orden en que insertamos los datos de prueba.
###¿Qué pasa con una prueba real...?### Primero, si usas PHP5.4, puedes usar la versión de rasgos:
la clase EjemploTest extiende PHPUnit_Framework_TestCase implementa TestDbAclePhpUnitAbstractTestCaseInterface {use TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * Este método debe implementarse, debe devolver el objeto PDO que se utilizará en los dispositivos de la base de datos * * @return Pdo */public function providePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * Una prueba de ejemplo */función pública test_AddressService() {$this->setupTables(" [dirección] id_dirección |empresa 1 |yo 3 |usted [usuario] id_usuario |nombre 10 |Juan 20 |María "); $this->setAutoIncrement('dirección', 100); $this->addressService->addEntry("ellos");$this->assertTableStateContains(" [dirección] id_dirección |empresa 1 |yo 3 |tú 100 |ellos [usuario] id_usuario |nombre 10 |Juan 20 |María ", array(), "Las cosas funcionan"); } }
Si no usa rasgos, puede usar AbstractTestCase
; sin embargo, no podrá usar sus propias clases de prueba base en ese caso.
la clase EjemploTest extiende TestDbAclePhpUnitAbstractTestCase { protegido $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * Este método debe implementarse, debe devolver el objeto PDO que se utilizará en los dispositivos de la base de datos * * @return Pdo */public function providePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }función test_AddressService() {$this->setupTables(" [dirección] id_dirección |empresa 1 |yo 3 |usted [usuario] id_usuario |nombre 10 |Juan 20 |María "); $this->setAutoIncrement('dirección', 100); $this->addressService->addEntry("ellos");$this->assertTableStateContains(" [dirección] id_dirección |empresa 1 |yo 3 |tú 100 |ellos [usuario] id_usuario |nombre 10 |Juan 20 |María ", array(), "Las cosas funcionan"); } }
Ok, obviamente ServicesAddressService no existe aquí (oye, es prueba primero, ¿verdad?) y el ejemplo es bastante simple.
En la vida real, pondría el método getPdo en una clase de prueba base común para el proyecto y podría obtenerse de manera bastante diferente a aquí. Pero bueno, este es un ejemplo.
Como puede ver, setupTables puede configurar varias tablas a la vez y afirmarTableStateContains también puede verificar el estado de varias tablas al mismo tiempo.
De manera similar a cómo setupTables puede configurar tablas que tienen muchas más columnas de las especificadas, afirmarTableStateContains solo compara y afirma los valores de las columnas especificadas también.
La forma más sencilla de instalar Test-Db-Acle es mediante Composer (Lea más aquí: http://packagist.org), y recomiendo encarecidamente utilizar este método, aunque también puede descomprimir el paquete en una carpeta y habilitar la carga automática para manualmente en cualquier forma que desee (usa la convención de nomenclatura psr-0)
Para usarlo con Composer, agregue esto a su archivo Composer.json:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
También puede utilizar https://packagist.org/packages/test-db-acle/test-db-acle si lo prefiere.
¡Las contribuciones (y críticas) son más que bienvenidas...!
###Cómo ejecutar las pruebas Test-Db-Acle### Para ejecutar las pruebas, necesitará crear una base de datos vacía en un servidor MySql de su elección, copiar tests/Functional/config.php.dist a tests/ Functional/config.php y complételo con los detalles de su base de datos. Entonces, con suerte, todas las pruebas deberían ejecutarse. (En realidad, la base de datos solo es necesaria para la prueba de humo funcional)
Sintaxis PSV
Caso de prueba abstracto
Ampliando y personalizando TestDbAcle
Registro de cambios