
orlangure/gnomockGnomock是一个集成和端到端测试工具包。它使用Docker创建临时容器来模拟应用依赖,设置它们的初始状态,并在测试结束时自动清理。Gnomock允许在可能的情况下使用真实服务而非mock进行代码测试。
Gnomock的优势在于其丰富的预设(Presets),每个预设针对特定的数据库、服务或工具,提供简单的初始状态设置方式:如创建SQL模式、上传测试数据到S3、向Splunk发送测试事件等。
名称“Gnomock”代表“no mock”,首字母“G”代表“Go”😼。它的发音也类似“gnome”(地精),因此有友好的花园地精图标(由Michael Zolotov设计)。
bashgo get github.com/orlangure/gnomock
goimport ( "database/sql" "fmt" _ "github.com/lib/pq" // PostgreSQL驱动 "github.com/orlangure/gnomock" "github.com/orlangure/gnomock/preset/postgres" ) // 创建PostgreSQL预设 p := postgres.Preset( postgres.WithUser("gnomock", "gnomick"), // 用户名和密码 postgres.WithDatabase("mydb"), // 数据库名称 postgres.WithQueriesFile("/var/project/db/schema.sql"), // 执行SQL脚本设置初始状态 ) // 启动容器 container, err := gnomock.Start(p) if err != nil { // 处理错误 } defer func() { _ = gnomock.Stop(container) }() // 测试结束后停止容器 // 连接到PostgreSQL容器 connStr := fmt.Sprintf( "host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", container.Host, container.DefaultPort(), "gnomock", "gnomick", "mydb", ) db, err := sql.Open("postgres", connStr) if err != nil { // 处理错误 } // db已包含所需的模式和数据,可直接使用
通过HTTP daemon使用Gnomock,需先启动Gnomock服务:
bashdocker run -d -p 2304:2304 -v /var/run/docker.sock:/var/run/docker.sock --name gnomockd orlangure/gnomock
bashcurl -X POST http://localhost:2304/start/postgres \ -H "Content-Type: application/json" \ -d '{ "user": "gnomock", "password": "gnomick", "database": "mydb", "queries_file": "/var/project/db/schema.sql" }'
响应将包含容器信息(主机、端口等),用于连接服务。
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 |
本地测试时若网络速度不足以拉取Docker镜像可能导致此问题。可手动拉取所需镜像:
bashdocker pull postgres:11 # 例如拉取PostgreSQL 11镜像
容器可能无法在超时前就绪。Gnomock默认超时较长,若使用WithTimeout(HTTP中为timeout)修改超时,可能设置过短。
同时启动过多容器可能导致系统(尤其是CI环境)负载过高,容器无法在超时前就绪。建议分批运行测试。
通过Gnomock服务运行时,需确保设置中使用的文件挂载到容器内。启动服务时挂载工作目录:
bashdocker run -d -p 2304:2304 -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):$(pwd) --name gnomockd orlangure/gnomock
这样本地文件可在容器内访问。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务