Banyak aplikasi database modern menggunakan proyek ORM Doctrine .
Ini dianggap praktik yang baik untuk membawa pekerjaan dengan database ke layanan. Dan layanan perlu diuji.
Untuk menguji layanan, Anda bisa menyambungkan database pengujian, atau Anda bisa mengunci Entity Manager dan repositori. Dengan opsi pertama, semuanya jelas, tetapi tidak selalu masuk akal untuk menggunakan database untuk menguji layanan. Kami akan membicarakan ini.
Misalnya, ambil layanan berikut:
src / Layanan / Pengguna / UserService.php Kita perlu menguji satu-satunya metode create()
.
Pilih kasus berikut:
- Pembuatan pengguna yang berhasil tanpa pengarah
- Pembuatan pengguna yang berhasil dengan pengarah
- Kesalahan "Login sudah diambil"
- Kesalahan "Perujuk tidak ditemukan"
Untuk menguji layanan, kita memerlukan objek yang mengimplementasikan antarmuka Doctrine\ORM\EntityManagerInterface
Opsi 1. Kami menggunakan database nyata
Kami akan menulis kelas dasar untuk tes, yang nantinya akan kami warisi.
Sekarang masuk akal untuk tes untuk mengatur variabel lingkungan. Tambahkan mereka ke file phpunit.xml
di bagian php
. Saya akan menggunakan sqlite db
phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" verbose="true" colors="true"> <php> <env name="DB_DRIVER" value="pdo_sqlite" /> <env name="DB_PATH" value="var/db-test.sqlite" /> <env name="DB_USER" value="" /> <env name="DB_PASSWORD" value="" /> <env name="DB_NAME" value="" /> </php> <testsuites> <testsuite name="default"> <directory>tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit>
Sekarang kita akan menulis tes layanan
tes / Unit / Layanan / UserServiceTest.php Pastikan layanan kami berfungsi dengan baik
./vendor/bin/phpunit
Opsi 2. Menggunakan MockBuilder
Membangun database setiap saat itu sulit. Terutama phpunit memberi kita kesempatan untuk mengumpulkan moki on the fly menggunakan mockBuilder. Contohnya dapat ditemukan di dokumentasi Symfony.
Contoh dokumentasi Symfony Opsi ini berfungsi, tetapi ada masalah. Anda perlu mengetahui dengan jelas dalam urutan apa kode mengakses metode EntityManager.
Misalnya, jika pengembang bertukar cek untuk keberadaan pengarah dan cek untuk login yang sibuk, tes akan gagal. Tetapi aplikasinya tidak.
Saya mengusulkan opsi EntingManager pintar-moking, yang menyimpan semua datanya dalam memori dan tidak menggunakan database nyata.
Opsi 3. Kami menggunakan MockBuilder dengan penyimpanan data dalam memori.
Untuk fleksibilitas, kami akan menambahkan variabel lingkungan sehingga Anda dapat menggunakan database nyata. Mari kita phpunit.xml
musim dingin di phpunit.xml
perubahan phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <php> <env name="EMULATE_BD" value="1" /> </php>
Sekarang modifikasi kelas dasar
tes yang dimodifikasi / TestCase.php Sekarang kita dapat menjalankan tes lagi dan memastikan bahwa layanan kami berfungsi tanpa terhubung ke database.
./vendor/bin/phpunit
Kode Sumber Tersedia di Github