Pertanyaan Bagaimana cara menguji pengujian isolasi Oracle PL / SQL?


Di proyek-proyek Java, tes JUnit melakukan setup, tes, teardown. Bahkan ketika mengejek db nyata menggunakan db dalam memori, Anda biasanya mengembalikan transaksi atau menjatuhkan db dari memori dan membuat ulang di antara setiap tes. Ini memberi Anda uji isolasi karena satu tes tidak meninggalkan artefak di lingkungan yang dapat mempengaruhi pengujian berikutnya. Setiap tes dimulai dalam keadaan yang diketahui dan tidak dapat dialihkan ke yang lain.

Sekarang saya punya Oracle db build yang menciptakan 1100 tabel dan 400K kode - banyak paket pl / sql. Saya ingin tidak hanya menguji db install (full - create from scratch, partial - upgrade dari db sebelumnya, dll) dan pastikan semua tabel, dan objek lainnya dalam keadaan yang saya harapkan setelah instalasi, tetapi JUGA menjalankan tes pada pl / sql (saya tidak yakin bagaimana saya akan melakukan yang pertama persis - saran?).

Saya ingin ini semua berjalan dari Jenkins untuk CI sehingga kesalahan pengembangan ditangkap melalui pengujian regresi.

Pertama, saya harus menggunakan versi enterprise daripada XE karena XE tidak mendukung java SPs dan ketergantungan pada Oracle Web Flow. Bahkan jika saya menghilangkan dependensi tersebut, build biasanya membutuhkan 1,5 jam hanya untuk memuat (full build).

Jadi bagaimana Anda mencapai isolasi tes di lingkungan ini? Gunakan transaksi untuk setiap tes dan gulung kembali? OK, bagaimana dengan prosedur pl / sql yang telah berkomitmen di dalamnya?

Saya berpikir tentang cadangan dan pemulihan untuk mereset db setelah setiap tes, atau membuat ulang seluruh db di antara setiap tes (terlalu drastis). Keduanya tidak praktis karena membutuhkan lebih dari satu jam untuk menginstalnya. Melakukannya untuk setiap tes itu berlebihan dan gila.

Apakah ada cara untuk menarik garis di pasir dalam skema db (s) dan kemudian gulung kembali ke titik waktu itu? Sorta seperti fitur 'undo' besar. Sesuatu selain expdp / impdp atau rman. Mungkin seluruh pendekatan tidak aktif. Saran? Bagaimana orang lain melakukan ini?

Untuk CI atau jendela upgrade produksi kecil, rangkaian uji coba harus dijalankan dengan waktu yang wajar (30 menit akan ideal).

Apakah ada produk yang dapat membantu mencapai kemampuan 'batalkan' ini?


20
2018-06-10 21:10


asal


Jawaban:


Kevin McCormack menerbitkan artikel di The Server Labs Blog tentang pengujian integrasi berkelanjutan untuk PL / SQL menggunakan Maven dan Hudson. Coba lihat. Bahan utama untuk komponen pengujian adalah Steven Feuerstein utPlsql framework, yang merupakan implementasi konsep JUnit di PL / SQL.

Kebutuhan untuk me-reset perlengkapan tes kami adalah salah satu masalah besar dengan pengujian PL / SQL. Satu hal yang membantu adalah mengamati praktik yang baik dan menghindari komit dalam prosedur tersimpan: kontrol transaksional harus dibatasi hanya pada bagian-bagian paling luar dari tumpukan panggilan. Untuk program-program yang hanya harus mengeluarkan commit (mungkin secara implisit karena mereka menjalankan DDL) selalu ada perlengkapan tes yang mengeluarkan pernyataan DELETE. Menangani integritas relasional membuat mereka cukup sulit untuk dikodekan.

Pendekatan alternatif adalah menggunakan Data Pump. Anda tampaknya membuang IMPDP tetapi Oracle juga menyediakan PL / SQL API untuk itu, DBMS_DATAPUMP. Saya sarankan di sini karena menyediakan kemampuan untuk membuang semua data yang ada sebelum menjalankan impor. Jadi kita bisa memiliki kumpulan data yang diekspor sebagai perlengkapan uji kami; untuk menjalankan SetUp adalah masalah menjalankan pekerjaan Pompa Data. Anda tidak perlu melakukan apa pun di TearDown, karena merapikan itu terjadi di awal Penyiapan.


11
2018-06-10 22:45



Di Oracle, Anda dapat menggunakan Teknologi Flashback untuk mengembalikan servis ke titik belakang tepat waktu.

http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmflash.htm


9
2018-06-10 21:21



1,5 jam sepertinya waktu yang sangat lama untuk 1100 tabel dan 400K kode. Saya jelas tidak tahu rincian envrionment Anda, tetapi berdasarkan pengalaman saya, saya yakin Anda dapat mengecilkannya menjadi 5 hingga 10 menit. Berikut adalah dua masalah skrip instalasi utama yang pernah saya lihat dengan Oracle:

1. Operasi dipecah menjadi bagian-bagian kecil

Semakin banyak langkah Anda memiliki lebih banyak overhead akan ada. Misalnya, Anda ingin mengonsolidasikan kode seperti ini sebanyak mungkin:

Menggantikan:

create table x(a number, b number, c number);
alter table x modify a not null;
alter table x modify b not null;
alter table x modify c not null;

Dengan:

create table x(a number not null, b number not null, c number not null);

Menggantikan:

insert into x values (1,2,3);
insert into x values (4,5,6);
insert into x values (7,8,9);

Dengan:

insert into x
select 1,2,3 from dual union all
select 4,5,6 from dual union all
select 7,8,9 from dual;

Ini terutama berlaku jika Anda menjalankan skrip dan database Anda di lokasi yang berbeda. Kelemahan jaringan kecil itu mulai menjadi masalah ketika Anda mengalikannya dengan 10.000. Setiap alat Oracle SQL yang saya tahu akan mengirim satu perintah dalam satu waktu.

2. Pengembang harus berbagi basis data

Ini lebih merupakan solusi proses jangka panjang daripada perbaikan teknis, tetapi Anda harus mulai kapan-kapan. Sebagian besar tempat yang menggunakan Oracle hanya menginstalnya di beberapa server. Maka itu menjadi sumber daya langka yang harus dikelola dengan hati-hati. Orang-orang memperebutkannya, peran tidak jelas, dan hal-hal tidak diperbaiki.

Jika itu lingkungan Anda, hentikan kegilaan dan instal Oracle di setiap laptop sekarang. Habiskan beberapa ratus dolar dan berikan setiap orang edisi pribadi (yang memiliki fitur yang sama dengan Edisi Enterprise). Berikan semua alat yang mereka butuhkan dan perbaikan terus-menerus pada akhirnya akan memperbaiki masalah Anda.


Juga, untuk skema "batalkan", Anda mungkin ingin melihat ke dalam tablespace yang dapat dipindahkan. Saya tidak pernah menggunakannya, tetapi seharusnya itu cara yang lebih cepat untuk menginstal sistem - cukup salin dan tempel file daripada mengimpor. Secara bersamaan, mungkin beberapa jenis virtualisasi dapat membantu - membuat snapshot dari OS dan basis data.


3
2018-06-14 07:26



Meskipun Oracle Flashback adalah fitur Edisi Enterprise, teknologi yang didasarkan pada ini tersedia di semua edisi, yaitu Oracle Log Miner:

http://docs.oracle.com/cd/B28359_01/server.111/b28319/logminer.htm#i1016535

Saya akan tertarik untuk mengetahui apakah ada yang menggunakan ini untuk menyediakan isolasi uji untuk tes fungsional yaitu dengan mengajukan kueri v $ LOGMNR_CONTENTS untuk mendapatkan daftar pernyataan UNDO dari titik waktu yang sesuai dengan awal pengujian.

Database harus dalam mode arsip dan dalam uji kasus jadilah metode yang diberi catatan

@Startup 

akan memanggil DBMS_LOGMNR.START_LOGMNR. Tes akan berjalan dan kemudian di dalam metode yang dianotasikan dengan

@Teardown

akan menjadi pertanyaan v $ LOGMNR_CONTENTS untuk menemukan daftar pernyataan UNDO. Ini kemudian akan dieksekusi melalui JDBC. Bahkan query dan eksekusi dari pernyataan UNDO dapat diekstrak ke dalam prosedur yang tersimpan PLSQL. Urutan bahwa pernyataan yang dieksekusi harus dipertimbangkan.

Saya pikir ini memiliki manfaat yang memungkinkan transaksi untuk melakukan yang mana banyak bug dapat merayap di dalamnya yaitu integritas referensial, pelanggaran kunci utama, dll.


0
2018-02-09 09:28