Diucapkan kegagalan tes... Saya rasa Anda dapat mengabaikan bagian -db- jika Anda menginginkan kata yang sedikit lebih pendek dan merasa ingin.
Test-DB-Acle adalah perpustakaan PHP untuk memfasilitasi penulisan tes yang mudah dan ringkas untuk lapisan database.
Saya yakin bahwa tes menulis harus semudah mungkin bagi pengembang, dan tes tersebut juga harus semudah mungkin dibaca agar dapat dipahami oleh pengembang lain.
Artinya, data pengujian apa pun dalam pengujian harus relevan dengan skenario pengujian saja. Namun sebagian besar tabel database memiliki kolom bukan nol yang mengharuskan Anda memasukkan data dummy yang hanya menimbulkan gangguan kognitif pada pengujian.
Test-Db-Acle bertujuan untuk menghilangkan beban ini dari pengembang. Kerangka pengujian tidak membuat asumsi apa pun tentang cara kerja kelas lapisan database Anda, jika mereka menggunakan ORM seperti Doktrin, prosedur tersimpan, atau SQL langsung, prinsipnya selalu sama, pada titik tertentu kode berinteraksi dengan data di tabel DB , dan kita perlu mengujinya.
Instalasi melalui komposer
menonaktifkan pemeriksaan kunci asing di database
secara otomatis menangani kolom bukan nol
secara otomatis memangkas kolom tanggal/waktu di mysql ketika menyatakan nilai ada dalam tabel db - berguna untuk menyisipkan stempel waktu (di Sqlite kolom ini harus ditentukan)
hampir semua komponen dapat ditukar dan diganti dengan varietas khusus
mendukung Mysql dan Sqlite saat ini
Apakah kerangka kerja agnostik, tidak ada asumsi jika ORM digunakan misalnya dan harus mudah beradaptasi untuk kerangka pengujian unit lainnya.
Basis data yang didukung saat ini adalah MySql (dan ekstensi MariaDB) dan Sqlite.
Arsitekturnya harus memungkinkan penambahan database lebih lanjut.
Pustaka ini dapat langsung digunakan dengan PHPUnit. Seharusnya cukup mudah untuk menggunakannya dengan kerangka pengujian lain dengan menggunakan ciri-ciri yang disediakan dan mendelegasikan metode 'assertEquals' ke metode yang setara (misalnya, saya ingat itu adalah 'assertEqual' di SimpleTest)
Saya telah menyediakan TestDbAclePhpUnitAbstractTestCase serta TestDbAclePhpUnitTraitsDatabaseHelperTrait sederhana jika Anda menggunakan PHP 5.4 dan tidak keberatan menggunakan ciri-ciri.
Oke, agar benar-benar adil, pengujian lapisan basis data itu mahal dan memperlambat pengujian, dan sedapat mungkin ketergantungan apa pun pada basis data harus ditiru. Namun terkadang kita hanya perlu melakukan hal ini, semoga dalam aplikasi yang terstruktur dengan baik hal ini dapat diminimalkan.
Ada banyak alat dan pendekatan yang tersedia (misalnya DBUnit atau menggunakan metode pabrik dalam pengujian unit Anda) untuk membantu pengujian basis data, masing-masing memiliki kelebihannya sendiri, pendekatan ini berhasil untuk saya karena:
Saya tidak perlu khawatir tentang kolom nol atau batasan kunci asing
Saya menyediakan kumpulan data minimal untuk pengujian saya
Saya dapat melihat data pengujian dalam format seperti kisi di atas pengujian dan lagi saat menegaskan data di db.
Jadi saya menyiapkan solusi saya sendiri.
###Jadi bagaimana cara kerjanya dan seperti apa tampilannya? Tunjukkan pada saya sebuah contoh!###
Idenya adalah menggunakan string teks "nilai yang dipisahkan pipa", sebut saja PSV - seperti dalam CSV, tetapi dengan pipa - untuk menyiapkan perlengkapan pengujian seperti ini:
(Format PSV sangat mirip dengan format yang digunakan oleh kerangka kerja Behat BDD yang luar biasa (https://github.com/Behat/Behat))
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//gunakan ini jika Anda tidak ingin gunakan ciri-ciri yang disediakan atau kasus uji abstrak$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//gunakan ini jika Anda memperluas kasus pengujian dari TestDbAclePhpUnitAbstractTestCase atau menggunakan TestDbAclePhpUnitTraitsDatabaseHelperTrait:$ini->setupTables($dbTablesToSetup);
Kerangka kerja itu sendiri mengetahui kolom mana yang tidak dapat NULL dalam tabel dan menyisipkan nilai default... Faktanya, mari kita asumsikan bahwa tabel nama_tabel memiliki 30 kolom yang semuanya bukan nol....
Selain itu, mungkin ada berbagai kendala kunci asing yang terjadi di latar belakang. Test-Db-Acle untuk sementara menonaktifkan pemeriksaan kunci asing, jadi kita tidak perlu khawatir tentang hal ini, atau dalam urutan apa kita memasukkan data pengujian.
###Bagaimana dengan pengujian sebenarnya.....?### Pertama, jika Anda menggunakan PHP5.4, Anda dapat menggunakan versi ciri-cirinya:
kelas ContohTest memperluas PHPUnit_Framework_TestCase mengimplementasikan TestDbAclePhpUnitAbstractTestCaseInterface {gunakan TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * Metode ini perlu diimplementasikan, ia harus mengembalikan objek PDO yang akan digunakan dalam perlengkapan database * * @return Pdo */public function providePdo() {kembalikan Pdo baru("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * Contoh pengujian */fungsi publik test_AddressService() {$this->setupTables(" [alamat] address_id |perusahaan 1 |saya 3 |Anda [pengguna] user_id |nama 10 |Yohanes 20 |Mary "); $ini->setAutoIncrement('alamat', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [alamat] alamat_id |perusahaan 1 |saya 3 |Anda 100 |mereka [pengguna] user_id |nama 10 |John 20 |Mary ", array(), "Barang berfungsi"); } }
Jika Anda tidak menggunakan sifat, Anda dapat menggunakan AbstractTestCase
, namun Anda tidak akan dapat menggunakan kelas pengujian dasar Anda sendiri dalam kasus tersebut.
kelas ContohTest memperluas TestDbAclePhpUnitAbstractTestCase { dilindungi $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * Metode ini perlu diimplementasikan, metode ini harus mengembalikan objek PDO yang akan digunakan dalam perlengkapan database * * @return Pdo */public function providePdo() {kembalikan Pdo baru("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }fungsi tes_AddressService() {$this->setupTables(" [alamat] alamat_id |perusahaan 1 |saya 3 |Anda [pengguna] user_id |nama 10 |Yohanes 20 |Mary "); $ini->setAutoIncrement('alamat', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [alamat] alamat_id |perusahaan 1 |saya 3 |Anda 100 |mereka [pengguna] user_id |nama 10 |John 20 |Mary ", array(), "Barang berfungsi"); } }
Ok, yang jelas ServicesAddressService tidak ada di sini (hei, ini tes dulu ya?) dan contohnya cukup sederhana.
Dalam kehidupan nyata, saya akan memasukkan metode getPdo ke dalam kelas pengujian dasar umum untuk proyek tersebut dan mungkin diperoleh dengan cara yang sangat berbeda dari di sini. Tapi, ini contohnya.
Seperti yang Anda lihat, setupTables bisa menyiapkan beberapa tabel sekaligus dan menegaskanTableStateContains juga bisa memverifikasi status berbagai tabel pada saat yang bersamaan.
Mirip dengan bagaimana setupTables dapat mengatur tabel yang memiliki lebih banyak kolom daripada yang ditentukan, assertTableStateContains hanya membandingkan dan menegaskan nilai kolom yang ditentukan juga.
Cara termudah untuk menginstal Test-Db-Acle adalah dengan menggunakan composer ( Baca lebih lanjut di sini: http://packagist.org ), dan saya sangat menyarankan menggunakan pendekatan ini, meskipun Anda juga dapat mengekstrak paket ke dalam folder dan mengaktifkan autoload untuk secara manual dalam bentuk apa pun yang Anda inginkan (menggunakan konvensi penamaan psr-0)
Untuk digunakan dengan composer, tambahkan ini ke file composer.json Anda:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
Anda juga dapat menggunakan https://packagist.org/packages/test-db-acle/test-db-acle jika Anda mau.
Kontribusi (dan kritik) sangat kami harapkan...!
###Cara menjalankan tes Test-Db-Acle### Untuk menjalankan tes, Anda perlu membuat database kosong pada server MySql pilihan Anda, salin tes/Functional/config.php.dist ke tes/ Functional/config.php dan isi dengan detail database Anda. Kemudian, semoga semua tes dapat berjalan. (Database sebenarnya hanya diperlukan untuk uji asap fungsional)
Sintaks PSV
AbstrakTestCase
Memperluas dan menyesuaikan TestDbAcle
log perubahan