Bỏ qua để đến nội dung

Shape guard

Container dùng chung nghĩa là schema dùng chung. Một test xóa hoặc đổi kiểu một table sẽ khiến test kế tiếp fail vì lý do sai, và lỗi chỉ vào nạn nhân chứ không phải thủ phạm.

Shape guard (bộ canh hình dạng schema) sửa việc đổ lỗi này.

Guard chụp snapshot mọi table, view và routine sau khi schema được áp dụng. DbTestBase đọc lại chúng sau mỗi test, và làm fail test đã thay đổi một object.

Assert.Fail failed. The test left a shared database object reshaped. Restore it before the
test ends (the shape guard compares against the schema as applied):
[ShapeGuard] CustomerTests.Adds_A_Column left dbo.customers columns changed (id,email) -> (id,email,probe)

Việc kiểm tra chạy sau test, và sau mọi [TestCleanup] của class kế thừa bạn viết, nên test tự dọn dẹp sau khi chạy vẫn pass.

Với mỗi object trong snapshot, guard báo một trong các thay đổi:

Thay đổi Thông báo
Object đã biến mất dropped
Loại object đổi, ví dụ table trở thành view re-typed (Table -> View)
Các cột đổi, về tên hoặc thứ tự columns changed (before) -> (after)

Object do test tự tạo không được theo dõi, chỉ theo dõi schema như lúc đã áp dụng.

Thủ phạm chỉ bị đổ lỗi một lần. Các test sau nó không bị, vì chúng chỉ thừa hưởng hậu quả.

Một object đã được trả về như cũ sẽ bị quên, nên test tiếp theo làm hỏng nó sẽ lại bị đổ lỗi.

Việc tự sửa âm thầm sẽ che mất sự rò rỉ ở lần chạy sau, mà lần chạy sau lại đúng là lúc bạn muốn thấy nó. Guard nêu tên object và test, còn việc sửa là của bạn.

Nếu chỉ muốn ghi log sự rò rỉ, override FailOnShapeLeak. Khi đó báo cáo được ghi vào test output và test vẫn pass:

protected override bool FailOnShapeLeak => false;

Tự gọi việc kiểm tra trên một harness:

var leaks = await harness.CheckShapeAsync("CustomerTests.Adds_A_Column");

Nó trả về các leak lần đầu được phát hiện bởi lần kiểm tra này, và một danh sách rỗng khi schema còn nguyên vẹn. Harness cũng cung cấp chính guard qua harness.Guard.