4 điểm bởi GN⁺ 2024-04-08 | 1 bình luận | Chia sẻ qua WhatsApp

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

 
GN⁺ 2024-04-08
Ý kiến trên Hacker News
  • Giới thiệu pgmock

    • Một lập trình viên đã phát triển một phiên bản Postgres chạy trong bộ nhớ trong vài tháng.
    • Phiên bản này tương đương về mặt chức năng với cơ sở dữ liệu hiện có.
    • Không cần tiến trình ngoài hay proxy, và chạy được trên các nền tảng có thể thực thi WASM (Node.js, trình duyệt, v.v.).
    • Có thể tạo cơ sở dữ liệu mới và dữ liệu giả lập dễ như tạo một đối tượng JavaScript.
    • Khác với pglite, pgmock chạy một trình giả lập x86 có nhúng Postgres gốc bên trong. pglite biên dịch trực tiếp một bản fork của Postgres sang WASM nên nhanh và nhẹ hơn, nhưng chỉ hỗ trợ chế độ một người dùng và một vài tính năng mở rộng, nên không thể kết nối bằng client Postgres thông thường.
    • Về mặt lý thuyết, có thể chỉnh sửa để bất kỳ image Docker nào cũng chạy được trên nền tảng WebAssembly.
  • Câu hỏi về việc chạy Postgres trên RAM disk

    • Có người đề nghị giải thích lợi ích so với việc chạy Postgres trên RAM disk, chẳng hạn khả năng chạy trong môi trường trình duyệt/Node và có thể được tạo/cập nhật/xóa bởi các bài test.
  • Chia sẻ kinh nghiệm dùng server trong bộ nhớ thay cho server thật

    • Trước đây từng dùng nhiều server giả lập trong bộ nhớ khác nhau (và tùy biến) cho việc test, nhưng hiện tại dùng Testcontainers để chạy dịch vụ thật.
  • Câu hỏi về quyền sở hữu trí tuệ của dự án

    • Có ý kiến thắc mắc liệu cách nói "tôi làm ở chỗ làm" trong tiêu đề có nghĩa quyền sở hữu trí tuệ thuộc về người sử dụng lao động hay không, và nếu dùng tài nguyên của công ty thì có được phép công khai mã nguồn mở hay không.
  • Lời khuyên về việc sao chép môi trường phát triển

    • Khuyến nghị dump dữ liệu production, loại bỏ dữ liệu nhạy cảm, và tinh gọn các bảng không cần thiết như bảng log để tạo ra một bản sao cho phát triển. Bằng cách sao chép nó cho dev, QA, E2E, v.v., có thể đảm bảo có đủ extension, trigger, function, view, index và dữ liệu cần thiết cho kiểm thử E2E.
  • Câu hỏi về bối cảnh phát triển pgmock và tích hợp CI

    • Có người hỏi động lực nào khiến dự án này được phát triển, và liệu việc chạy Postgres trong container Docker có quá chậm hay không.
    • Cũng có yêu cầu mô tả cấu hình CI và luồng test E2E trước và sau khi tích hợp pgmock.
    • Ngoài ra còn hỏi việc chuyển sang giải pháp này có khó khăn không.
  • Câu hỏi so sánh với cơ sở dữ liệu H2

    • Có câu hỏi so sánh cơ sở dữ liệu H2 ở chế độ tương thích Postgres với pgmock.
  • Chia sẻ kinh nghiệm dùng pgmem

    • Có người chia sẻ đã dùng pgmem cho mục đích tương tự trong vài năm qua.
  • Câu hỏi về hỗ trợ ORM

    • Có người hỏi liệu có thể dùng các ORM như Sequelize, Prisma, Drizzle cho việc test hay không.
  • Câu hỏi về khả năng sử dụng với Prisma client

    • Có câu hỏi về cách sử dụng cùng với Prisma client.