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.
Một test trông như thế nào
Phần tiêu đề “Một test trông như thế nào”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";}[TestClass]public sealed class PostgresCustomerTests : CustomerTests{ protected override DbEngine CreateEngine() => new PostgreSqlEngine(); protected override string SchemaRoot => "Schema/postgres";}[TestClass]public sealed class MySqlCustomerTests : CustomerTests{ protected override DbEngine CreateEngine() => new MySqlEngine(); protected override string SchemaRoot => "Schema/mysql";}Hướng dẫn bắt đầu nhanh xây dựng ví dụ này từng bước.
Vì sao cần db-test
Phần tiêu đề “Vì sao cần db-test”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. |
Các package
Phần tiêu đề “Các package”| 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. |
Đọc tiếp
Phần tiêu đề “Đọc tiếp”- Bắt đầu nhanh: cài đặt, yêu cầu và test đầu tiên.
- Engine: mỗi engine chạy gì và cách cấu hình container của nó.
- Schema: cách các file SQL được tìm thấy, sắp thứ tự và áp dụng.
- Database project của SQL Server: kiểm thử một
.sqlprojthông qua.dacpac. - Mở rộng db-test: viết engine hoặc nguồn schema của riêng bạn.