Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Menyederhanakan Pengujian Unit Prosedur Tersimpan Utama Yang Juga Memanggil Prosedur Utilitas

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:

  1. Mengisolasi dari prosedur utilitas saat unit menguji prosedur utama.
  2. 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:

  1. Contoh Basis Data
  2. 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.

  1. Silakan coba ubah prosedur mata-mata argumen @CommandToExecute (nilai) sebagai @CommandToExecute =‘set @DayType =”Nothing” ‘ dan lihat tes akan gagal sekarang
  2. Silakan coba penuhi persyaratan bisnis dalam artikel ini dengan menggunakan pengembangan basis data berbasis pengujian (TDDD)
  3. 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
  4. Silakan coba buat tes unit untuk prosedur utilitas dengan mengisolasi prosedur utama
  5. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python REST API Dengan Flask, Connexion, dan SQLAlchemy – Bagian 3

  2. Operator Perbandingan SQL

  3. Desain Basis Data Dengan Vertabelo

  4. Mengambil XMLA untuk menganalisis struktur kubus

  5. Prisma, cara membalik urutan