readthedocs - phpunit tutorial español
PHPUnit: ¿Cómo creo una función para ser llamada una vez para todas mis pruebas? (3)
Tengo una clase de caso de prueba PHPUnit (que consta de algunas funciones de prueba). Me gustaría escribir una función oneTimeSetUp()
para que sea llamada una vez para todas mis pruebas en la clase (a diferencia de la función setUp()
estándar que se llama una vez para cada prueba en la clase). En otras palabras, estoy buscando una @BeforeClass
equivalente a la anotación JUnit @BeforeClass
.
La misma pregunta con una función oneTimeTearDown()
.
¿Es posible hacerlo en PHPUnit?
Eche un vistazo a setUpBeforeClass()
de la sección 6 de la documentación de PHPUnit.
Por una vez, tearDown debe usar tearDownAfterClass();
.
Ambos métodos deben definirse en su clase como métodos estáticos.
La opción bootstrap
se puede utilizar en estos casos.
Puedes llamarlo desde la línea de comandos.
phpunit --bootstrap myBootstrap.php
O ponlo en el archivo XML, como este:
<phpunit bootstrap="myBootstrap.php">
...
</phpunit>
Llegué a esta página con la misma pregunta, sin embargo, la respuesta aceptada se ejecuta en todas las clases, y para mí no fue la respuesta correcta.
Si eres como yo, tu primera "prueba de integración" es limpiar la base de datos y ejecutar migraciones. Esto te lleva a una base de datos de base de datos para todas las pruebas. Estoy cambiando constantemente los archivos de migración en este punto, por lo que la configuración de la línea de base es realmente parte de todas las pruebas.
La migración lleva un tiempo, así que no quiero que se ejecute en todas las pruebas.
Luego tuve que construir la base de datos probando cada pieza. Necesito escribir una prueba de pedido, pero primero necesito crear algunos productos y probar eso, luego necesito probar una función de importación.
Entonces, lo que hice es SUPER fácil, pero no está muy bien explicado en Internet. He creado una prueba simple para configurar la base de datos. Luego, en su archivo phpspec.xml agregue un testuite ...
<testsuite name="Products">
<file>tests/in/SystemSetupTest.php</file>
<file>tests/in/ProductTest.php</file>
<file>tests/in/ProductImportTest.php</file>
</testsuite>
Y en el SystemSetupTest.php ....
class SystemSetupTest extends ApiTester
{
/** @test */
function system_init()
{
fwrite(STDOUT, __METHOD__ . "/n");
self::createEM(); //this has all the code to init the system...
}
}
Luego ejecútalo como:
phpunit --testsuite Productos
Al final, es una tonelada más fácil. Me permitirá construir mi sistema correctamente.
Además, estoy usando laravel 5. Cuando uso setUpBeforeClass()
termino con problemas de bootstrap, que estoy seguro de que puedo solucionar, pero el método que uso anteriormente funciona perfectamente.