ออกแบบและใช้กลยุทธ์การทดสอบ

เสร็จสมบูรณ์เมื่อ

โครงการฐานข้อมูล 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 ใช้เวลาไม่กี่ขั้นตอน:

  1. เปิดโครงการฐานข้อมูล SQL ของคุณ
  2. ใน SQL Server Object Explorer ค้นหากระบวนงานหรือฟังก์ชันที่เก็บไว้ที่คุณต้องการทดสอบ
  3. คลิกขวาที่วัตถุแล้วเลือกสร้างการทดสอบหน่วย
  4. เลือกหรือสร้างโครงการทดสอบ C#
  5. ตั้งค่าการเชื่อมต่อทดสอบกับฐานข้อมูลการพัฒนาของคุณ
  6. เลือก ปรับใช้โครงการฐานข้อมูลโดยอัตโนมัติก่อนเรียกใช้การทดสอบหน่วย ตัวเลือกนี้ช่วยให้ฐานข้อมูลทดสอบซิงค์กับการเปลี่ยนแปลงโครงการล่าสุดของคุณ

ตัวออกแบบจะเปิดขึ้นพร้อมกับเทมเพลต 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 ของคุณ เพื่อให้การทดสอบที่ล้มเหลวจะบล็อกการปรับใช้ก่อนที่การเปลี่ยนแปลงจะไปถึงการจัดเตรียมหรือการผลิต ทั้งสามชั้นนี้รวมกันเป็นตาข่ายความปลอดภัยที่ช่วยให้ทีมของคุณปรับใช้การเปลี่ยนแปลงฐานข้อมูลด้วยความมั่นใจแทนที่จะวิตกกังวล