Ketika saya menulis modul saya, saya mencoba untuk memasok mereka dengan tes unit untuk bagian paling kritis dari aplikasi. Namun, ada saat ini (Magento 2.1.3) beberapa cara tentang cara menulis unit test:
Berbagai cara pengujian
- Integrasikan dengan
bin/magento dev:tests:run unit
dan jalankan di atas pengaturan phpunit default yang dibundel dengan Magento. - Tulis mereka secara terpisah, jalankan dengan
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
dan mengejek semua yang Magento. - Menulisnya secara terpisah, mengejek semuanya dan menggunakan versi global sistem-PHPUnit.
- Tuliskan secara terpisah, jalankan dengan
vendor/bin/phpunit
, tetapi tetap gunakan\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 dan PHPUnit
Selain itu, Magento 2 dibundel dengan PHPUnit 4.1.0, yang tidak kompatibel dengan PHP7. Mengetik petunjuk asli (seperti string
dan `int) dan mendeklarasikan tipe pengembalian di tanda tangan Anda akan menimbulkan kesalahan. Misalnya, antarmuka / kelas dengan tanda tangan metode seperti ini:
public function foo(string $bar) : bool;
... tidak akan bisa dipermainkan oleh PHPUnit 4.1.0. :-(
Situasi saya saat ini
Itu karena ini bahwa saya sekarang sebagian besar menulis tes unit saya dengan cara ketiga (dengan memanggil versi sistem-global PHPUnit).
Dalam pengaturan saya, saya telah menginstal PHPUnit 5.6 secara global, sehingga saya dapat menyelesaikan penulisan kode PHP7 yang tepat, tetapi saya harus melakukan beberapa penyesuaian. Sebagai contoh:
phpunit.xml
harus terlihat seperti ini sehingga saya dapat menggunakan komposer autoloader:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... dan dalam semua setUp()
-metode saya , saya memiliki pemeriksaan berikut sehingga saya dapat menulis tes saya dengan kompatibilitas ke depan:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
Dengan cara ini, ketika tes saya dijalankan oleh built-in PHPUnit Magentos, itu tidak menimbulkan kesalahan.
Pertanyaan saya
Jadi, inilah pertanyaan saya: apakah ini cara menulis unit test yang 'sehat'? Karena sepertinya tidak tepat bagi saya bahwa Magento dibundel dengan sejumlah alat untuk membantu pengujian dan saya tidak dapat menggunakannya karena saya menggunakan PHP7. Saya tahu ada tiket di GitHub yang membahas masalah ini, tapi saya bertanya-tanya bagaimana komunitas saat ini sedang menulis tesnya.
Apakah ada cara untuk menulis unit test di Magento 2 jadi saya tidak perlu 'menurunkan peringkat' kode saya dan masih dapat menggunakan pembantu bawaan Magentos untuk mengejek semua yang disentuh oleh manajer objek? Atau bahkan praktik yang buruk untuk menggunakan manajer objek bahkan dalam pengujian unit Anda?
Saya kehilangan banyak panduan / contoh tentang cara yang tepat tentang cara menguji modul kustom Anda sendiri.