Artikel ini memberikan panduan unit basis data yang menguji prosedur tersimpan yang berisi prosedur utilitas di dalamnya.
Pada artikel ini, saya akan membahas skenario pengujian unit basis data ketika prosedur tersimpan utama bergantung pada prosedur utilitas dan prosedur utama perlu diuji unit untuk memastikan bahwa persyaratan terpenuhi. Kuncinya adalah memastikan bahwa pengujian unit hanya dapat ditulis untuk satu unit kode yang berarti kita memerlukan satu pengujian unit untuk prosedur utama dan pengujian unit lainnya untuk prosedur utilitas.
Pengujian unit prosedur tersimpan tunggal lebih mudah dibandingkan dengan pengujian unit prosedur yang memanggil prosedur utilitas di dalam kodenya.
Sangat penting untuk memahami skenario prosedur utilitas dan mengapa ini berbeda dari pengujian unit prosedur tersimpan normal.
Skenario:Prosedur Utilitas dalam Prosedur Utama
Untuk memahami skenario prosedur utilitas mari kita mulai dengan definisi dan contoh prosedur utilitas:
Apa itu Prosedur Utilitas
Prosedur utilitas umumnya adalah prosedur kecil yang digunakan oleh prosedur utama untuk melakukan beberapa tugas tertentu seperti mendapatkan sesuatu untuk prosedur utama atau menambahkan sesuatu ke prosedur utama.
Definisi lain dari prosedur utilitas adalah prosedur tersimpan kecil yang ditulis untuk tujuan pemeliharaan yang mungkin melibatkan tabel atau tampilan sistem untuk dipanggil oleh sejumlah prosedur atau bahkan secara langsung.
Contoh Prosedur Utilitas
Pikirkan skenario produk pesanan pelanggan di mana pelanggan memesan produk tertentu. Jika kita membuat prosedur utama untuk mendapatkan semua pesanan yang dilakukan oleh pelanggan tertentu, maka prosedur utilitas dapat digunakan untuk membantu kita memahami apakah setiap pesanan dilakukan oleh pelanggan pada hari kerja atau akhir pekan.
Dengan cara ini, prosedur utilitas kecil dapat ditulis untuk mengembalikan “Weekday” atau “Weekend” berdasarkan tanggal produk dipesan oleh pelanggan.
Contoh lain dapat berupa prosedur tersimpan sistem seperti "sp_server_info" di database master yang memberikan informasi versi yang diinstal SQL Server:
EXEC sys.sp_server_info
Mengapa Prosedur Utilitas Pengujian Unit Berbeda
Seperti dibahas sebelumnya, pengujian unit prosedur utilitas yang disebut di dalam prosedur utama sedikit rumit daripada pengujian unit prosedur tersimpan sederhana.
Mempertimbangkan contoh produk pesanan pelanggan yang disebutkan di atas, kita perlu menulis tes unit untuk memeriksa prosedur utilitas berfungsi dengan baik dan juga tes unit harus ditulis untuk memeriksa prosedur utama yang menyebut prosedur utilitas juga berfungsi dengan baik serta memenuhi kebutuhan bisnis.
Hal ini diilustrasikan sebagai berikut:
Mengisolasi dari Utilitas/Tantangan Prosedur Utama
Tantangan utama dalam menulis tes unit untuk prosedur yang melibatkan prosedur utilitas adalah untuk memastikan bahwa kita tidak perlu khawatir tentang fungsi prosedur utilitas saat menulis tes unit untuk prosedur utama dan hal yang sama berlaku untuk prosedur utilitas . Ini adalah tugas yang menantang yang harus diingat saat menulis pengujian unit untuk skenario seperti itu.
Mengisolasi dari utilitas atau prosedur utama adalah suatu keharusan, tergantung pada prosedur mana yang sedang diuji. Kita harus mengingat hal-hal berikut dalam konteks mengisolasi saat pengujian unit:
- Mengisolasi dari prosedur utilitas saat unit menguji prosedur utama.
- Mengisolasi dari prosedur utama saat prosedur utilitas pengujian unit.
Harap diingat bahwa artikel ini difokuskan pada pengujian unit prosedur utama dengan mengisolasinya dari prosedur utilitasnya.
Membuat Prosedur Utama dan Prosedur Utilitasnya
Untuk menulis pengujian unit untuk skenario di mana prosedur utilitas digunakan oleh prosedur utama, pertama-tama kita harus memiliki prasyarat berikut:
- Contoh Basis Data
- Persyaratan Bisnis
Setup Contoh Database (SQLBookShop)
Kami membuat database sampel dua tabel sederhana yang disebut "SQLBookShop" yang berisi catatan semua buku yang dipesan seperti yang ditunjukkan di bawah ini:
Buat contoh database SQLBookShop sebagai berikut:
-- (1) Create SQLBookShop database CREATE DATABASE SQLBookShop; GO
Membuat dan mengisi objek database (tabel) sebagai berikut:
USE SQLBookShop; -- (2) Drop book and book order tables if they already exist IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='BookOrder') DROP TABLE dbo.BookOrder IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Book') DROP TABLE dbo.Book IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_TYPE='View' AND t.TABLE_NAME='OrderedBooks') DROP VIEW dbo.OrderedBooks -- (3) Create book table CREATE TABLE Book (BookId INT PRIMARY KEY IDENTITY(1,1), Title VARCHAR(50), Stock INT, Price DECIMAL(10,2), Notes VARCHAR(200) ) -- (4) Create book order table CREATE TABLE dbo.BookOrder (OrderId INT PRIMARY KEY IDENTITY(1,1), OrderDate DATETIME2, BookId INT, Quantity INT, TotalPrice DECIMAL(10,2) ) -- (5) Adding foreign keys for author and article category ALTER TABLE dbo.BookOrder ADD CONSTRAINT FK_Book_BookId FOREIGN KEY (BookId) REFERENCES Book (BookId) -- (6) Populaing book table INSERT INTO dbo.Book (Title, Stock, Price, Notes) VALUES ('Mastering T-SQL in 30 Days', 10, 200, ''), ('SQL Database Reporting Fundamentals', 5, 100, ''), ('Common SQL Mistakes by Developers',15,100,''), ('Optimising SQL Queries',20,200,''), ('Database Development and Testing Tips',30,50,''), ('Test-Driven Database Development (TDDD)',20,200,'') -- (7) Populating book order table INSERT INTO dbo.BookOrder (OrderDate, BookId, Quantity, TotalPrice) VALUES ('2018-01-01', 1, 2, 400), ('2018-01-02', 2, 2, 200), ('2018-01-03', 3, 2, 200), ('2018-02-04', 1, 2, 400), ('2018-02-05', 1, 3, 600), ('2018-02-06', 4, 3, 600), ('2018-03-07', 5, 2, 100), ('2018-03-08', 6, 2, 400), ('2018-04-10', 5, 2, 100), ('2018-04-11', 6, 3, 600); GO -- (8) Creating database view to see all the books ordered by customers CREATE VIEW dbo.OrderedBooks AS SELECT bo.OrderId ,bo.OrderDate ,b.Title ,bo.Quantity ,bo.TotalPrice FROM BookOrder bo INNER JOIN Book b ON bo.BookId = b.BookId
Pemeriksaan Cepat – Contoh Basis Data
Lakukan pemeriksaan database cepat dengan menjalankan tampilan OrderedBooks menggunakan kode berikut:
USE SQLBookShop -- Run OrderedBooks view SELECT ob.OrderID ,ob.OrderDate ,ob.Title AS BookTitle ,ob.Quantity ,ob.TotalPrice FROM dbo.OrderedBooks ob
Harap dicatat bahwa saya menggunakan dbForge Studio untuk SQL Server sehingga tampilan output mungkin berbeda jika Anda menjalankan kode yang sama di SSMS (SQL Server Management Studio). Namun, tidak ada perbedaan antara skrip dan hasilnya.
Persyaratan Bisnis untuk melihat pesanan terbaru dengan informasi tambahan
Persyaratan bisnis telah dikirim ke tim pengembang yang menyatakan bahwa “Pengguna akhir ingin mengetahui tentang pesanan terbaru yang dilakukan untuk buku tertentu bersama dengan informasi apakah pesanan dilakukan pada hari kerja atau akhir pekan”
Sepatah Kata tentang TDDD
Kami tidak secara ketat mengikuti pengembangan basis data berbasis uji (TDDD) dalam artikel ini, tetapi saya sangat menyarankan untuk menggunakan pengembangan basis data berbasis uji (TDDD) untuk membuat prosedur utama dan utilitas yang dimulai dengan membuat uji unit untuk memeriksa apakah ada objek yang gagal pada awalnya, diikuti dengan membuat objek dan menjalankan kembali unit test yang harus lulus.
Untuk panduan lebih detail, lihat bagian pertama artikel ini.
Prosedur Mengidentifikasi Utilitas
Melihat kebutuhan bisnis satu hal yang pasti kita memerlukan prosedur utilitas yang dapat memberitahu kita apakah tanggal tertentu adalah hari kerja atau akhir pekan.
Prosedur Membuat Utilitas (GetDayType)
Buat prosedur utilitas dan beri nama “GetDayType” sebagai berikut:
-- Creating utility procedure to check whether the date passed to it is a weekday or weekend CREATE PROCEDURE dbo.uspGetDayType @OrderDate DATETIME2,@DayType CHAR(7) OUT AS BEGIN SET NOCOUNT ON IF (SELECT DATENAME(WEEKDAY, @OrderDate)) = 'Saturday' OR (SELECT DATENAME(WEEKDAY, @OrderDate)) = 'Sunday' SELECT @DayType= 'Weekend' ELSE SELECT @DayType = 'Weekday' SET NOCOUNT OFF END GO
Pemeriksaan Cepat – Prosedur Utilitas
Tulis baris kode berikut untuk memeriksa prosedur utilitas dengan cepat:
-- Quick check utility procedure declare @DayType varchar(10) EXEC uspGetDayType '20181001',@DayType output select @DayType AS [Type of Day]
Membuat Prosedur Utama (GetLatestOrderByBookId)
Buat prosedur utama untuk melihat pesanan terbaru yang ditempatkan untuk buku tertentu dan juga apakah pesanan dilakukan pada hari kerja atau akhir pekan dan beri nama “GetLatestOrderByBookId” yang berisi panggilan untuk prosedur utilitas sebagai berikut:
-- Creating stored procedure to get most recent order based on bookid and also whether order was placed on weekend or weekday CREATE PROCEDURE dbo.uspGetLatestOrderByBookId @BookId INT AS BEGIN -- Declare variables to store values DECLARE @OrderId INT ,@Book VARCHAR(50) ,@OrderDate DATETIME2 ,@Quantity INT ,@TotalPrice DECIMAL(10, 2) ,@DayType VARCHAR(10) -- Get most recent order for a particular book and initialise variables SELECT TOP 1 @OrderId = bo.OrderId ,@Book = b.Title ,@OrderDate = bo.OrderDate ,@Quantity = bo.Quantity ,@TotalPrice = bo.TotalPrice FROM BookOrder bo INNER JOIN Book b ON bo.BookId = b.BookId WHERE bo.BookId = @BookId ORDER BY OrderDate DESC -- Call utility procedure to get type of day for the above selected most recent order EXEC uspGetDayType @OrderDate ,@DayType OUTPUT -- Show most recent order for a particular book along with the information whether order was placed on weekday or weekend SELECT @OrderId AS OrderId ,@OrderDate AS OrderDate ,@Book AS Book ,@Quantity AS Quantity ,@TotalPrice AS TotalPrice ,@DayType AS DayType END GO
Pemeriksaan Cepat – Prosedur Utama
Jalankan kode berikut untuk melihat apakah prosedurnya berfungsi dengan baik atau tidak:
-- Get latest order for the bookid=6 EXEC uspGetLatestOrderByBookId @BookId = 6
Prosedur Utama Pengujian Unit Prosedur Utilitas Panggilan
Kuncinya di sini adalah memahami perbedaan antara pengujian unit prosedur utama dan prosedur utilitas.
Saat ini kami fokus pada pengujian unit prosedur utama, jadi ini berarti prosedur utilitas perlu diisolasi dengan baik dari pengujian unit ini.
Penggunaan Prosedur Spy
Untuk memastikan bahwa pengujian unit prosedur utama tetap fokus pada pengujian fungsionalitas prosedur utama, kita harus menggunakan prosedur mata-mata yang disediakan oleh tSQLt yang akan bertindak sebagai rintisan (placeholder) untuk prosedur utilitas.
Menurut tsqlt.org, harap diingat jika Anda memata-matai suatu prosedur, Anda sebenarnya tidak menguji unit prosedur itu, tetapi Anda mempermudah prosedur lain yang terkait dengan prosedur yang Anda mata-matai untuk diuji unit.
Misalnya, dalam kasus kami, jika kami ingin menguji unit prosedur utama maka kami harus mengejek prosedur utilitas dengan menggunakan prosedur mata-mata yang akan memudahkan kami untuk menguji unit prosedur utama.
Membuat Tes Unit untuk Prosedur Utama Prosedur Utilitas Spionase
Buat pengujian unit basis data untuk memeriksa fungsi prosedur utama dengan benar.
Artikel ini berfungsi untuk dbForge Studio untuk SQL Server (atau hanya dbForge Unit Test) dan SSMS (SQL Server Management Studio) . Namun, harap dicatat bahwa ketika menggunakan SSMS (SQL Server Management Studio) saya menganggap Anda telah menginstal tSQLt Framework dan siap untuk menulis unit test.
Untuk membuat pengujian unit database pertama, klik kanan database SQLBookShop. Pada menu shortcut, klik Unit Test lalu Add New Test sebagai berikut:
Tulis kode pengujian unit:
CREATE PROCEDURE GetLatestOrder.[test to check uspGetLatestOrderByBookId outputs correct data] AS BEGIN --Assemble -- Mock order Book and BookOrder table EXEC tSQLt.FakeTable @TableName='dbo.Book' EXEC tSQLt.FakeTable @TableName='dbo.BookOrder' -- Adding mock data to book table INSERT INTO dbo.Book (BookId,Title, Stock, Price, Notes) VALUES (1,'Basics of T-SQL Programming', 10, 100, ''), (2,'Advanced T-SQL Programming', 10, 200, '') -- Adding mock data to bookorder table INSERT INTO dbo.BookOrder (OrderId,OrderDate, BookId, Quantity, TotalPrice) VALUES (1,'2018-01-01', 1, 2, 200), (2,'2018-05-01', 1, 2, 200), (3,'2018-07-01', 2, 2, 400) -- Creating expected table CREATE TABLE GetLatestOrder.Expected ( OrderId INT ,OrderDate DATETIME2 ,Book VARCHAR(50) ,Quantity INT ,TotalPrice DECIMAL(10, 2) ,DayType VARCHAR(10) ) -- Creating actual table CREATE TABLE GetLatestOrder.Actual ( OrderId INT ,OrderDate DATETIME2 ,Book VARCHAR(50) ,Quantity INT ,TotalPrice DECIMAL(10, 2) ,DayType VARCHAR(10) ) -- Creating uspGetDayType spy procedure to isolate main procedure from it so that main procedure can be unit tested EXEC tSQLt.SpyProcedure @ProcedureName = 'dbo.uspGetDayType',@CommandToExecute = 'set @DayType = ''Weekday'' ' -- Inserting expected values to the expected table INSERT INTO GetLatestOrder.Expected (OrderId, OrderDate, Book, Quantity, TotalPrice, DayType) VALUES (2,'2018-05-01', 'Basics of T-SQL Programming', 2, 200,'Weekday'); --Act INSERT INTO GetLatestOrder.Actual EXEC uspGetLatestOrderByBookId @BookId = 1 -- Calling the main procedure --Assert --Compare expected results with actual table results EXEC tSQLt.AssertEqualsTable @Expected = N'GetLatestOrder.Expected', -- nvarchar(max) @Actual = N'GetLatestOrder.Actual' -- nvarchar(max) END; GO
Menjalankan Uji Unit untuk Prosedur Utama
Jalankan pengujian unit:
Selamat, Anda telah berhasil menguji unit prosedur tersimpan dengan mengisolasinya dari prosedur utilitasnya setelah menggunakan prosedur mata-mata.
Untuk informasi lebih lanjut tentang pengujian unit, silakan baca bagian berikut dari artikel saya sebelumnya tentang pengembangan basis data yang digerakkan oleh pengujian (TDDD):
- Langsung untuk Memulai Pengembangan Basis Data Berbasis Tes (TDDD) – Bagian 1
- Langsung untuk Memulai Pengembangan Basis Data Berbasis Tes (TDDD) – Bagian 2
- Langsung untuk Memulai Pengembangan Basis Data Berbasis Tes (TDDD) – Bagian 3
Hal yang Dapat Dilakukan
Anda sekarang dapat membuat pengujian unit basis data untuk skenario yang sedikit rumit di mana prosedur tersimpan memanggil prosedur utilitas.
- Silakan coba ubah prosedur mata-mata argumen @CommandToExecute (nilai) sebagai @CommandToExecute =‘set @DayType =”Nothing” ‘ dan lihat tes akan gagal sekarang
- Silakan coba penuhi persyaratan bisnis dalam artikel ini dengan menggunakan pengembangan basis data berbasis pengujian (TDDD)
- Silakan coba penuhi persyaratan bisnis lain untuk melihat pesanan terbaru yang dilakukan oleh pelanggan mana pun menggunakan pengembangan berbasis uji (TDDD) yang melibatkan prosedur utilitas yang sama
- Silakan coba buat tes unit untuk prosedur utilitas dengan mengisolasi prosedur utama
- Cobalah membuat tes unit untuk prosedur yang memanggil dua prosedur utilitas
Alat yang berguna:
dbForge Unit Test – GUI yang intuitif dan nyaman untuk mengimplementasikan pengujian unit otomatis di SQL Server Management Studio.