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

db-test

db-test là thư viện .NET cho kiểm thử tích hợp cơ sở dữ liệu. Bạn viết test body một lần và chạy nó trên SQL Server, PostgreSQL và MySQL.

Mỗi lần chạy có một database container dùng một lần. Không có gì chạm vào database dùng chung, staging hay production.

Các test nằm trong một abstract class. Không có tên engine nào xuất hiện trong đó.

public abstract class CustomerTests : DbTestBase
{
[TestMethod]
public async Task Inserted_Customer_Should_Be_Counted()
{
await Harness.CleanAsync();
await Harness.ExecuteAsync(
"INSERT INTO customers (email, display_name) VALUES (@email, @name)",
[new DbParameterValue("@email", "ada@example.test"), new DbParameterValue("@name", "Ada")]);
var count = await Harness.QueryScalarAsync<int>(
"SELECT COUNT(*) FROM customers WHERE email = @email",
[new DbParameterValue("@email", "ada@example.test")]);
Assert.AreEqual(1, count);
}
}

Mỗi engine có một class nhỏ cho biết dùng engine nào và schema nằm ở đâu:

[TestClass]
public sealed class MsSqlCustomerTests : CustomerTests
{
protected override DbEngine CreateEngine() => new MsSqlEngine();
protected override string SchemaRoot => "Schema/mssql";
}

Hướng dẫn bắt đầu nhanh xây dựng ví dụ này từng bước.

Bộ kiểm thử cơ sở dữ liệu nào cũng phải giải quyết cùng một nhóm vấn đề, và hầu hết các team tự giải quyết bằng tay.

Vấn đề db-test làm gì
Database cho test lấy từ đâu? Một container dùng một lần cho mỗi engine, khởi động ở lần dùng đầu tiên và dùng chung trong cả lần chạy.
Schema được đưa vào bằng cách nào? Các file schema trên đĩa, áp dụng theo thứ tự, với quy tắc tách script riêng của từng engine.
Một test xóa một cột và test sau đó lỗi vì cột ấy Shape guard (bộ canh hình dạng schema) làm fail đúng test gây ra thay đổi, kèm tên object và thay đổi đó.
Dữ liệu của test này rò sang test sau CleanAsync() làm trống mọi table bất kể foreign key, và đặt lại bộ đếm identity.
“Bộ test chạy chậm” Thời gian chạy từng test trong file TSV (DBTEST_TIMING=1).
Cùng một assertion phải viết ba lần Engine nằm sau một abstract class duy nhất.
Package Mục đích
DbTest.Core Harness không phụ thuộc engine, không gắn với framework test nào.
DbTest.MSTest DbTestBase và DbTestRun cho MSTest. Kéo theo DbTest.Core.
DbTest.MsSql Engine SQL Server.
DbTest.PostgreSql Engine PostgreSQL.
DbTest.MySql Engine MySQL.
DbTest.MsSql.Dacpac Deploy một .dacpac của SQL Server làm schema.
DbTest.Cli Công cụ dòng lệnh dbtest.