Bundel ini menyediakan fitur yang membantu Anda menjalankan testsuite Aplikasi berbasis kerangka Symfony secara lebih efisien dengan pengujian terisolasi.
Ini menyediakan StaticDriver
yang akan menggabungkan kelas Driver
Anda yang awalnya dikonfigurasi (seperti DBALDriverPDOMysqlDriver
) dan menjaga koneksi database secara statis dalam proses php saat ini.
Dengan bantuan kelas ekstensi PHPUnit, ia akan memulai transaksi sebelum setiap testcase dan mengembalikannya lagi setelah tes selesai untuk semua koneksi DBAL yang dikonfigurasi. Hal ini menghasilkan peningkatan kinerja karena tidak perlu membangun kembali skema, mengimpor dump SQL cadangan, atau memasukkan kembali perlengkapan sebelum setiap testcase. Selama Anda menghindari penerbitan kueri DDL yang mungkin mengakibatkan penerapan transaksi implisit (Seperti ALTER TABLE
, DROP TABLE
dll; lihat https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis) pengujian Anda akan diisolasi dan semua melihat keadaan basis data yang sama.
Ini juga mencakup Psr6StaticArrayCache
yang akan secara otomatis dikonfigurasi sebagai meta data & cache kueri untuk semua EntityManagers. Ini meningkatkan kecepatan dan penggunaan memori testsuites saya secara dramatis! Hal ini sangat bermanfaat jika Anda memiliki banyak pengujian yang mem-boot kernel (seperti pengujian Controller atau pengujian ContainerAware) dan menggunakan entitas Doctrine.
instal melalui komposer
komposer membutuhkan --dev dama/doctrine-test-bundle
Jika Anda tidak menggunakan Flex, aktifkan bundel dengan menambahkan kelas ke bundles.php
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => benar],//...];
Mulai dari versi 8 dan hanya ketika menggunakan DBAL <4 Anda perlu memastikan bahwa use_savepoints
diaktifkan pada konfigurasi DBAL doktrin Anda untuk semua koneksi yang relevan:
doktrin: dbal: koneksi: default: use_savepoints: true
Tambahkan Ekstensi ke konfigurasi XML PHPUnit Anda
PHPUnit 8 atau 9:
<phpunit> ... <ekstensi> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </ekstensi> </phpunit>
PHPUnit 10+:
<phpunit> ... <ekstensi> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </ekstensi> </phpunit>
Pastikan Anda juga memiliki phpunit/phpunit
yang tersedia sebagai ketergantungan dev
( versi 8, 9 dan 10 didukung dengan ekstensi bawaan ) untuk menjalankan pengujian Anda. Sebagai alternatif, bundel ini juga kompatibel dengan symfony/phpunit-bridge
dan skrip simple-phpunit
. (Catatan: Anda mungkin perlu memastikan phpunit-bridge memerlukan Versi PHPUnit 8+ yang benar menggunakan variabel lingkungan SYMFONY_PHPUNIT_VERSION
).
Itu saja! Mulai sekarang, perubahan apa pun yang Anda lakukan pada database dalam setiap testcase (baik itu WebTestCase
atau KernelTestCase
atau tes khusus apa pun) secara otomatis dibatalkan untuk Anda
Aktifkan ekstensi di konfigurasi Behat Anda (misalnya behat.yml
)
bawaan: # ... ekstensi: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
Itu saja! Mulai sekarang, perubahan apa pun yang Anda lakukan pada database dalam setiap skenario secara otomatis dibatalkan untuk Anda.
Harap dicatat bahwa ini hanya berfungsi jika pengujian dijalankan dalam proses yang sama seperti Behat. Ini berarti tidak dapat berfungsi ketika menggunakan misalnya Selenium untuk memanggil aplikasi Anda.
Bundel ini memperlihatkan konfigurasi yang terlihat seperti ini secara default:
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: benar
Menyetel enable_static_connection: true
berarti akan mengaktifkannya untuk semua koneksi dbal doktrin yang dikonfigurasi.
Anda hanya dapat mengaktifkannya secara selektif untuk beberapa koneksi jika diperlukan:
dama_doctrine_test:enable_static_connection:connection_a: benar
Secara default, setiap koneksi DBAL doktrin yang dikonfigurasi akan memiliki koneksi drivernya sendiri yang dikelola dalam proses php saat ini. Jika Anda perlu menyesuaikan perilaku ini, Anda dapat memilih "kunci koneksi" berbeda yang digunakan untuk memilih koneksi driver.
Contoh untuk 2 koneksi yang akan menggunakan kembali contoh koneksi driver yang sama:
doktrin:dbal:koneksi:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# menetapkan kunci yang sama akan menghasilkan koneksi driver internal yang sama digunakan kembali untuk kedua koneksi DBALdefault: custom_keyfoo: custom_key
Sejak v8.1.0 : Untuk koneksi dengan replika baca/tulis, bundel akan menggunakan koneksi driver dasar yang sama secara default untuk replika utama dan juga untuk replika. Ini mengatasi masalah ketika terjadi ketidakkonsistenan saat membaca/menulis pada koneksi yang berbeda. Ini juga dapat disesuaikan sebagai berikut:
doktrin:dbal:koneksi:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# menetapkan kunci yang berbeda akan menghasilkan koneksi driver internal terpisah yang digunakan untuk primer dan replikadefault:utama: custom_key_primaryreplicas:replica_one: custom_key_replica
Contoh penggunaan dapat dilihat dalam pengujian fungsional yang disertakan dalam bundel ini: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
bootstrap database awal dilakukan menggunakan file bootstrap PHPUnit: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
beberapa pengujian yang memastikan perubahan apa pun dari pengujian sebelumnya dibatalkan: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
Bundel ini juga digunakan pada testsuite Demo Symfony resmi: https://github.com/symfony/demo
Terkadang berguna untuk bisa men-debug konten database ketika pengujian gagal. Karena biasanya semua perubahan dibatalkan secara otomatis, Anda dapat melakukannya secara manual:
fungsi publik testMyTestCaseThatINeedToDebug() {// ... sesuatu yang mengubah DB stateDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// sekarang perubahan DB tetap ada dan Anda dapat men-debugnya}
Jika Anda menjalankan (mungkin tanpa menyadarinya) kueri selama pengujian Anda yang secara implisit melakukan transaksi terbuka apa pun (lihat https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html misalnya) Anda mungkin melihat kesalahan seperti ini:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
Saat ini tidak ada cara bagi bundel ini untuk bekerja dengan kueri tersebut karena kueri tersebut tidak dapat dibatalkan setelah kasus uji selesai.
Lihat juga #58