ออกแบบและใช้กลยุทธ์การทดสอบ
โครงการฐานข้อมูล SQL ที่สร้างได้สําเร็จไม่ได้หมายความว่ากระบวนงานที่เก็บไว้ภายในจะส่งคืนผลลัพธ์ที่ถูกต้อง กระบวนงานสามารถคอมไพล์ได้โดยไม่มีข้อผิดพลาด และยังคงคํานวณผลรวมที่ไม่ถูกต้อง หรือข้ามการตรวจสอบความถูกต้อง การทดสอบจะตรวจจับปัญหาเหล่านี้ก่อนที่จะถึงการผลิต
ทําความเข้าใจระดับการทดสอบฐานข้อมูล
การทดสอบฐานข้อมูลทํางานเป็นเลเยอร์ โดยแต่ละชั้นจะจับปัญหาที่แตกต่างกัน:
-
การตรวจสอบความถูกต้องของบิลด์ เป็นขั้นตอนที่คุณ
dotnet buildมีอยู่แล้ว มันจับข้อผิดพลาดทางไวยากรณ์และการอ้างอิงวัตถุที่ใช้งานไม่ได้ รวดเร็ว แต่พิสูจน์ได้ว่าสคีมานั้นถูกต้องตามโครงสร้างเท่านั้น - การทดสอบหน่วยจะ ตรวจสอบว่ากระบวนงานและฟังก์ชันที่เก็บไว้แต่ละรายการให้ผลลัพธ์ที่ถูกต้องสําหรับชุดอินพุตที่กําหนด พวกเขาจับข้อผิดพลาดทางตรรกะ
- การทดสอบการรวม จะใช้สถานการณ์แบบ end-to-end กับฐานข้อมูลที่ปรับใช้ พวกเขาพิสูจน์ว่าวัตถุทํางานร่วมกันอย่างถูกต้อง แต่ต้องใช้อินสแตนซ์ที่ทํางานอยู่และใช้เวลามากที่สุด
แต่ละเลเยอร์ช้ากว่าและมีราคาแพงกว่าเลเยอร์ก่อนหน้า แต่ยังจับปัญหาที่เลเยอร์ก่อนหน้าไม่สามารถทําได้
สร้างการทดสอบหน่วย SQL Server
SQL Server Data Tools (SSDT) ใน Visual Studio มีเฟรมเวิร์กในตัวสําหรับการทดสอบหน่วยฐานข้อมูล การทดสอบแต่ละครั้งจะดําเนินการ T-SQL กับฐานข้อมูลที่ใช้งานจริงและตรวจสอบผลลัพธ์โดยใช้เงื่อนไขการทดสอบ
โครงสร้างของการทดสอบหน่วย
การทดสอบแต่ละครั้งมีสามส่วนที่เป็นไปตามรูปแบบการตั้งค่า-ดําเนินการ-ล้างข้อมูล:
- การทดสอบล่วงหน้า: ตั้งค่าข้อมูลที่การทดสอบต้องการ แทรกบันทึกลูกค้า ล้างข้อมูลที่เหลือจากการเรียกใช้ครั้งก่อน
- ทดสอบ: ดําเนินการที่คุณกําลังทดสอบ เรียกใช้กระบวนงานที่เก็บไว้และสอบถามมุมมอง
- หลังการทดสอบ: ทําความสะอาดหลังการทดสอบเพื่อไม่ให้ปนเปื้อนในครั้งต่อไป
เงื่อนไขการทดสอบ
หลังจากการทดสอบ T-SQL ทํางานเงื่อนไข การทดสอบ จะตรวจสอบสิ่งที่กลับมา เงื่อนไขที่ใช้บ่อยที่สุดคือ:
- จํานวนแถว: ตรวจสอบว่าชุดผลลัพธ์มีจํานวนแถวที่คาดไว้
- ค่าสเกลาร์: ตรวจสอบว่าเซลล์เฉพาะในชุดผลลัพธ์มีค่าที่คาดไว้
- Schema ที่คาดไว้: ตรวจสอบว่าชุดผลลัพธ์มีชื่อคอลัมน์และชนิดข้อมูลที่คาดไว้
เงื่อนไขที่มีอยู่แล้วภายในอื่นๆ ได้แก่ Data Checksum, Empty ResultSet, Not Empty ResultSet และ Execution Time
สร้างโครงการทดสอบหน่วย
การตั้งค่าการทดสอบหน่วย SQL Server ใน Visual Studio ใช้เวลาไม่กี่ขั้นตอน:
- เปิดโครงการฐานข้อมูล SQL ของคุณ
- ใน SQL Server Object Explorer ค้นหากระบวนงานหรือฟังก์ชันที่เก็บไว้ที่คุณต้องการทดสอบ
- คลิกขวาที่วัตถุแล้วเลือกสร้างการทดสอบหน่วย
- เลือกหรือสร้างโครงการทดสอบ C#
- ตั้งค่าการเชื่อมต่อทดสอบกับฐานข้อมูลการพัฒนาของคุณ
- เลือก ปรับใช้โครงการฐานข้อมูลโดยอัตโนมัติก่อนเรียกใช้การทดสอบหน่วย ตัวเลือกนี้ช่วยให้ฐานข้อมูลทดสอบซิงค์กับการเปลี่ยนแปลงโครงการล่าสุดของคุณ
ตัวออกแบบจะเปิดขึ้นพร้อมกับเทมเพลต T-SQL ที่คุณเขียนตรรกะการทดสอบและแนบเงื่อนไขการทดสอบ
เขียนการทดสอบหน่วยฐานข้อมูลที่มีประสิทธิภาพ
การทดสอบหน่วยที่ดีจะตอบคําถามเฉพาะ: "ขั้นตอนนี้ทําในสิ่งที่ควรจะเป็นสําหรับอินพุตที่รู้จักหรือไม่" นี่คือตัวอย่างที่ทดสอบ uspPlaceNewOrderการตรวจสอบว่าการสั่งซื้อจะอัปเดตยอดรวมตั้งแต่ต้นปีจนถึงปัจจุบันของลูกค้าอย่างถูกต้อง:
-- 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;
📝จับคู่การทดสอบ T-SQL นี้กับเงื่อนไขการทดสอบค่าสเกลาร์ที่คาดว่าค่า100จะเป็นYTDOrders
การทดสอบเชิงลบ
นอกจากนี้ คุณยังต้องตรวจสอบว่า กระบวนงานที่เก็บไว้ล้มเหลวอย่างถูกต้องเมื่อได้รับอินพุตที่ไม่ถูกต้อง ตัวอย่างเช่น การยกเลิกใบสั่งที่จัดส่งไปแล้วควรทําให้เกิดข้อผิดพลาด ไม่ใช่สําเร็จอย่างเงียบๆ การทดสอบเชิงลบยืนยันว่าเกิดข้อผิดพลาดที่คาดไว้
เมื่อคุณเลือก สร้างการทดสอบหน่วย ในขั้นตอนที่ 3 ของส่วนก่อนหน้า Visual Studio จะสร้างโครงการทดสอบ C# ใน Solution Explorer ด้วย .cs ไฟล์ที่มีการทดสอบสําหรับแต่ละกระบวนงานที่เก็บไว้ที่คุณเลือก ตัวอย่างเช่น หากคุณสร้างการทดสอบสําหรับ uspCancelOrderไฟล์ที่สร้างขึ้นจะมีส่วนที่ชื่อSales_uspCancelOrder_Test เมื่อต้องการทําเครื่องหมายการทดสอบนั้นเป็นการทดสอบเชิงลบ ให้เปิด .cs ไฟล์ใน Solution Explorer และเพิ่ม ExpectedSqlException แอตทริบิวต์ด้านบนโดยตรง และบันทึกไฟล์:
[TestMethod()]
[ExpectedSqlException(Severity = 16, MatchFirstError = false, State = 1)]
public void Sales_uspCancelOrder_FilledOrder_Test()
การทดสอบจะผ่านเฉพาะเมื่อกระบวนงานที่เก็บไว้ทําให้เกิดข้อผิดพลาดที่ตรงกับความรุนแรงและสถานะที่ระบุ หากขั้นตอนสําเร็จอย่างเงียบ ๆ การทดสอบจะล้มเหลวซึ่งเป็นสิ่งที่คุณต้องการ
ออกแบบแนวทางการทดสอบการผสานรวม
การทดสอบหน่วยแยกวัตถุแต่ละชิ้น การทดสอบการผสานรวมจะก้าวไปไกลกว่านั้นและทดสอบสถานการณ์ที่ครอบคลุมการดําเนินการหลายอย่าง พวกเขาตอบคําถามเช่น:
- ลําดับของการเรียกกระบวนงานที่เก็บไว้ออกจากฐานข้อมูลในสถานะที่คาดไว้หรือไม่
- ทริกเกอร์เริ่มทํางานอย่างถูกต้องเมื่อข้อมูลมาถึงเลเยอร์แอปพลิเคชันหรือไม่
- มุมมองแสดงผลผลลัพธ์ที่ถูกต้องหลังจากการเปลี่ยนแปลงตารางที่เกี่ยวข้องหลายชุดหรือไม่
การทดสอบการรวมจําเป็นต้องมีฐานข้อมูลเฉพาะ ปรับใช้โครงการฐานข้อมูล SQL กับอินสแตนซ์ทดสอบก่อนเรียกใช้แต่ละครั้งโดยใช้การตั้งค่าปรับใช้โครงการฐานข้อมูลโดยอัตโนมัติก่อนเรียกใช้การทดสอบหน่วย การตั้งค่านี้ทําให้สคีมาการทดสอบเป็นปัจจุบัน
ข้อควรพิจารณาสําหรับฐานข้อมูลทดสอบ
ทั้งการทดสอบหน่วยและการทดสอบการรวมจะเรียกใช้ T-SQL กับฐานข้อมูลสด ดังนั้นสภาพแวดล้อมการทดสอบจึงต้องมีการตั้งค่าอย่างระมัดระวังเพื่อให้ได้ผลลัพธ์ที่เชื่อถือได้
- แยกการทดสอบออกจากการผลิต ใช้อินสแตนซ์แยกต่างหากหรือฐานข้อมูลทดสอบเฉพาะ ไม่แนะนําให้ทําการทดสอบกับการผลิต
- รีเซ็ตเป็นสถานะที่ทราบ ก่อนการเรียกใช้แต่ละครั้ง สคริปต์หลังการปรับใช้หรือสคริปต์การล้างข้อมูลทดสอบจะจัดการกับปัญหานี้
- ทําให้สตริงการเชื่อมต่อ ภายนอกในไฟล์การกําหนดค่า เพื่อให้การพัฒนาในเครื่องและไปป์ไลน์ CI แต่ละรายการชี้ไปยังฐานข้อมูลที่ถูกต้องโดยไม่ต้องเปลี่ยนแปลงโค้ด
รวมการทดสอบเข้ากับไปป์ไลน์ CI/CD
เพิ่มขั้นตอนการทดสอบหลังจากสร้างและปรับใช้เพื่อให้การทดสอบทํางานโดยอัตโนมัติในทุกการคอมมิต ใน Azure DevOps ให้ใช้งาน:VSTest
- task: VSTest@2
inputs:
testAssembly: '**\*Tests.dll'
searchFolder: '$(System.DefaultWorkingDirectory)'
ใน GitHub Actions ให้เรียกใช้การทดสอบโดยใช้ dotnet test:
- name: Run database unit tests
run: dotnet test ./DatabaseTests/DatabaseTests.csproj
เคล็ดลับ
กําหนดค่าโครงการทดสอบเพื่อปรับใช้โครงการฐานข้อมูลโดยอัตโนมัติก่อนทําการทดสอบ การตั้งค่านี้ช่วยให้แน่ใจว่า Schema ฐานข้อมูลทดสอบตรงกับโครงการ ณ เวลาที่ทําการทดสอบ
เมื่อการทดสอบล้มเหลว ไปป์ไลน์จะหยุดลงและการเปลี่ยนแปลงไม่ไปถึงการจัดเตรียมหรือการผลิต ความล่าช้านี้ทําให้ทีมมีเวลาแก้ไขปัญหาก่อนที่จะส่งผลกระทบต่อสภาพแวดล้อมใดๆ
ประเด็นสําคัญ
การทดสอบฐานข้อมูลครอบคลุมสามระดับ: สร้างการตรวจสอบความถูกต้องของโครงสร้าง การทดสอบหน่วยสําหรับการตรวจสอบตรรกะ และการทดสอบการรวมสําหรับเวิร์กโฟลว์แบบ end-to-end การทดสอบหน่วย SQL Server เป็นไปตามโครงสร้างสามขั้นตอนของปฏิกิริยาการทดสอบ การดําเนินการทดสอบ และการทดสอบหลังการดําเนินการ เมื่อต้องการตรวจสอบกระบวนงานที่เก็บไว้และลักษณะการทํางานของฟังก์ชัน ให้ใช้เงื่อนไขการทดสอบ เช่น Scalar Value, Row Count, และ Expected Schema. เมื่อต้องการทดสอบวิธีการที่ควรตรวจสอบความถูกต้องของเส้นทางการจัดการข้อผิดพลาด ให้เพิ่มแอตทริบิว ExpectedSqlException ต์ เชื่อมต่อโครงการทดสอบลงในไปป์ไลน์ CI/CD ของคุณ เพื่อให้การทดสอบที่ล้มเหลวจะบล็อกการปรับใช้ก่อนที่การเปลี่ยนแปลงจะไปถึงการจัดเตรียมหรือการผลิต ทั้งสามชั้นนี้รวมกันเป็นตาข่ายความปลอดภัยที่ช่วยให้ทีมของคุณปรับใช้การเปลี่ยนแปลงฐานข้อมูลด้วยความมั่นใจแทนที่จะวิตกกังวล