【Hacker News搬运】显示HN:我开源了我在工作中为E2E测试构建的内存中PostgreSQL
-
Title: Show HN: I open-sourced the in-memory PostgreSQL I built at work for E2E tests
显示HN:我开源了我在工作中为E2E测试构建的内存中PostgreSQL
Text:
Url: https://github.com/stackframe-projects/pgmock
标题:GitHub - stackframe-projects/pgmock:用于单元/E2E测试的内存Postgres模拟服务器 作者:stackframe-projects 发布日期:未提供 顶部图片链接:未提供 文本: pgmock 是一个用于单元和E2E测试的内存PostgreSQL模拟服务器,它不需要任何外部依赖,并且在Node.js和浏览器中都完全运行在WebAssembly中。 如果你想在浏览器中运行pgmock,请参阅浏览器支持部分以获取详细说明。 你可以像这样运行内存中的服务器: import { PostgresMock } from "pgmock"; const mock = await PostgresMock.create(); const connectionString = await mock.listen(5432); 建议:如果你使用node-postgres(在npm上的pg),pgmock为你提供了一个不需要在端口上服务的配置对象(在浏览器中也有效): 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!'])); 在完成使用模拟服务器后,被认为是好习惯来摧毁它以释放资源: 查看PostgresMock源文件,获取所有可用方法及其文档的列表。 pgmock完全支持浏览器环境。虽然webapp不能监听TCP端口,你仍然可以使用PostgresMock.createSocket和node-postgres配置。然而,如果你的打包器静态分析导入,默认配置可能会显示警告,因为缺少(可选)Node.js模块。查看examples/web-demo/next.config.mjs以了解如何为打包配置Webpack的示例。 如果你只是想在浏览器中运行数据库,你可能想要考虑pglite。它性能更好且更轻量级,但只有有限的功能集。pgmock旨在与生产PostgreSQL环境具有相同的功能,正如你希望在测试环境中一样。 在WebAssembly中运行Postgres有两种方法;通过分支支持WASM的Native或者在x86模拟器中模拟Postgres服务器。前者性能更高且使用内存更少,但只支持单用户模式(无连接),并且不支持扩展。 为了防止测试与生产之间的差异,并且因为性能通常不是测试关心的焦点,pgmock目前使用后一种方法。在中期未来,一旦原生Postgres WASM分支成熟,我们计划提供两个选项,最终切换到原生WASM作为默认选项。我们预计除了PostgresMock.subtle内部的API之外,不会有太多 breaking changes。 pgmock与之前的在浏览器中运行Postgres的项目不同,它完全在JavaScript运行时内部提供完全的功能兼容,而不依赖于网络代理进行通信。我们通过在JavaScript中模拟一个行为像真实网络的网络栈来实现这一点,甚至可以在不支持原始socket访问的平台上来模拟TCP连接。 太好了!我们有Discord服务器可以和你聊天。 这个可以运行其他Docker镜像或数据库吗? 理论上,是的。我只是还没有测试过。如果你感兴趣,请在我们的Discord服务器上ping我。 v86,使这成为可能的x86模拟器 Supabase & Snaplet 用于构建他们自己的在WebAssembly中运行Postgres的方法,这个是基于他们的 Stackframe 为了在我建造pgmock时养活我
Post by: n2d4
Comments:
n2d4: Hey HN! For a few months, I've been building an in-memory version of Postgres at work. It has full feature parity with production databases.<p>The cool thing about it is that you don't need any external processes or proxies. If your platform can run WASM (Node.js, browser, etc.), it can probably run pgmock. Creating a new database with mock data is as simple as creating a JavaScript object.<p>It's a bit different from the amazing pglite [1] (which inspired me to open-source pgmock in the first place). pgmock runs an x86 emulator with the original Postgres inside, while pglite compiles a Postgres fork to native WASM directly and is hence much faster and more lightweight. However, it only supports single-user mode and a select few extensions, so you can't connect to it with normal Postgres clients (which is quite crucial for E2E testing).<p>Theoretically, it could be modified to run any Docker image on WebAssembly platforms. Anything specific you'd like to see?<p>Happy hacking!<p>[1] <a href="https://github.com/electric-sql/pglite">https://github.com/electric-sql/pglite</a>
n2d4: 嗨,HN!在几个月的时间里;我一直在工作中构建Postgres的内存版本。它与生产数据库具有完全的功能<p> 它的酷之处在于;不需要任何外部流程或代理。如果您的平台可以运行WASM(Node.js、浏览器等),那么它可能可以运行pgmock。使用模拟数据创建一个新数据库就像创建一个JavaScript对象一样简单<p> 它;这与令人惊叹的pglite[1]有点不同(它首先启发了我开源pgmock)。pgmock运行一个x86模拟器,里面有原始的Postgres,而pglite直接将Postgres fork编译到本地WASM,因此速度更快、重量更轻。然而,它只支持单用户模式和选择的几个扩展,因此您可以;t使用普通的Postgres客户端连接到它(这对E2E测试非常关键)<p> 理论上,它可以被修改为在WebAssembly平台上运行任何Docker映像。任何特定的你;I’我想看看吗<p> 黑客快乐<p> [1]<a href=“https://;/;github.com#xx2F;electrical sql#xx2F!pglite”>https:///;github.com/;electrical sql/;pglite</a>
rsyring: Why not just run Postgres with it's files on a ramdisk?<p>Update: this can apparently run in a browser/Node environment so can be created/updated/destroyed by the tests. I guess I'm too much of a backend dev to understand the advantage over a more typical dev setup. Can someone elaborate on where/when/how this is better?
rsyring: 为什么不直接用它运行Postgres;ramdisk上的文件<p> 更新:这显然可以在浏览器中运行;节点环境因此可以被创建;更新了;被测试破坏。我想我;我太喜欢后端开发了,无法理解与更典型的开发设置相比的优势。有人能详细说明在哪里;当;这怎么会更好?
rickette: I used to run all kinds of (custom) fake in-memory servers in my tests. Nowadays I just run the real thing using Testcontainers (<a href="https://testcontainers.com" rel="nofollow">https://testcontainers.com</a>)
rickette: 我曾经在测试中运行各种(自定义)假内存服务器。现在,我只使用Testcontainers运行真实的东西(<a href=“https://;/;Testcontainers.com”rel=“nofollow”>https://;#x2F;Testcontainers.com</a>)
tumidpandora: Off-topic, but the title confused me a bit - "...I built at work." Doesn't this imply that the intellectual property for this project belongs to your employer, assuming you used resources from work? If so, are you technically allowed to open-source it?
tumidpandora: 离题了,但标题有点让我困惑——“;。。。我是在工作中建造的;不;这难道不意味着,假设你使用了工作中的资源,这个项目的知识产权属于你的雇主吗?如果是的话,从技术上讲,你可以开源吗?
segmondy: Dump your prod data, scrub all the sensitive data, truncate all the unneeded tables like your log tables. You have a good dev copy, replicate for dev ,qa, e2e, etc. Those extensions, triggers, functions, views, indexes, data are what you need for e2e.
segmondy: 转储生产数据,清除所有敏感数据,截断所有不需要的表,如日志表。您有一个很好的dev副本,用于dev、qa、e2e等的复制。这些扩展、触发器、函数、视图、索引和数据都是e2e所需要的。