Engine
Engine là nơi duy nhất db-test biết đến một sản phẩm cơ sở dữ liệu. Code test không bao giờ nhắc đến nó: engine nằm sau abstract class DbEngine.
Các engine có sẵn
Phần tiêu đề “Các engine có sẵn”| SQL Server | PostgreSQL | MySQL | |
|---|---|---|---|
| Package | DbTest.MsSql |
DbTest.PostgreSql |
DbTest.MySql |
| Class | MsSqlEngine |
PostgreSqlEngine |
MySqlEngine |
| Namespace | DbTest.MsSql |
DbTest.PostgreSql |
DbTest.MySql |
| Tên (CLI, báo cáo) | mssql |
postgres |
mysql |
| Image mặc định | mcr.microsoft.com/mssql/server:2022-latest |
postgres:16-alpine |
mysql:8.4 |
| Tài khoản đăng nhập | luôn là sa |
dbtest |
dbtest |
Mỗi engine cũng cung cấp image của nó dưới dạng hằng số: MsSqlEngine.DefaultContainerImage, PostgreSqlEngine.DefaultContainerImage và MySqlEngine.DefaultContainerImage.
protected override DbEngine CreateEngine() => new MsSqlEngine();protected override DbEngine CreateEngine() => new PostgreSqlEngine();protected override DbEngine CreateEngine() => new MySqlEngine();Tùy chọn container
Phần tiêu đề “Tùy chọn container”Override ContainerOptions trong class DbTestBase, hoặc truyền một DbContainerOptions vào DbTestHarness.StartAsync. Mọi property đều có giá trị mặc định, nên null nghĩa là dùng mặc định của engine.
| Property | Mặc định | Ý nghĩa |
|---|---|---|
Image |
DefaultImage của engine |
Container image. |
Database |
dbtest |
Tên database được tạo bên trong container. |
Username |
của riêng engine | Tài khoản đăng nhập bên trong container. |
Password |
của riêng engine | Mật khẩu bên trong container. |
StartupTimeout |
3 phút | Thời gian chờ container sẵn sàng nhận kết nối. |
Environment |
rỗng | Các biến môi trường bổ sung truyền vào container. |
[TestClass]public sealed class PostgresCustomerTests : CustomerTests{ protected override DbEngine CreateEngine() => new PostgreSqlEngine(); protected override string SchemaRoot => "Schema/postgres";
protected override DbContainerOptions? ContainerOptions => new() { Image = "postgres:17-alpine", };}Các test class chỉ dùng chung một container khi mọi thứ định danh nó đều giống nhau: engine, image, database, tài khoản, mật khẩu, environment và schema. Class có container options khác sẽ có container riêng.
Command timeout
Phần tiêu đề “Command timeout”Mọi command mà engine chạy đều chịu CommandTimeout của engine, mặc định là hai phút. Đây là một virtual property của DbEngine.
Các engine khác nhau ở đâu
Phần tiêu đề “Các engine khác nhau ở đâu”Ba cơ sở dữ liệu này khác nhau ở hầu hết mọi thứ, và trước đây mỗi điểm khác biệt là một trường hợp đặc biệt trong code test. db-test xử lý chúng bên trong engine.
| Vấn đề | SQL Server | PostgreSQL | MySQL |
|---|---|---|---|
| Ký hiệu ngăn batch | GO |
không có | DELIMITER |
| Thân function | CREATE PROCEDURE |
$$ ... $$ |
BEGIN ... END |
| Làm trống một table | TRUNCATE, hoặc DELETE khi đã tắt constraint nếu có foreign key trỏ tới |
TRUNCATE ... RESTART IDENTITY CASCADE |
TRUNCATE khi tắt FOREIGN_KEY_CHECKS |
| Đọc danh sách object | sys.objects, sys.columns |
pg_class, pg_attribute, pg_proc |
information_schema |
Cách tách file schema được trình bày trong schema, và cách làm trống table trong dọn dữ liệu.
Cần một cơ sở dữ liệu khác? Viết một engine.