测试

本节重点介绍测试。本节中的示例侧重于代码风格检查,但相同的原则也适用于其他类型的测试,例如单元测试。代码风格检查是代码的静态分析,可以帮助您检测错误、样式违规和反模式。

测试代码的确切步骤可能会有很大差异,具体取决于您使用的编程语言或框架。本指南中使用的示例应用程序是用 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 .

导出测试结果

除了运行测试之外,有时能够将测试结果导出到测试报告中也很有用。

导出测试结果与导出二进制文件没有区别,如本指南的前一节所述。

  1. 将测试结果保存到文件。
  2. 使用 scratch 基础镜像在您的 Dockerfile 中创建一个新阶段。
  3. 使用 local 导出器导出该阶段。

如何执行此操作的确切步骤留作读者练习 :-)

摘要

本节展示了如何使用 Docker 构建来运行测试(或如本节所示,代码风格检查器)。

下一步

本指南中的下一个主题是使用模拟和交叉编译的多平台构建。