跳到主要内容

测试工具

温馨提示

测试文档中文官网不提供,如您有需要请前往podman官方github查询。本站仅做一篇文档作为介绍,感谢你对本站的支持和厚爱!祝你阖家欢乐,万事如意.podman官方github仓库

测试工具提供了一些用于测试的通用函数和结构。它包括两个结构体:

  • PodmanTest:处理podman命令和其他全局资源,如临时目录。它提供了基本方法,如检查podman镜像和pod状态。测试套件应该创建自己的测试结构体作为PodmanTest的复合体,并创建自己的PodmanMakeOptions()

  • PodmanSession:存储执行会话数据和相关方法。例如,获取命令输出等。它可以直接在测试套件中使用,如果你需要扩展它,只需要将其嵌入到你的会话结构体中。

test/utils 的单元测试

为了确保测试工具不会崩溃,test/utils中的每个函数结构体都有单元测试。当您向此添加函数或结构体时,请同时更新它们的单元测试以及此文档。

运行 test/utils 的单元测试

运行test/utils的单元测试。

make localunit

测试工具和测试套件的结构

测试工具包与测试套件处于同一级别。每个测试套件也都有它们自己的通用函数和结构体,存储在libpod_suite_test.go中。

Ginkgo 测试框架

Ginkgo是一个BDD测试框架。这允许我们使用原生的Golang来执行我们的测试,并且Ginkgo与Go测试框架之间有着密切的联系。

安装依赖项

成功运行测试需要一些外部二进制文件。测试目前依赖于:

  • 正常的podman运行时依赖项
  • coreutils
  • ncat
  • gzip
  • xz
  • htpasswd
  • iproute2
  • iptables
  • util-linux
  • tar
  • docker
  • systemd/systemctl

其中大多数只用于少数几个测试,因此如果没有安装所有内容,问题也不大。只有少数几个测试可能会失败。

安装 Ginkgo

通过以下命令构建并安装 Ginkgo 到 ./test/tools/build/ginkgo 目录下:

make .install.ginkgo

集成测试

集成测试套件用于测试 podman 命令行。它有自己的结构体:

  • PodmanTestIntegration:集成测试结构体,作为PodmanTest的复合体。它设置了podman命令的全局选项,以忽略不同测试系统环境的影响。

  • PodmanSessionIntegration:这个结构体有自己的方法,用于使用inspect包中定义的结构体检查以JSON格式给出的命令输出。

运行集成测试

你可以使用以下命令运行整个集成测试套件:

make localintegration

要运行远程测试,请使用:

make remoteintegration

测试变量

有些测试只能以非root用户身份运行,而有些测试只能以root身份运行。因此,要测试所有内容,你应该确保以普通用户和root身份运行上述make命令。

测试设置支持以下环境变量: -PODMAN_BINARY:podman二进制文件的路径,默认为仓库根目录中的bin/podman。 -PODMAN_REMOTE_BINARY:podman-remote二进制文件的路径,默认为仓库根目录中的bin/podman-remote。 -QUADLET_BINARY:quadlet二进制文件的路径,默认为仓库根目录中的bin/quadlet。 -CONMON_BINARY:conmon二进制文件的路径,默认为/usr/libexec/podman/conmon。 -OCI_RUNTIME:要使用的OCI运行时,默认为crun。 -NETWORK_BACKEND:网络后端,可以是netavark(默认)或cni。 -PODMAN_DB:数据库后端sqlite(默认)或boltdb。 -PODMAN_TEST_IMAGE_CACHE_DIR:容器镜像应缓存的路径,默认为/tmp

运行单个集成测试文件

你可以使用go test命令来运行单个集成测试文件:

make localintegration FOCUS_FILE=your_test.go

FOCUS_FILE 选项映射到 ginkgo 的 --focus-file 参数,关于接受的语法,请查阅 ginkgo 的 文档

对于远程测试,请使用 remoteintegration Makefile 目标。

运行单个集成测试

在运行测试套件之前,你需要在测试文件中声明要运行的测试。考虑以下实际的测试:

It("podman inspect bogus pod", func() {
session := podmanTest.Podman([]string{"pod", "inspect", "foobar"})
session.WaitWithDefaultTimeout()
Expect(session).To(ExitWithError())
})

要将此测试标记为要运行的测试,只需将 It 的描述更改为 FIt。请注意 FI 都需要大写。同时,请查看 ginkgo 的 文档 以获取更多信息。

注意:在提交更改之前,请确保从测试中移除 F,否则除了使用 FIt 表示的测试之外,您将会跳过该文件中的所有其他测试。

另一种方法是使用 FOCUS 选项,它映射到 --focus,再次查看 ginkgo 的 文档 以获取更多关于语法的信息。

make localintegration FOCUS="podman inspect bogus pod"

控制 Ginkgo 参数

您可以控制传递给 Ginkgo 的一些参数:

-通过设置 GINKGO_PARALLEL=n 来禁用并行测试 -设置 flake 重试次数(默认为 3)为 1,通过设置 GINKGO_FLAKE_ATTEMPTS=1 -通过设置 GINKGO_NO_COLOR=n 来生成彩色测试报告

系统测试

系统测试用于在完整的系统上下文中测试 podman CLI。这需要 podman、所有依赖项和配置都已到位。系统测试的意图是尽可能紧密地匹配真实世界用户/开发者的用例和环境。环境和测试的编排留给了外部工具。

系统测试使用 Bash 自动化测试系统(bats)作为测试框架。您可以通过包管理器安装它,或者从 存储库 直接获取最新的稳定版本,例如:

mkdir -p ~/tools/bats
git clone --single-branch --branch v1.1.0 https://github.com/bats-core/bats-core.git ~/tools/bats

请确保 bats 二进制文件(在存储库中的 bin/bats)位于您的 PATH 中,如果不是,请添加它:

PATH=$PATH:~/tools/bats/bin

系统测试还依赖于 jqsocatnmap 和其他工具。对于完整的工具列表,请查看 Fedora specfile 中的 %package tests 部分。

运行系统测试

bats 安装完成并位于您的 PATH 中时,您可以使用以下命令运行测试套件:

make localsystem

以更受控的方式运行系统测试

如果您希望运行系统测试的子集,或配置环境(例如,root 与非 root,本地与远程),请使用 hack/bats

要查看用法,请运行:

hack/bats --help

为系统测试做出贡献

请查看 需要的工作流/测试的 TODO 列表