
orlangure/gnomock-cleaner🏗️ 快速搭建完整依赖栈
🎁 轻松设置依赖初始状态
🏭 基于接近生产环境的真实软件进行测试
⏳ 无需花费时间编写模拟代码
🕹️ 测试实际程序行为和副作用
Gnomock 是一个集成和端到端测试工具包。它使用 Docker 创建临时容器来运行应用依赖,设置其初始状态,并在测试结束后自动清理。Gnomock 允许在可能的情况下使用无模拟方式测试代码。
Gnomock 的强大之处在于其丰富的预设,每个预设针对特定数据库、服务或工具实现集成。每个预设都提供了简便的初始状态设置方式:创建 SQL schema、向 S3 上传测试数据、向 Splunk 发送测试事件等。
"Gnomock" 名称代表 "no mock"(无模拟),前缀 "G" 代表 "Go" 😼。同时它发音类似 "gnome"(地精),因此采用了友好的花园地精形象(由 Michael Zolotov 设计)。
亲自体验使用临时 Docker 容器中的真实服务编写测试是多么简单快捷:
 p := postgres.Preset( postgres.WithUser("gnomock", "gnomick"), postgres.WithDatabase("mydb"), postgres.WithQueriesFile("/var/project/db/schema.sql"), ) container, _ := gnomock.Start(p) defer func() { _ = gnomock.Stop(container) }() connStr := fmt.Sprintf( "host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", container.Host, container.DefaultPort(), "gnomock", "gnomick", "mydb", ) db, _ := sql.Open("postgres", connStr) // db 已包含所需的 schema 和数据,可直接使用
查看包参考文档。有关预设文档,请参阅预设部分。
如果使用 Go,请参考在 Go 应用中使用 Gnomock部分。其他语言请参考文档。
Gnomock 的强大之处在于预设。以下是现有预设及其支持*版本列表。
* 支持的版本会作为 CI 流水线的一部分进行测试。其他版本可能也能工作。
| 预设 | Go 包 | HTTP API | Go API | 支持版本 |
|---|---|---|---|---|
| Localstack (AWS) | Go 包 | 文档 | 参考 | 0.12.2 |
| Splunk | Go 包 | 文档 | 参考 | 8.0.2 |
| Redis | Go 包 | 文档 | 参考 | 5.0.10, 6.0.9 |
| Memcached | Go 包 | 文档 | 参考 | 1.6.9 |
| MySQL | Go 包 | 文档 | 参考 | 5.7.32, 8.0.22 |
| MariaDB | Go 包 | 文档 | 参考 | 10.5.8 |
| PostgreSQL | Go 包 | 文档 | 参考 | 10.15, 11.10, 12.5, 13.1 |
| Microsoft SQL Server | Go 包 | 文档 | 参考 | 2017-latest, 2019-latest |
| MongoDB | Go 包 | 文档 | 参考 | 3.6.21, 4.4 |
| RabbitMQ | Go 包 | 文档 | 参考 | 3.8.9-alpine, 3.8.9-management-alpine |
| Kafka | Go 包 | 文档 | 参考 | 2.5.1-L0 |
| Elasticsearch | Go 包 | 文档 | 参考 | 5.6, 6.8.13, 7.9.3 |
| Kubernetes | Go 包 | 文档 | 参考 | v1.19.12 |
| CockroachDB | Go 包 | 文档 | 参考 | v19.2.11, v20.1.10 |
| InfluxDB | Go 包 | 文档 | 参考 | 2.0.4-alpine |
可以直接从 Go 代码使用 Gnomock 而无需任何预设。HTTP API 仅允许使用本仓库中存在的预设来设置容器。
Gnomock 并非唯一旨在通过临时 Docker 容器简化集成和端到端测试的项目:
testcontainers/testcontainers-goory/dockertest这些项目非常出色,为用户提供了极大的灵活性和功能。它们能实现许多 Gnomock 无法实现的功能。但以下是 Gnomock 有时具有优势的地方:
如果您的网络不够快,无法拉取测试中使用的 Docker 镜像,本地运行时经常会发生这种情况。在 CI(如 Github Actions)中,镜像下载速度非常快。要解决本地此问题,请在运行测试前手动拉取镜像。只需执行一次,镜像会保留在本地缓存中直到删除。例如,要拉取 Postgres 11 镜像:
bashdocker pull postgres:11
这可能是因为容器在超时前无法准备就绪。默认情况下,Gnomock 对新容器使用相当高的超时(启动和设置)。如果您使用 WithTimeout(HTTP 中的 timeout)更改默认超时,可能设置的值过短。
当同时启动大量容器时会发生这种情况。系统(尤其是 Github Actions 等 CI 环境)无法处理负载,容器在超时前无法变为健康状态。因此 Gnomock 有多个独立构建任务,每个任务只运行一小部分测试,一次一个包。
如果以服务器模式运行 gnomock,需要确保设置中使用的文件在 gnomock 容器内可用。使用 docker run 的 -v $(pwd):$(pwd) 参数将当前工作目录挂载到 gnomock 容器内的相同路径。如果希望永久运行 gnomock 容器,可以挂载整个 $HOME 目录(或存放代码的任何其他目录)。




manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务