Demo pgmock — Discord
pgmock là máy chủ mô phỏng PostgreSQL chạy trong bộ nhớ dành cho kiểm thử đơn vị và E2E.
- Không có phụ thuộc bên ngoài và chạy hoàn toàn trong WebAssembly trên cả Node.js lẫn trình duyệt.
Cài đặt
- Có thể cài đặt bằng lệnh
npm install pgmock.
- Nếu muốn chạy
pgmock trong trình duyệt, hãy tham khảo phần hỗ trợ trình duyệt để biết hướng dẫn chi tiết.
Bắt đầu
- Có thể khởi chạy máy chủ trong bộ nhớ như sau:
import { PostgresMock } from "pgmock";
const mock = await PostgresMock.create();
const connectionString = await mock.listen(5432);
- Nếu sử dụng
node-postgres (pg trên npm), nó cung cấp một đối tượng cấu hình hoạt động cả trong trình duyệt mà không cần dùng cổng:
import * as pg from "pg";
const mock = await PostgresMock.create();
const client = new pg.Client(mock.getNodePostgresConfig());
await client.connect();
console.log(await client.query('SELECT $1::text as message', ['Hello world!']));
- Sau khi dùng xong, nên hủy máy chủ mô phỏng để giải phóng tài nguyên:
mock.destroy();
Tài liệu
- Để xem danh sách tất cả các phương thức khả dụng và tài liệu của chúng, hãy kiểm tra tệp mã nguồn PostgresMock.
Hỗ trợ trình duyệt
pgmock hỗ trợ đầy đủ môi trường trình duyệt.
- Ứng dụng web không thể lắng nghe các cổng TCP, nhưng có thể dùng
PostgresMock.createSocket và cấu hình node-postgres.
- Nếu bundler phân tích các lệnh import tĩnh, cấu hình mặc định có thể hiện cảnh báo do thiếu các mô-đun Node.js (tùy chọn).
- Nếu chỉ muốn chạy cơ sở dữ liệu trong trình duyệt, có thể cân nhắc
pglite, nhưng nó bị hạn chế về tính năng.
pgmock được thiết kế với mục tiêu tương đương về mặt chức năng với môi trường PostgreSQL production mà bạn mong muốn trong môi trường kiểm thử.
Cách hoạt động
- Có hai cách tiếp cận để chạy Postgres trong WebAssembly: fork để hỗ trợ WASM nguyên bản hoặc mô phỏng máy chủ Postgres trong trình giả lập x86.
- Cách thứ nhất có hiệu năng tốt hơn và dùng ít bộ nhớ hơn, nhưng không hỗ trợ chế độ một người dùng (không có kết nối) và các tính năng mở rộng.
- Để tránh khác biệt giữa kiểm thử và production, và vì hiệu năng không phải mối quan tâm chính trong kiểm thử,
pgmock hiện dùng cách tiếp cận thứ hai.
- Trong trung hạn, khi nhánh Postgres WASM nguyên bản trưởng thành hơn, kế hoạch là cung cấp cả hai tùy chọn và cuối cùng mặc định chuyển sang WASM nguyên bản.
- Ngoại trừ API trong
PostgresMock.subtle, dự kiến sẽ không có nhiều thay đổi lớn.
pgmock mô phỏng một ngăn xếp mạng trong JavaScript hoạt động giống mạng thực, từ đó có thể mô phỏng kết nối TCP ngay cả trên các nền tảng không cho phép truy cập socket thô, mang lại khả năng tương thích đầy đủ về chức năng hoàn toàn bên trong runtime JavaScript mà không phụ thuộc vào proxy mạng.
Muốn đóng góp?
- Bạn có thể trò chuyện với chúng tôi trên máy chủ Discord.
Có thể chạy image Docker hoặc cơ sở dữ liệu khác không?
- Về lý thuyết là có thể. Nếu quan tâm, hãy liên hệ trên máy chủ Discord.
Lời cảm ơn
- Cảm ơn v86, trình giả lập x86 đã giúp điều này trở thành hiện thực.
- Cảm ơn Supabase & Snaplet vì đã xây dựng cách tiếp cận riêng để chạy Postgres trong WebAssembly.
- Cảm ơn Stackframe vì đã trả lương trong thời gian xây dựng
pgmock.
Ý kiến của GN⁺
pgmock là công cụ hữu ích khi các nhà phát triển kiểm thử tương tác với cơ sở dữ liệu PostgreSQL. Không cần phải thiết lập và quản lý máy chủ cơ sở dữ liệu thực mà vẫn có thể xác minh phần tương tác cơ sở dữ liệu trong mã.
- Những công cụ như vậy rất hữu ích trong phát triển hướng kiểm thử (TDD) hoặc môi trường tích hợp liên tục (CI). Các nhà phát triển có thể chạy kiểm thử nhanh và lập tức xác nhận tác động của thay đổi mã.
pgmock sử dụng WebAssembly để hoạt động trong cả trình duyệt và Node.js, nên mang lại khả năng tương thích với nhiều môi trường phát triển khác nhau. Điều này đem lại lợi ích cho cả lập trình viên frontend lẫn backend.
- Tuy vậy, vẫn còn câu hỏi liệu
pgmock có thể mô phỏng hoàn toàn mọi tính năng của máy chủ PostgreSQL thực hay không, đặc biệt về hiệu năng và khả năng mở rộng. Sự khác biệt với môi trường cơ sở dữ liệu thực có thể ảnh hưởng đến kết quả kiểm thử.
- Các dự án khác cung cấp tính năng tương tự bao gồm Testcontainers, H2 Database, mỗi dự án lần lượt cung cấp kiểm thử tích hợp dùng container Docker và cơ sở dữ liệu in-memory cho ứng dụng Java.
1 bình luận
Ý kiến trên Hacker News
Giới thiệu pgmock
Câu hỏi về việc chạy Postgres trên RAM disk
Chia sẻ kinh nghiệm dùng server trong bộ nhớ thay cho server thật
Câu hỏi về quyền sở hữu trí tuệ của dự án
Lời khuyên về việc sao chép môi trường phát triển
Câu hỏi về bối cảnh phát triển pgmock và tích hợp CI
Câu hỏi so sánh với cơ sở dữ liệu H2
Chia sẻ kinh nghiệm dùng pgmem
Câu hỏi về hỗ trợ ORM
Câu hỏi về khả năng sử dụng với Prisma client