Cuando escribo mis módulos, intento proporcionarles pruebas unitarias para las partes más críticas de la aplicación. Sin embargo, en este momento (Magento 2.1.3) hay varias formas de escribir pruebas unitarias:
Diferentes formas de prueba
- Integrarla con
bin/magento dev:tests:run unit
y ejecutarlo en la parte superior de la configuración por defecto que vienen con PHPUnit Magento. - Escríbalos por separado, ejecútelos
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
y búrlate de todo lo que es Magento. - Escríbalos por separado, simule todo y use una versión global del sistema de PHPUnit.
- Escríbalos por separado, ejecútelos
vendor/bin/phpunit
, pero aún utilícelos\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 y PHPUnit
Además de eso, Magento 2 viene incluido con PHPUnit 4.1.0, que no es compatible con PHP7. Los nativos que insinúan el tipo (como string
e `int) y declaran los tipos de retorno en sus firmas arrojarán errores. Por ejemplo, una interfaz / clase con una firma de método como esta:
public function foo(string $bar) : bool;
... PHPUnit 4.1.0 no puede burlarse de él. :-(
Mi situacion actual
Debido a esto, ahora estoy escribiendo principalmente mis pruebas unitarias de la tercera manera (llamando a una versión de PHPUnit global del sistema).
En mi configuración, tengo PHPUnit 5.6 instalado globalmente, por lo que puedo resolver escribir el código PHP7 adecuado, pero tengo que hacer algunos ajustes. Por ejemplo:
phpunit.xml
tiene que verse así para poder usar el autocargador de compositores:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... y en todos mis setUp()
métodos, tengo la siguiente verificación para poder escribir mis pruebas con compatibilidad hacia adelante:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
De esta manera, cuando mis pruebas son ejecutadas por PHPUnit incorporado de Magentos, no arroja un error.
Mi pregunta
Así que aquí está mi pregunta: ¿es esta una forma 'saludable' de escribir pruebas unitarias? Porque no me parece correcto que Magento venga incluido con un montón de herramientas para ayudar con las pruebas y no puedo usarlas porque estoy usando PHP7. Sé que hay entradas en GitHub que abordan este problema, pero me pregunto cómo la comunidad está escribiendo actualmente sus pruebas.
¿Hay alguna manera de escribir pruebas unitarias en Magento 2 para que no tenga que 'degradar' mi código y aún pueda usar los ayudantes integrados de Magentos para burlarse de todo lo que toca el administrador de objetos? ¿O es incluso una mala práctica usar el administrador de objetos incluso en las pruebas unitarias?
Me faltan muchas guías / ejemplos sobre cuál es la forma correcta de cómo probar unitariamente sus propios módulos personalizados.