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

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.

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();

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.

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.

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.