Jawaban singkatnya adalah Baca entri Fine Manual tentang pengujian database di manual PHPUnit .
Dan sekarang jawaban panjangnya ...
Hal pertama yang harus diingat tentang pengujian unit adalah bahwa hal itu perlu dilakukan dalam isolasi dari semua komponen lainnya. Seringkali, tujuan ini disederhanakan menggunakan teknik inversi kontrol (IoC) seperti injeksi ketergantungan . Ketika kelas Anda secara eksplisit meminta dependensi mereka dalam metode konstruktor, ini adalah operasi sederhana untuk mengolok-olok dependensi tersebut sehingga Anda dapat menguji kode yang tersisa secara terpisah.
Kode pengujian yang berinteraksi dengan model sedikit berbeda. Biasanya tidak praktis atau disarankan untuk menyuntikkan model Anda ke dalam kelas di mana Anda perlu mengaksesnya. Model Anda umumnya adalah struktur data "bodoh" yang memperlihatkan kemampuan terbatas atau tidak ada sama sekali. Akibatnya, secara umum dapat diterima (dalam hal testabilitas) untuk membuat instance model Anda dengan cepat di dalam kelas Anda yang disuntikkan. Sayangnya, ini membuat pengujian kode basis data menjadi sulit karena, seperti yang dicatat oleh dokumentasi PHPUnit:
Jadi bagaimana Anda mengisolasi dan menguji kode yang berinteraksi dengan database jika model tidak disuntikkan secara langsung? Cara termudah untuk melakukannya adalah dengan memanfaatkan perlengkapan uji .
Karena Anda pasti sudah menggunakan PDO
atau perpustakaan ORM yang dibangun di atas PDO
(kan?), Menyiapkan perlengkapan semudah menyemai database SQLite dasar atau file XML dengan data untuk mengakomodasi kasus pengujian Anda dan menggunakan koneksi database khusus itu saat Anda menguji kode yang berinteraksi dengan database. Anda dapat menentukan koneksi ini di file bootstrap PHPUnit Anda, tetapi mungkin secara semantik lebih tepat untuk menyiapkan TestCase Database PHPUnit
.
Langkah-langkah praktik terbaik yang diterima secara umum untuk menguji kode DB (ini juga digaungkan dalam dokumentasi PHPUnit tentang pengujian DB):
- Menyiapkan perlengkapan
- Sistem Latihan Sedang Diuji
- Verifikasi hasil
- Penghancuran
Jadi, untuk meringkas, yang perlu Anda lakukan adalah membuat perlengkapan database "dummy" dan membuat kode Anda berinteraksi dengan data yang diketahui itu alih-alih database aktual yang akan Anda gunakan dalam produksi. Metode ini memungkinkan Anda untuk berhasil mengisolasi kode yang sedang diuji karena berhubungan dengan data yang diketahui, dan ini berarti Anda dapat membuat pernyataan spesifik/dapat diuji tentang hasil operasi database Anda.
PERBARUI
Hanya karena ini adalah panduan yang sangat berguna untuk apa yang tidak yang harus dilakukan dalam kode Anda jika Anda ingin mempromosikan testabilitas, saya menambahkan tautan ke Cara Menulis 3v1L, Kode Tidak Dapat Diuji . Ini tidak terlibat dengan pengujian basis data secara khusus, tetapi tetap membantu. Selamat menguji!
PERBARUI 2
Saya ingin menanggapi komentar tentang menunda pengujian model karena basis kode yang ada tidak mengimplementasikan PDO
untuk akses basis data:
Model Anda tidak harus menggunakan PDO untuk mengimplementasikan ekstensi DbUnit PHPUnit.
Ini akan membuat hidup Anda sedikit lebih mudah jika Anda menggunakan PDO, tetapi Anda tidak diharuskan melakukannya. Katakanlah, misalnya, Anda telah membangun aplikasi Anda dengan pg_*
bawaan PHP Fungsi PostgreSQL. PHPUnit masih memungkinkan Anda untuk menentukan perlengkapan dan masih dapat membangunnya kembali untuk setiap pengujian -- Anda hanya perlu mengarahkan koneksi Anda saat melakukan pengujian ke sumber daya yang sama yang digunakan ekstensi DbUnit untuk perlengkapannya.