Unit Test In Go With Docker

栏目: 编程工具 · 发布时间: 7年前

内容简介:本篇文章主要讲解如何在 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 中运行单元测试了。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浅薄

浅薄

[美]尼古拉斯·卡尔 / 刘纯毅 / 中信出版社 / 2015-11 / 49.00 元

互联网时代的飞速发展带来了各行各业效率的提升和生活的便利,但卡尔指出,当我们每天在翻看手机上的社交平台,阅读那些看似有趣和有深度的文章时,在我们尽情享受互联网慷慨施舍的过程中,我们正在渐渐丧失深度阅读和深度思考的能力。 互联网鼓励我们蜻蜓点水般地从多种信息来源中广泛采集碎片化的信息,其伦理规范就是工业主义,这是一套速度至上、效率至上的伦理,也是一套产量最优化、消费最优化的伦理——如此说来,互......一起来看看 《浅薄》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具