Quando estou escrevendo meus módulos, estou tentando fornecer a eles testes de unidade para as partes mais críticas do aplicativo. No entanto, existem no momento (Magento 2.1.3) várias maneiras de como escrever testes de unidade:
Diferentes maneiras de testar
- Integre-o
bin/magento dev:tests:run unit
e execute-o sobre as configurações padrão do phpunit incluídas no Magento. - Escreva-os separadamente, execute-os
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
e zombe de tudo o que é Magento. - Escreva-os separadamente, zombe de tudo e use uma versão global do sistema do PHPUnit.
- Escreva-os separadamente, execute-os com
vendor/bin/phpunit
, mas ainda faça uso\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 e PHPUnit
Além disso, o Magento 2 vem com o PHPUnit 4.1.0, que não é compatível com o PHP7. Os nativos de dicas de tipo (como string
e `int) e a declaração de tipos de retorno em suas assinaturas gerarão erros. Por exemplo, uma interface / classe com uma assinatura de método como esta:
public function foo(string $bar) : bool;
... não poderá ser ridicularizado pelo PHPUnit 4.1.0. :-(
Minha situação atual
É devido a isso que agora estou escrevendo principalmente meus testes de unidade da terceira maneira (chamando uma versão PHPUnit global do sistema).
Na minha configuração, tenho o PHPUnit 5.6 instalado globalmente, para que eu possa resolver escrever o código PHP7 adequado, mas preciso fazer alguns ajustes. Por exemplo:
phpunit.xml
tem que se parecer com isso para que eu possa usar o autoloader do compositor:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... e em todos os meus setUp()
métodos, tenho a seguinte verificação para que eu possa escrever meus testes com compatibilidade direta:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
Dessa forma, quando meus testes são executados pelo PHPUnit interno do Magentos, ele não gera um erro.
Minha pergunta
Então, eis a minha pergunta: essa é uma maneira 'saudável' de escrever testes de unidade? Porque não me parece correto que o Magento venha com um monte de ferramentas para ajudar nos testes e não posso usá-las porque estou usando o PHP7. Sei que existem tickets no GitHub que abordam esse problema, mas estou me perguntando como a comunidade está escrevendo seus testes.
Existe uma maneira de escrever testes de unidade no Magento 2 para que eu não precise 'rebaixar' meu código e ainda possa usar os auxiliares internos do Magentos para zombar de tudo o que o gerenciador de objetos toca? Ou é uma prática ruim usar o gerenciador de objetos mesmo em seus testes de unidade?
Estou perdendo muitas orientações / exemplos de como é a maneira correta de testar os seus próprios módulos personalizados.