Thiết kế và thực hiện chiến lược thử nghiệm
Một dự án cơ sở dữ liệu SQL xây dựng thành công không có nghĩa là các thủ tục được lưu trữ bên trong nó trả về kết quả phù hợp. Một thủ tục có thể biên dịch mà không có lỗi mà vẫn tính toán sai tổng số hoặc bỏ qua kiểm tra xác thực. Thử nghiệm phát hiện những vấn đề này trước khi chúng đến sản xuất.
Hiểu các cấp độ kiểm tra cơ sở dữ liệu
Kiểm thử cơ sở dữ liệu hoạt động theo các lớp, mỗi lớp bắt một lớp vấn đề khác nhau:
-
Xác thực bản dựng là
dotnet buildbước bạn đã có. Nó bắt lỗi cú pháp và tham chiếu đối tượng bị hỏng. Nhanh, nhưng nó chỉ chứng minh lược đồ có giá trị về mặt cấu trúc. - Kiểm thử đơn vị xác minh rằng các thủ tục và chức năng được lưu trữ riêng lẻ tạo ra kết quả phù hợp cho một tập hợp đầu vào nhất định. Họ bắt lỗi logic.
- Kiểm tra tích hợp thực hiện các kịch bản đầu cuối dựa trên cơ sở dữ liệu đã triển khai. Chúng chứng minh rằng các đối tượng hoạt động cùng nhau một cách chính xác, nhưng chúng yêu cầu một thực thể đang chạy và mất nhiều thời gian nhất.
Mỗi lớp chậm hơn và đắt hơn lớp trước, nhưng cũng bắt được các vấn đề mà lớp trước không thể.
Tạo kiểm tra đơn vị SQL Server
SQL Server Data Tools (SSDT) trong Visual Studio bao gồm một khung tích hợp để kiểm tra đơn vị cơ sở dữ liệu. Mỗi thử nghiệm thực thi T-SQL đối với cơ sở dữ liệu trực tiếp và xác thực kết quả bằng cách sử dụng các điều kiện thử nghiệm.
Cấu trúc của một unit test
Mỗi thử nghiệm có ba phần tuân theo mẫu thiết lập-thực thi-dọn dẹp:
- Pre-test: thiết lập dữ liệu mà test cần. Chèn hồ sơ khách hàng, xóa dữ liệu còn sót lại từ các lần chạy trước.
- Kiểm tra: thực hiện thao tác bạn đang kiểm tra. Gọi thủ tục được lưu trữ và truy vấn dạng xem.
- Sau khi kiểm tra: dọn dẹp sau khi kiểm tra để nó không làm ô nhiễm lần chạy tiếp theo.
Điều kiện thử nghiệm
Sau khi thử nghiệm T-SQL chạy, các điều kiện thử nghiệm xác nhận những gì đã trở lại. Các điều kiện được sử dụng phổ biến nhất là:
- Số hàng: xác minh rằng tập kết quả chứa số hàng dự kiến.
- Giá trị vô hướng: xác minh rằng một ô cụ thể trong tập kết quả chứa giá trị mong đợi.
- Lược đồ dự kiến: xác minh rằng tập kết quả có tên cột và kiểu dữ liệu dự kiến.
Các điều kiện tích hợp khác bao gồm Data Checksum, Empty ResultSet, Not Empty ResultSet và Execution Time.
Tạo dự án kiểm thử đơn vị
Thiết lập kiểm tra đơn vị SQL Server trong Visual Studio thực hiện một vài bước:
- Mở dự án cơ sở dữ liệu SQL của bạn.
- Trong SQL Server Object Explorer, tìm thủ tục hoặc hàm được lưu trữ mà bạn muốn kiểm tra.
- Nhấp chuột phải vào đối tượng và chọn Create Unit Tests.
- Chọn hoặc tạo một dự án thử nghiệm C#.
- Đặt kết nối thử nghiệm với cơ sở dữ liệu phát triển của bạn.
- Chọn Tự động triển khai dự án cơ sở dữ liệu trước khi chạy kiểm thử đơn vị. Tùy chọn này giữ cho cơ sở dữ liệu thử nghiệm đồng bộ với các thay đổi mới nhất của dự án.
Công cụ thiết kế mở ra với một mẫu T-SQL, nơi bạn viết logic kiểm tra của mình và đính kèm các điều kiện kiểm tra.
Viết các bài kiểm tra đơn vị cơ sở dữ liệu hiệu quả
Một bài kiểm tra đơn vị tốt trả lời một câu hỏi cụ thể: "Quy trình này có thực hiện những gì nó phải làm đối với một đầu vào đã biết không?" Dưới đây là một ví dụ kiểm tra uspPlaceNewOrder, xác minh rằng việc đặt hàng cập nhật chính xác tổng số từ đầu năm đến nay của khách hàng:
-- 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;
📝 Ghép nối kiểm tra T-SQL này với điều kiện kiểm tra Giá trị vô hướng mong đợi YTDOrders giá trị là 100.
Xét nghiệm âm tính
Bạn cũng cần xác minh rằng các thủ tục được lưu trữ không chính xác khi chúng nhận được đầu vào không hợp lệ. Ví dụ: việc hủy đơn hàng đã được vận chuyển sẽ gây ra lỗi chứ không phải thành công một cách âm thầm. Xét nghiệm âm tính xác nhận rằng lỗi dự kiến xảy ra.
Khi bạn chọn Create Unit Tests ở bước 3 của phần trước, Visual Studio sẽ tạo một dự án kiểm tra C# trong Solution Explorer với một .cs tệp chứa kiểm tra cho mỗi thủ tục được lưu trữ mà bạn đã chọn. Ví dụ: nếu bạn đã tạo một thử nghiệm cho uspCancelOrder, tệp được tạo bao gồm một phần có tên Sales_uspCancelOrder_Test. Để đánh dấu thử nghiệm đó là thử nghiệm tiêu cực, hãy mở .cs tệp trong Solution Explorer và thêm thuộc tính ngay ExpectedSqlException phía trên tệp đó và lưu tệp:
[TestMethod()]
[ExpectedSqlException(Severity = 16, MatchFirstError = false, State = 1)]
public void Sales_uspCancelOrder_FilledOrder_Test()
Kiểm tra chỉ vượt qua khi thủ tục được lưu trữ gây ra lỗi phù hợp với mức độ nghiêm trọng và trạng thái được chỉ định. Nếu quy trình thành công một cách âm thầm, bài kiểm tra sẽ thất bại, đó chính xác là những gì bạn muốn.
Thiết kế phương pháp kiểm thử tích hợp
Kiểm tra đơn vị cách ly các đối tượng riêng lẻ. Các bài kiểm tra tích hợp đi xa hơn và kiểm tra các kịch bản trải dài trên nhiều hoạt động. Họ trả lời các câu hỏi như:
- Một chuỗi các lệnh gọi thủ tục được lưu trữ có rời khỏi cơ sở dữ liệu ở trạng thái mong đợi không?
- Trình kích hoạt có kích hoạt chính xác khi dữ liệu đến qua lớp ứng dụng không?
- Chế độ xem có trả về kết quả chính xác sau một loạt thay đổi bảng liên quan không?
Kiểm tra tích hợp cần một cơ sở dữ liệu chuyên dụng. Triển khai dự án cơ sở dữ liệu SQL cho một phiên bản thử nghiệm trước mỗi lần chạy bằng cách sử dụng cài đặt Tự động triển khai dự án cơ sở dữ liệu trước khi chạy thử nghiệm đơn vị . Cài đặt này giữ cho lược đồ thử nghiệm hiện tại.
Những điều cần cân nhắc đối với cơ sở dữ liệu thử nghiệm
Cả kiểm thử đơn vị và kiểm thử tích hợp đều chạy T-SQL trên cơ sở dữ liệu trực tiếp, vì vậy môi trường kiểm thử cần được thiết lập cẩn thận để tạo ra kết quả đáng tin cậy.
- Cách ly các thử nghiệm khỏi sản xuất. Sử dụng một phiên bản riêng biệt hoặc cơ sở dữ liệu thử nghiệm chuyên dụng. Không bao giờ nên chạy thử nghiệm so với sản xuất.
- Đặt lại về trạng thái đã biết trước mỗi lần chạy. Tập lệnh sau triển khai hoặc tập lệnh dọn dẹp thử nghiệm xử lý vấn đề này.
- Bên ngoài hóa các chuỗi kết nối trong các tệp cấu hình để phát triển cục bộ và các đường ống CI trỏ đến cơ sở dữ liệu phù hợp mà không cần thay đổi mã.
Tích hợp các bài kiểm tra vào quy trình CI/CD
Thêm bước kiểm thử sau khi xây dựng và triển khai để kiểm thử chạy tự động trên mỗi lần chuyển đổi. Trong Azure DevOps, hãy sử dụng tác VSTest vụ:
- task: VSTest@2
inputs:
testAssembly: '**\*Tests.dll'
searchFolder: '$(System.DefaultWorkingDirectory)'
Trong GitHub Actions, hãy chạy các bài kiểm tra bằng cách sử dụng dotnet test:
- name: Run database unit tests
run: dotnet test ./DatabaseTests/DatabaseTests.csproj
Mẹo
Cấu hình dự án thử nghiệm để tự động triển khai dự án cơ sở dữ liệu trước khi chạy thử nghiệm. Cài đặt này đảm bảo rằng lược đồ cơ sở dữ liệu thử nghiệm khớp với dự án tại thời điểm thử nghiệm.
Khi thử nghiệm không thành công, quy trình sẽ dừng lại và thay đổi không đạt đến giai đoạn hoặc sản xuất. Sự chậm trễ này giúp nhóm có thời gian khắc phục sự cố trước khi nó ảnh hưởng đến bất kỳ môi trường nào.
Khóa takeaways
Kiểm thử cơ sở dữ liệu trải dài ba cấp độ: xác thực xây dựng tính đúng đắn của cấu trúc, kiểm tra đơn vị để xác minh logic và kiểm tra tích hợp cho quy trình làm việc từ đầu đến cuối. Kiểm thử đơn vị SQL Server tuân theo cấu trúc ba giai đoạn của phản ứng kiểm thử, hành động kiểm thử và hành động sau kiểm thử. Để xác minh hành vi của thủ tục và chức năng được lưu trữ, hãy sử dụng các điều kiện kiểm tra như Scalar Value, Row Count, và Expected Schema. Để kiểm tra các phương thức sẽ xác thực đường dẫn xử lý lỗi, hãy thêm thuộc tính này ExpectedSqlException . Kết nối các dự án kiểm tra vào quy trình CI/CD của bạn để kiểm tra không thành công sẽ chặn việc triển khai trước khi các thay đổi đến giai đoạn hoặc sản xuất. Ba lớp này cùng nhau tạo thành một mạng lưới an toàn cho phép nhóm của bạn tự tin triển khai các thay đổi cơ sở dữ liệu thay vì lo lắng.