内容简介:本篇文章主要讲解如何在 Docker 中进行 Go 单元测试,依赖 Docker 和 Go Modules。在 Docker 之前我们往往需要在 jenkins 服务器上配置不同的 Go 版本以及针对每个项目配置 GOPATH, 项目之间的隔离性很差,经常出现基础库版本冲突的问题。有了 Docker,我们可以在不同容器中运行单元测试,该测试不局限不同项目,甚至可以是同一项目不同分支。
本篇文章主要讲解如何在 Docker 中进行 Go 单元测试,依赖 Docker 和 Go Modules。
为什么是 Docker
在 Docker 之前我们往往需要在 jenkins 服务器上配置不同的 Go 版本以及针对每个项目配置 GOPATH, 项目之间的隔离性很差,经常出现基础库版本冲突的问题。
有了 Docker,我们可以在不同容器中运行单元测试,该测试不局限不同项目,甚至可以是同一项目不同分支。
所以是在测试隔离性和项目测试并发度上都有很大提升,而且当测试结束后,环境清理也简单很多。
为什么是 Go Modules
Go Modules 作为官方默认的包依赖管理工具,基本解决了 Go 长期存在的包管理问题,它为我们的项目管理带来很多好处:
- 自动解析和添加依赖
- 签名验证
- 依赖缓存
- 支持相对路径依赖
- 支持依赖一键打包,方便在离线环境下运行程序
实际例子
这里有一个简单例子,来自 Gin Testing Example ,项目目录结构为:
$ tree . . ├── go.mod ├── go.sum ├── main.go └── main_test.go 0 directories, 4 files
main.go 内容:
package main
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
return r
}
func main() {
r := setupRouter()
r.Run(":8080")
}
main_test.go 内容:
package main
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
func TestPingRoute(t *testing.T) {
router := setupRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/ping", nil)
router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code)
assert.Equal(t, "pong", w.Body.String())
}
我们尝试在主机执行 go test ./...
,测试可以通过,下面我们想办法在 Docker 中进行测试。
Docker 运行测试
步骤1: 对项目依赖进行打包,方便在 Docker 无网环境下运行单元测试
go mod vendor
此时所有的依赖都打包放在项目根目录的 vendor 下面:
$ tree .
.
├── go.mod
├── go.sum
├── main.go
├── main_test.go
└── vendor
├── github.com
│ ├── davecgh
│ │ └── go-spew
│ │ ├── LICENSE
│ │ └── spew
│ │ ├── bypass.go
│ │ ├── bypasssafe.go
│ │ ├── common.go
步骤2: 制作 Go Docker 镜像
因为我们只需要 Go 的标准环境,所以可以使用官方的标准镜像,例如 golang:1.12.1。
如果你有特殊需求,可以定制自己的 Go Docker 镜像:
FROM ubuntu RUN apt-get update && apt-get install -y libssl1.0.0 libssl-dev gcc RUN mkdir -p /data/db /opt/go/ /opt/gopath # go1.xx.x.linux-amd64.tar.gz 解压缩后为 go ADD go /opt/go RUN cp /opt/go/bin/* /usr/local/bin/ ENV GOROOT=/opt/go GOPATH=/opt/gopath WORKDIR /ws CMD GOPROXY=off go test -mod=vendor ./...
步骤3: 在 Docker 中运行 Golang 测试
$ docker run --volume=$(pwd):/ws --workdir=/ws golang:1.11.2 /bin/bash -c "GOPROXY=off go test -mod=vendor ./..." ok github.com/songjiayang/gin-test 0.011s
可以看到我们已经成功在 Docker 中运行单元测试了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!