Merancang dan menerapkan strategi pengujian

Selesai

Proyek database SQL yang berhasil dibangun tidak berarti prosedur tersimpan di dalamnya mengembalikan hasil yang tepat. Prosedur dapat dikompilasi tanpa kesalahan dan masih menghitung total yang salah atau melewati pemeriksaan validasi. Pengujian menangkap masalah ini sebelum mencapai produksi.

Memahami tingkat pengujian database

Pengujian database bekerja secara berlapis, masing-masing menangkap kelas masalah yang berbeda:

  • Validasi build adalah langkah yang dotnet build sudah Anda miliki. Ini menangkap kesalahan sintaksis dan referensi objek yang rusak. Cepat, tetapi itu hanya membuktikan skemanya valid secara struktural.
  • Pengujian unit memverifikasi bahwa prosedur dan fungsi tersimpan individu menghasilkan hasil yang tepat untuk serangkaian input tertentu. Mereka menangkap kesalahan logika.
  • Pengujian integrasi menjalankan skenario end-to-end terhadap database yang disebarkan. Ini membuktikan bahwa objek-objek bekerja sama dengan benar, tetapi membutuhkan instance yang sedang berjalan dan membutuhkan waktu paling lama.

Setiap lapisan lebih lambat dan lebih mahal daripada yang sebelumnya, tetapi juga menangkap masalah yang tidak bisa dilakukan lapisan sebelumnya.

Membuat pengujian unit SQL Server

SQL Server Data Tools (SSDT) di Visual Studio menyertakan kerangka kerja bawaan untuk pengujian unit database. Setiap pengujian menjalankan T-SQL terhadap database langsung dan memvalidasi hasilnya menggunakan kondisi pengujian.

Struktur pengujian unit

Setiap pengujian memiliki tiga bagian yang mengikuti pola setup-execute-cleanup:

  • Pra-pengujian: siapkan data yang dibutuhkan pengujian. Masukkan catatan pelanggan, hapus data sisa dari pemrosesan sebelumnya.
  • Uji: jalankan operasi yang Anda uji. Panggil prosedur tersimpan dan kueri tampilan.
  • Pasca-pengujian: bersihkan setelah pengujian sehingga tidak mencemari eksekusi berikutnya.

Kondisi pengujian

Setelah pengujian T-SQL berjalan, kondisi pengujian memvalidasi hasil yang diterima kembali. Kondisi yang paling umum digunakan adalah:

  • Jumlah Baris: memverifikasi bahwa kumpulan hasil berisi jumlah baris yang diharapkan.
  • Nilai Skalar: memverifikasi bahwa sel tertentu dalam kumpulan hasil berisi nilai yang diharapkan.
  • Skema yang Diharapkan: memverifikasi bahwa kumpulan hasil memiliki nama kolom dan jenis data yang diharapkan.

Kondisi bawaan lainnya termasuk Data Checksum, Empty ResultSet, Not Empty ResultSet, dan Execution Time.

Membuat proyek pengujian unit

Menyiapkan pengujian unit SQL Server di Visual Studio mengambil beberapa langkah:

  1. Buka proyek database SQL Anda.
  2. Di SQL Server Object Explorer, temukan prosedur atau fungsi tersimpan yang ingin Anda uji.
  3. Klik kanan objek dan pilih Buat Pengujian Unit.
  4. Pilih atau buat proyek pengujian C#.
  5. Atur koneksi pengujian ke database pengembangan Anda.
  6. Pilih Sebarkan proyek database secara otomatis sebelum pengujian unit dijalankan. Opsi ini membuat database pengujian tetap sinkron dengan perubahan proyek terbaru Anda.

Perancang terbuka dengan templat T-SQL tempat Anda menulis logika pengujian dan melampirkan kondisi pengujian.

Menulis pengujian unit database yang efektif

Pengujian unit yang baik menjawab pertanyaan tertentu: "Apakah prosedur ini melakukan yang seharusnya untuk input yang diketahui?" Berikut adalah contoh yang menguji uspPlaceNewOrder, memverifikasi bahwa pengajuan pesanan memperbarui total pelanggan dari awal tahun hingga saat ini secara benar.

-- Pre-test: Set up customer and clear previous data
DECLARE @CustomerID INT;
INSERT INTO [Sales].[Customer] (CustomerName) VALUES (N'Test Customer');
SET @CustomerID = SCOPE_IDENTITY();
DELETE FROM [Sales].[Orders] WHERE [CustomerID] = @CustomerID;

-- Test: Place an order and verify YTDOrders updated correctly
DECLARE @RC INT;
EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 100, GETDATE(), 'O';

SELECT [YTDOrders]
FROM [Sales].[Customer]
WHERE [CustomerID] = @CustomerID;

📝 Pasangkan T-SQL pengujian ini dengan kondisi pengujian Nilai Skalar yang mengharapkan nilainya YTDOrders menjadi 100.

Tes negatif

Anda juga perlu memverifikasi bahwa prosedur tersimpan gagal dengan benar ketika mereka menerima input yang tidak valid. Misalnya, membatalkan pesanan yang sudah dikirim harus menimbulkan kesalahan, tidak berhasil secara diam-diam. Tes negatif mengonfirmasi bahwa kesalahan yang diharapkan terjadi.

Saat Anda memilih Buat Pengujian Unit di langkah 3 dari bagian sebelumnya, Visual Studio menghasilkan proyek pengujian C# di Penjelajah Solusi dengan file yang .cs berisi pengujian untuk setiap prosedur tersimpan yang Anda pilih. Misalnya, jika Anda membuat pengujian untuk uspCancelOrder, file yang dihasilkan menyertakan bagian bernama Sales_uspCancelOrder_Test. Untuk menandai pengujian tersebut .cs sebagai pengujian negatif, buka file di Penjelajah Solusi dan tambahkan ExpectedSqlException atribut tepat di atasnya dan simpan file:

[TestMethod()]
[ExpectedSqlException(Severity = 16, MatchFirstError = false, State = 1)]
public void Sales_uspCancelOrder_FilledOrder_Test()

Uji coba berhasil hanya jika prosedur tersimpan menghasilkan kesalahan yang sesuai dengan tingkat keparahan dan status yang ditentukan. Jika prosedur berhasil diam-diam, pengujian gagal, yang persis seperti yang Anda inginkan.

Merancang pendekatan pengujian integrasi

Pengujian unit dirancang untuk mengisolasi objek secara individual. Pengujian integrasi lebih mendalam dan menguji skenario yang mencakup beberapa operasi. Mereka menjawab pertanyaan seperti:

  • Apakah urutan panggilan prosedur tersimpan meninggalkan database dalam status yang diharapkan?
  • Apakah pemicu diaktifkan dengan benar ketika data tiba melalui lapisan aplikasi?
  • Apakah tampilan mengembalikan hasil yang akurat setelah serangkaian perubahan tabel terkait?

Pengujian integrasi memerlukan database khusus. Sebarkan proyek database SQL ke instans pengujian sebelum setiap eksekusi menggunakan penyebaran proyek database secara otomatis sebelum pengujian unit dijalankan . Pengaturan ini menjaga skema pengujian tetap terkini.

Pertimbangan untuk database pengujian

Pengujian unit dan pengujian integrasi menjalankan T-SQL terhadap database langsung, sehingga lingkungan pengujian membutuhkan penyiapan yang cermat untuk menghasilkan hasil yang andal.

  • Mengisolasi pengujian dari produksi. Gunakan instans terpisah atau database pengujian khusus. Menjalankan pengujian terhadap lingkungan produksi tidak pernah disarankan.
  • Reset ke status yang diketahui sebelum setiap eksekusi. Skrip pasca-penyebaran atau skrip pembersihan pengujian menangani masalah ini.
  • Eksternalisasikan string koneksi dalam file konfigurasi sehingga pengembangan secara lokal dan alur CI masing-masing mengarah ke database yang tepat tanpa perlu mengubah kode.

Mengintegrasikan pengujian ke dalam alur CI/CD

Tambahkan langkah pengujian setelah build dan penyebaran sehingga pengujian berjalan secara otomatis pada setiap penerapan. Di Azure DevOps, gunakan VSTest tugas:

- task: VSTest@2
  inputs:
    testAssembly: '**\*Tests.dll'
    searchFolder: '$(System.DefaultWorkingDirectory)'

Di GitHub Actions, jalankan pengujian menggunakan dotnet test:

- name: Run database unit tests
  run: dotnet test ./DatabaseTests/DatabaseTests.csproj

Petunjuk / Saran

Konfigurasikan proyek pengujian untuk menyebarkan proyek database secara otomatis sebelum pengujian dijalankan. Pengaturan ini memastikan bahwa skema database pengujian cocok dengan proyek pada saat pengujian.

Ketika pengujian gagal, alur berhenti dan perubahan tidak mencapai penahapan atau produksi. Penundaan ini memberi tim waktu untuk memperbaiki masalah sebelum memengaruhi lingkungan apa pun.

Poin-poin Penting

Pengujian database mencakup tiga tingkat: membangun validasi untuk kebenaran struktural, pengujian unit untuk verifikasi logika, dan pengujian integrasi untuk alur kerja end-to-end. Pengujian unit SQL Server mengikuti struktur tiga fase preaksi pengujian, tindakan pengujian, dan pengujian pasca-tindakan. Untuk memverifikasi prosedur tersimpan dan perilaku fungsi, gunakan kondisi pengujian seperti Scalar Value, Row Count, dan Expected Schema. Untuk menguji metode yang harus memvalidasi jalur penanganan kesalahan, tambahkan ExpectedSqlException atribut . Integrasikan proyek uji ke dalam alur CI/CD Anda sehingga pengujian yang gagal dapat memblokir penyebaran sebelum perubahan mencapai tahap pengujian atau produksi. Bersama-sama, ketiga lapisan ini membentuk jaring pengaman yang memungkinkan tim Anda menyebarkan perubahan database dengan percaya diri alih-alih kecemasan.