यह आलेख एक संग्रहीत कार्यविधि का परीक्षण करने वाली डेटाबेस इकाई का पूर्वाभ्यास प्रदान करता है जिसमें इसके भीतर एक उपयोगिता प्रक्रिया शामिल है।
इस लेख में, मैं एक डेटाबेस इकाई परीक्षण परिदृश्य पर चर्चा करने जा रहा हूं जब एक मुख्य संग्रहीत प्रक्रिया उपयोगिता प्रक्रिया पर निर्भर करती है और यह सुनिश्चित करने के लिए कि आवश्यकताओं को पूरा करने के लिए मुख्य प्रक्रिया को इकाई परीक्षण की आवश्यकता होती है। कुंजी यह सुनिश्चित करना है कि एक इकाई परीक्षण केवल कोड की एक इकाई के लिए लिखा जा सकता है जिसका अर्थ है कि हमें मुख्य प्रक्रिया के लिए एक इकाई परीक्षण और उपयोगिता प्रक्रिया के लिए एक और इकाई परीक्षण की आवश्यकता है।
यूनिट परीक्षण एक प्रक्रिया की तुलना में एक एकल संग्रहीत कार्यविधि का परीक्षण करना आसान है, जो अपने कोड के अंदर एक उपयोगिता प्रक्रिया को कॉल करता है।
उपयोगिता प्रक्रिया परिदृश्य को समझना बहुत महत्वपूर्ण है और यह एक सामान्य संग्रहित प्रक्रिया की इकाई परीक्षण से अलग क्यों है।
परिदृश्य:मुख्य प्रक्रिया के अंतर्गत उपयोगिता प्रक्रिया
उपयोगिता प्रक्रिया परिदृश्य को समझने के लिए आइए उपयोगिता प्रक्रिया की परिभाषा और उदाहरण से शुरू करें:
उपयोगिता प्रक्रिया क्या है
एक उपयोगिता प्रक्रिया आम तौर पर एक छोटी प्रक्रिया होती है जिसका उपयोग मुख्य प्रक्रिया (ओं) द्वारा कुछ विशिष्ट कार्य करने के लिए किया जाता है जैसे कि मुख्य प्रक्रिया के लिए कुछ प्राप्त करना या मुख्य प्रक्रिया में कुछ जोड़ना।
उपयोगिता प्रक्रिया की एक अन्य परिभाषा रखरखाव उद्देश्यों के लिए लिखी गई एक छोटी संग्रहीत प्रक्रिया है जिसमें सिस्टम टेबल या विचार शामिल हो सकते हैं जिन्हें किसी भी संख्या में या सीधे तौर पर बुलाया जा सकता है।
उपयोगिता प्रक्रिया के उदाहरण
ग्राहक-आदेश-उत्पाद परिदृश्य के बारे में सोचें जहां ग्राहक किसी विशेष उत्पाद के लिए ऑर्डर देता है। यदि हम किसी विशेष ग्राहक द्वारा दिए गए सभी ऑर्डर प्राप्त करने के लिए मुख्य प्रक्रिया बनाते हैं तो एक उपयोगिता प्रक्रिया का उपयोग यह समझने में हमारी सहायता के लिए किया जा सकता है कि क्या प्रत्येक ऑर्डर ग्राहक द्वारा कार्यदिवस या सप्ताहांत पर दिया गया था।
इस तरह, a ग्राहक द्वारा उत्पाद का आदेश देने की तारीख के आधार पर "सप्ताहांत" या "सप्ताहांत" वापस करने के लिए छोटी उपयोगिता प्रक्रिया लिखी जा सकती है।
एक अन्य उदाहरण मास्टर डेटाबेस में "sp_server_info" जैसे सिस्टम संग्रहीत कार्यविधियाँ हो सकता है जो SQL सर्वर स्थापित संस्करण जानकारी देता है:
EXEC sys.sp_server_info
इकाई परीक्षण उपयोगिता प्रक्रिया अलग क्यों है
जैसा कि पहले चर्चा की गई है, यूनिट परीक्षण एक उपयोगिता प्रक्रिया जिसे मुख्य प्रक्रिया के अंदर कहा जाता है, एक साधारण संग्रहित प्रक्रिया के यूनिट परीक्षण की तुलना में थोड़ा जटिल है।
ऊपर उल्लिखित ग्राहक-आदेश-उत्पाद उदाहरण को ध्यान में रखते हुए, उपयोगिता प्रक्रिया ठीक काम कर रही है, यह जांचने के लिए हमें एक इकाई परीक्षण लिखने की आवश्यकता है और मुख्य प्रक्रिया की जांच के लिए एक इकाई परीक्षण भी लिखा जाना है जो उपयोगिता प्रक्रिया को कॉल करने के साथ-साथ बैठक भी ठीक से काम कर रहा है। व्यावसायिक आवश्यकताएँ।
इसे इस प्रकार दर्शाया गया है:
उपयोगिता/मुख्य प्रक्रिया चुनौती से अलग करना
एक उपयोगिता प्रक्रिया को शामिल करने वाली प्रक्रिया के लिए एक इकाई परीक्षण लिखने में मुख्य चुनौती यह सुनिश्चित करना है कि हमें मुख्य प्रक्रिया के लिए एक इकाई परीक्षण लिखते समय उपयोगिता प्रक्रिया के कामकाज के बारे में चिंता नहीं करनी चाहिए और उपयोगिता प्रक्रिया के लिए भी यही सच है। . यह एक चुनौतीपूर्ण कार्य है जिसे ऐसे परिदृश्य के लिए इकाई परीक्षण लिखते समय ध्यान में रखा जाना चाहिए।
उपयोगिता या मुख्य प्रक्रिया से अलग होना आवश्यक है, यह इस बात पर निर्भर करता है कि किस प्रक्रिया का परीक्षण किया जा रहा है। यूनिट टेस्टिंग के दौरान आइसोलेशन के संदर्भ में हमें निम्नलिखित बातों को ध्यान में रखना होगा:
- उपयोगिता प्रक्रिया से अलग करना जब इकाई मुख्य प्रक्रिया का परीक्षण कर रही हो।
- इकाई परीक्षण उपयोगिता प्रक्रिया के दौरान मुख्य प्रक्रिया से अलग करना।
कृपया याद रखें कि यह लेख मुख्य प्रक्रिया को उसकी उपयोगिता प्रक्रिया से अलग करके इकाई परीक्षण पर केंद्रित है।
मुख्य प्रक्रिया और उसकी उपयोगिता प्रक्रिया बनाना
एक परिदृश्य के लिए एक इकाई परीक्षण लिखने के लिए जहां उपयोगिता प्रक्रिया मुख्य प्रक्रिया द्वारा उपयोग में है, हमें पहले निम्नलिखित पूर्व-आवश्यकताएं रखने की आवश्यकता है:
- नमूना डेटाबेस
- व्यावसायिक आवश्यकताएँ
सेटअप नमूना डेटाबेस (SQLBookShop)
हम "SQLBookShop" नामक एक साधारण दो-तालिका नमूना डेटाबेस बना रहे हैं जिसमें नीचे दिखाए गए अनुसार सभी पुस्तकों के रिकॉर्ड शामिल हैं:
SQLBookShop नमूना डेटाबेस इस प्रकार बनाएँ:
-- (1) Create SQLBookShop database CREATE DATABASE SQLBookShop; GO
डेटाबेस ऑब्जेक्ट (टेबल) को निम्नानुसार बनाएं और पॉप्युलेट करें:
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
त्वरित जांच - नमूना डेटाबेस
निम्न कोड का उपयोग करके ऑर्डर्डबुक दृश्य चलाकर एक त्वरित डेटाबेस जाँच करें:
USE SQLBookShop -- Run OrderedBooks view SELECT ob.OrderID ,ob.OrderDate ,ob.Title AS BookTitle ,ob.Quantity ,ob.TotalPrice FROM dbo.OrderedBooks ob
कृपया ध्यान दें कि मैं SQL सर्वर के लिए dbForge Studio का उपयोग कर रहा हूं, इसलिए यदि आप SSMS (SQL सर्वर प्रबंधन स्टूडियो) में समान कोड चलाते हैं तो आउटपुट लुक भिन्न हो सकता है। हालांकि, स्क्रिप्ट और उनके परिणामों में कोई अंतर नहीं है।
अतिरिक्त जानकारी के साथ नवीनतम आदेश देखने के लिए व्यावसायिक आवश्यकता
देव टीम को एक व्यावसायिक आवश्यकता भेजी गई है जिसमें कहा गया है कि "अंतिम उपयोगकर्ता किसी विशेष पुस्तक के लिए दिए गए सबसे हाल के आदेश के बारे में जानकारी के साथ जानना चाहता है कि क्या आदेश एक सप्ताह के दिन या सप्ताहांत पर रखा गया था"
TDDD के बारे में एक शब्द
हम इस लेख में परीक्षण-संचालित डेटाबेस विकास (TDDD) का कड़ाई से पालन नहीं कर रहे हैं, लेकिन मैं मुख्य और उपयोगिता दोनों प्रक्रियाओं को बनाने के लिए परीक्षण-संचालित डेटाबेस विकास (TDDD) का उपयोग करने की दृढ़ता से अनुशंसा करता हूं, जो कि वस्तु मौजूद है या नहीं, यह जांचने के लिए एक इकाई परीक्षण बनाकर शुरू होता है। पहले विफल हो जाता है, उसके बाद ऑब्जेक्ट बनाकर और यूनिट टेस्ट को फिर से चलाना जो पास होना चाहिए।
विस्तृत वॉक-थ्रू के लिए, कृपया इस लेख के पहले भाग को देखें।
उपयोगिता प्रक्रिया की पहचान करना
व्यवसाय की आवश्यकता को देखते हुए एक बात निश्चित रूप से है कि हमें एक उपयोगिता प्रक्रिया की आवश्यकता है जो हमें बता सके कि कोई विशेष तिथि सप्ताह का दिन है या सप्ताहांत।
उपयोगिता प्रक्रिया बनाना (GetDayType)
एक उपयोगिता प्रक्रिया बनाएं और इसे "GetDayType" इस प्रकार कहें:
-- 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
त्वरित जांच - उपयोगिता प्रक्रिया
उपयोगिता प्रक्रिया की शीघ्रता से जाँच करने के लिए कोड की निम्नलिखित पंक्तियाँ लिखें:
-- Quick check utility procedure declare @DayType varchar(10) EXEC uspGetDayType '20181001',@DayType output select @DayType AS [Type of Day]
मुख्य प्रक्रिया बनाना (GetLatestOrderByBookId)
किसी विशेष पुस्तक के लिए दिए गए सबसे हाल के आदेश को देखने के लिए मुख्य प्रक्रिया बनाएं और यह भी कि क्या आदेश एक सप्ताह के दिन या सप्ताहांत पर रखा गया था और इसे "GetLatestOrderByBookId" कहते हैं, जिसमें उपयोगिता प्रक्रिया के लिए कॉल निम्नानुसार है:
-- 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
त्वरित जांच - मुख्य प्रक्रिया
प्रक्रिया ठीक काम कर रही है या नहीं यह देखने के लिए निम्न कोड चलाएँ:
-- Get latest order for the bookid=6 EXEC uspGetLatestOrderByBookId @BookId = 6के लिए नवीनतम ऑर्डर प्राप्त करें
इकाई परीक्षण मुख्य प्रक्रिया कॉलिंग उपयोगिता प्रक्रिया
मुख्य प्रक्रिया और उपयोगिता प्रक्रिया इकाई परीक्षण के बीच अंतर को समझने के लिए यहां कुंजी है।
वर्तमान में हम मुख्य प्रक्रिया की इकाई परीक्षण पर ध्यान केंद्रित कर रहे हैं, इसलिए इसका मतलब है कि उपयोगिता प्रक्रिया को इस इकाई परीक्षण से इनायत से अलग करने की आवश्यकता है।
जासूस प्रक्रिया का उपयोग
यह सुनिश्चित करने के लिए कि मुख्य प्रक्रिया इकाई परीक्षण मुख्य प्रक्रिया की कार्यक्षमता के परीक्षण पर केंद्रित रहता है, हमें tSQLt द्वारा प्रदान की गई जासूसी प्रक्रिया का उपयोग करना होगा जो उपयोगिता प्रक्रिया के लिए एक स्टब (प्लेसहोल्डर) के रूप में कार्य करने वाली है।
tsqlt.org के अनुसार, कृपया याद रखें कि यदि आप किसी प्रक्रिया की जासूसी कर रहे हैं, तो आप वास्तव में उस प्रक्रिया की इकाई परीक्षण नहीं कर रहे हैं, बल्कि आप उस प्रक्रिया से संबंधित अन्य प्रक्रिया के लिए इसे आसान बना रहे हैं जिसकी आप जासूसी कर रहे हैं।
उदाहरण के लिए, हमारे मामले में, यदि हम मुख्य प्रक्रिया को इकाई परीक्षण करना चाहते हैं तो हमें जासूसी प्रक्रिया के उपयोग से उपयोगिता प्रक्रिया का मजाक उड़ाना होगा जो हमारे लिए मुख्य प्रक्रिया का इकाई परीक्षण करना आसान बना देगा।
मुख्य प्रक्रिया जासूसी उपयोगिता प्रक्रिया के लिए यूनिट टेस्ट बनाना
मुख्य प्रक्रिया कार्यों को ठीक से जांचने के लिए डेटाबेस इकाई परीक्षण बनाएं।
यह लेख SQL सर्वर के लिए dbForge Studio (या केवल dbForge यूनिट टेस्ट) के लिए काम करता है और SSMS (SQL सर्वर प्रबंधन स्टूडियो) . हालांकि, कृपया ध्यान दें कि एसएसएमएस (एसक्यूएल सर्वर मैनेजमेंट स्टूडियो) का उपयोग करते समय मुझे लगता है कि आप पहले से ही टीएसक्यूएलटी फ्रेमवर्क स्थापित कर चुके हैं और यूनिट परीक्षण लिखने के लिए तैयार हैं।
पहला डेटाबेस इकाई परीक्षण बनाने के लिए, SQLBookShop डेटाबेस पर राइट-क्लिक करें। शॉर्टकट मेनू पर, यूनिट टेस्ट पर क्लिक करें और फिर निम्नानुसार नया टेस्ट जोड़ें:
यूनिट टेस्ट कोड लिखें:
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
मुख्य प्रक्रिया के लिए यूनिट टेस्ट चलाना
इकाई परीक्षण चलाएँ:
बधाई हो, आपने स्पाई प्रक्रिया का उपयोग करने के बाद किसी संग्रहीत कार्यविधि को उसकी उपयोगिता प्रक्रिया से अलग करके उसका सफलतापूर्वक परीक्षण किया है।
इकाई परीक्षण के बारे में अधिक जानकारी के लिए कृपया परीक्षण संचालित डेटाबेस विकास (टीडीडीडी) के बारे में मेरे पिछले लेख के निम्नलिखित भागों को देखें:
- जंप टू स्टार्ट टेस्ट-ड्रिवेन डेटाबेस डेवलपमेंट (TDDD) - भाग 1
- जंप टू स्टार्ट टेस्ट-ड्रिवेन डेटाबेस डेवलपमेंट (TDDD) - पार्ट 2
- जंप टू स्टार्ट टेस्ट-ड्रिवेन डेटाबेस डेवलपमेंट (TDDD) - पार्ट 3
करने के लिए चीज़ें
अब आप थोड़े जटिल परिदृश्यों के लिए डेटाबेस इकाई परीक्षण बना सकते हैं जहाँ संग्रहीत कार्यविधियाँ उपयोगिता प्रक्रियाओं को बुलाती हैं।
- कृपया जासूसी प्रक्रिया @CommandToExecute तर्क (मान) को @CommandToExecute ='सेट @DayType ="कुछ भी नहीं" के रूप में बदलने का प्रयास करें और देखें कि परीक्षण अब विफल होने जा रहा है
- कृपया परीक्षण संचालित डेटाबेस विकास (टीडीडीडी) का उपयोग करके इस आलेख में व्यावसायिक आवश्यकता को पूरा करने का प्रयास करें
- कृपया किसी अन्य व्यावसायिक आवश्यकता को पूरा करने का प्रयास करें ताकि किसी भी ग्राहक द्वारा परीक्षण-संचालित विकास (टीडीडीडी) का उपयोग करके उसी उपयोगिता प्रक्रिया को शामिल करते हुए सबसे हालिया आदेश दिया जा सके
- कृपया मुख्य प्रक्रिया को अलग करके उपयोगिता प्रक्रिया के लिए एक इकाई परीक्षण बनाने का प्रयास करें
- कृपया अपने आप को एक ऐसी प्रक्रिया के लिए एक इकाई परीक्षण बनाने का प्रयास करें जो दो उपयोगिता प्रक्रियाओं को बुलाती है
उपयोगी टूल:
dbForge यूनिट टेस्ट - SQL सर्वर प्रबंधन स्टूडियो में स्वचालित इकाई परीक्षण को लागू करने के लिए एक सहज और सुविधाजनक GUI।