PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mode postgresql H2 sepertinya tidak berfungsi untuk saya

Jadi saya berpikir untuk menggunakan mode kompatibilitas PosgreSQL H2 dengan menganggap semua kueri postgres akan berfungsi pada H2, mohon perbaiki saya jika saya salah

Saya khawatir itu tidak benar.

H2 mencoba meniru sintaks PostgreSQL dan mendukung beberapa fitur dan ekstensi. Ini tidak akan pernah sepenuhnya cocok dengan perilaku PostgreSQL, dan tidak mendukung semua fitur.

Satu-satunya pilihan yang Anda miliki adalah:

  • Gunakan PostgreSQL dalam pengujian; atau
  • Berhenti menggunakan fitur yang tidak didukung oleh H2

Saya sarankan menggunakan Pg untuk pengujian. Menulis harness pengujian relatif mudah bahwa initdb adalah instance postgres dan meluncurkannya untuk pengujian, lalu menghapusnya setelahnya.

Perbarui berdasarkan komentar:

Tidak ada garis keras antara tes "unit" dan "integrasi". Dalam hal ini, H2 juga merupakan komponen eksternal. Tes unit murni akan memiliki penjawab dummy untuk pertanyaan sebagai bagian dari rangkaian uji. Pengujian terhadap H2 sama seperti pengujian "integrasi" dengan pengujian terhadap PostgreSQL. Fakta bahwa itu dalam proses dan dalam memori adalah kenyamanan, tetapi tidak signifikan secara fungsional.

Jika Anda ingin menguji unit Anda harus menulis target database lain untuk aplikasi Anda agar sejalan dengan target "PostgreSQL", "SybaseIQ", dll. Sebut saja, katakan, "MockDatabase". Ini seharusnya hanya mengembalikan hasil yang diharapkan dari kueri. Itu tidak benar-benar menjalankan kueri, itu hanya ada untuk menguji perilaku kode lainnya.

Secara pribadi, saya pikir itu membuang-buang waktu, tetapi itulah yang akan dilakukan oleh purist pengujian unit untuk menghindari memasukkan dependensi eksternal ke dalam test harness.

Jika Anda bersikeras untuk memiliki unit (sebagai lawan dari integrasi) tes untuk komponen DB Anda tetapi tidak dapat/tidak akan menulis antarmuka tiruan, Anda harus menemukan cara untuk menggunakan yang sudah ada. H2 akan menjadi kandidat yang masuk akal untuk ini - tetapi Anda harus menulis backend baru dengan serangkaian kueri baru yang berfungsi untuk H2, Anda tidak bisa hanya menggunakan kembali backend PostgreSQL Anda. Seperti yang telah kami jelaskan, H2 tidak mendukung semua fitur yang Anda perlukan untuk digunakan dengan PostgreSQL sehingga Anda harus menemukan cara berbeda untuk melakukan hal yang sama dengan H2. Salah satu opsi adalah membuat database H2 sederhana dengan hasil "yang diharapkan" dan kueri sederhana yang mengembalikan hasil tersebut, sama sekali mengabaikan skema aplikasi yang sebenarnya. Satu-satunya kelemahan nyata di sini adalah pemeliharaannya bisa sangat merepotkan ... tapi itulah pengujian unit.

Secara pribadi, saya baru saja menguji dengan PostgreSQL. Kecuali saya menguji kelas atau modul individual yang berdiri sendiri sebagai unit yang didefinisikan dengan baik dengan antarmuka sempit, saya tidak peduli apakah seseorang menyebutnya sebagai tes "unit" atau "integrasi". Saya akan menguji unit, katakanlah, kelas validasi data. Untuk pengujian unit murni kode antarmuka basis data sangat tidak masuk akal dan saya hanya akan melakukan pengujian integrasi.

Meskipun memiliki database dalam-memori yang dalam proses nyaman untuk itu, itu tidak diperlukan. Anda dapat menulis test harness Anda sehingga kode pengaturan initdb adalah PostgreSQL baru dan meluncurkannya; kemudian kode teardown membunuh postmaster dan menghapus datadir. Saya menulis lebih banyak tentang ini di jawaban ini.

Lihat juga:

  • Menjalankan PostgreSQL hanya di memori

Adapun:

Jika semua kueri dengan kumpulan data akhir yang diharapkan berfungsi dengan baik di Postgress, saya dapat menganggapnya akan berfungsi dengan baik di semua dbs lainnya

Jika saya mengerti apa yang Anda katakan dengan benar maka ya, itulah masalahnya - jika kode Anda yang lain bekerja dengan kumpulan data dari PostgreSQL, umumnya harus bekerja sama dengan kumpulan data yang berisi data yang sama dari database lain. Selama menggunakan tipe data sederhana bukan fitur khusus database, tentu saja.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Cos() Bekerja di PostgreSQL

  2. Postgres sql memasukkan kesalahan sintaks kueri dari phpPgAdmin

  3. EXECUTE...USING pernyataan di PL/pgSQL tidak bekerja dengan tipe record?

  4. Bagaimana cara mengelompokkan cap waktu ke dalam pulau (berdasarkan celah sewenang-wenang)?

  5. Cara Mendapatkan Tanggal dan Waktu Saat Ini (Tanpa Zona Waktu) di PostgreSQL