测试
目录
本节重点介绍测试。本节中的示例侧重于代码风格检查,但相同的原则也适用于其他类型的测试,例如单元测试。代码风格检查是代码的静态分析,可以帮助您检测错误、样式违规和反模式。
测试代码的确切步骤可能会有很大差异,具体取决于您使用的编程语言或框架。本指南中使用的示例应用程序是用 Go 编写的。您将添加一个使用 golangci-lint
(Go 的流行代码风格检查器运行器)的构建步骤。
运行测试
golangci-lint
工具在 Docker Hub 上以镜像形式提供。在将代码风格检查步骤添加到 Dockerfile 之前,您可以使用 docker run
命令尝试一下。
$ docker run -v $PWD:/test -w /test \
golangci/golangci-lint golangci-lint run
您会注意到 golangci-lint
工作正常:它在代码中找到了一个缺少错误检查的问题。
cmd/server/main.go:23:10: Error return value of `w.Write` is not checked (errcheck)
w.Write([]byte(translated))
^
现在,您可以将其作为 Dockerfile 中的一个步骤添加。
# syntax=docker/dockerfile:1
ARG GO_VERSION=1.21
+ ARG GOLANGCI_LINT_VERSION=v1.59
FROM golang:${GO_VERSION}-alpine AS base
WORKDIR /src
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,source=go.sum,target=go.sum \
--mount=type=bind,source=go.mod,target=go.mod \
go mod download -x
FROM base AS build-client
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,target=. \
go build -o /bin/client ./cmd/client
FROM base AS build-server
ARG APP_VERSION="0.0.0+unknown"
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,target=. \
go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server
FROM scratch AS client
COPY --from=build-client /bin/client /bin/
ENTRYPOINT [ "/bin/client" ]
FROM scratch AS server
COPY --from=build-server /bin/server /bin/
ENTRYPOINT [ "/bin/server" ]
FROM scratch AS binaries
COPY --from=build-client /bin/client /
COPY --from=build-server /bin/server /
+
+ FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as lint
+ WORKDIR /test
+ RUN --mount=type=bind,target=. \
+ golangci-lint run
添加的 lint
阶段使用来自 Docker Hub 的 golangci/golangci-lint
镜像来调用 golangci-lint run
命令,并使用绑定挂载来挂载构建上下文。
lint
阶段独立于 Dockerfile 中的任何其他阶段。因此,运行常规构建不会导致代码风格检查步骤运行。要进行代码风格检查,您必须指定 lint
阶段
$ docker build --target=lint .
导出测试结果
除了运行测试之外,有时能够将测试结果导出到测试报告中也很有用。
导出测试结果与导出二进制文件没有区别,如本指南的前一节所述。
- 将测试结果保存到文件。
- 使用
scratch
基础镜像在您的 Dockerfile 中创建一个新阶段。 - 使用
local
导出器导出该阶段。
如何执行此操作的确切步骤留作读者练习 :-)
摘要
本节展示了如何使用 Docker 构建来运行测试(或如本节所示,代码风格检查器)。
下一步
本指南中的下一个主题是使用模拟和交叉编译的多平台构建。