Quando scrivo i miei moduli, sto cercando di fornire loro test unitari per le parti più critiche dell'applicazione. Tuttavia, al momento (Magento 2.1.3) esistono diversi modi su come scrivere unit test:
Diversi modi di test
- Integralo con
bin/magento dev:tests:run unit
ed eseguilo sopra le impostazioni predefinite di phpunit in bundle con Magento. - Scrivili separatamente,
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
eseguili e prendi in giro tutto ciò che è Magento. - Scrivili separatamente, prendi in giro tutto e usa una versione globale di PHPUnit.
- Scrivili separatamente, eseguili con
vendor/bin/phpunit
, ma comunque fai uso di\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 e PHPUnit
Oltre a ciò, Magento 2 viene fornito in bundle con PHPUnit 4.1.0, che non è compatibile con PHP7. I nativi che suggeriscono il tipo (like string
e `int) e che dichiarano i tipi restituiti nelle firme genereranno errori. Ad esempio, un'interfaccia / classe con una firma del metodo come questa:
public function foo(string $bar) : bool;
... non potrà essere deriso da PHPUnit 4.1.0. :-(
La mia situazione attuale
È per questo motivo che ora sto scrivendo principalmente i miei test unitari nel terzo modo (chiamando una versione PHPUnit globale del sistema).
Nella mia configurazione, ho installato PHPUnit 5.6 a livello globale, quindi posso risolvere scrivere il codice PHP7 corretto, ma devo fare alcune modifiche. Per esempio:
phpunit.xml
deve apparire così in modo da poter usare il caricatore automatico del compositore:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... e in tutti i miei setUp()
metodi, ho il seguente controllo in modo da poter scrivere i miei test con compatibilità diretta:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
In questo modo, quando i miei test vengono eseguiti dal PHPUnit integrato di Magentos, non genera un errore.
La mia domanda
Quindi, ecco la mia domanda: è un modo "salutare" di scrivere test unitari? Perché non mi sembra giusto che Magento sia fornito con un sacco di strumenti per aiutare con i test e non posso usarli perché sto usando PHP7. So che ci sono biglietti su GitHub che risolvono questo problema, ma mi chiedo come la community stia attualmente scrivendo i suoi test.
Esiste un modo per scrivere unit test in Magento 2, quindi non devo "downgrade" del mio codice e posso ancora usare gli helper integrati di Magentos per deridere tutto ciò che tocca il gestore degli oggetti? O è addirittura una cattiva pratica usare il gestore oggetti anche nei test delle unità?
Mi mancano molte indicazioni / esempi su quale sia il modo corretto su come testare i propri moduli personalizzati.