FFmpeg 自动化测试环境

目录

1 简介

FATE 是客户端上的一个扩展回归套件,也是服务器端结果聚合和呈现的手段。

本文档的第一部分解释了如何从 FFmpeg 源代码目录中使用 FATE 来测试您的 ffmpeg 二进制文件。第二部分描述了如何运行 FATE 将结果提交到 FFmpeg 的 FATE 服务器。

无论如何,您都可以访问此网站查看公开的 FATE 结果

http://fate.ffmpeg.org/

这对于所有向 FFmpeg 贡献源代码的人员来说尤为推荐,因为可以查看在某些平台上的一些测试是否因为他们最近的贡献而中断。这种情况通常发生在开发者无法测试的平台上。

本文档的第二部分描述了如何运行 FATE 将结果提交到 FFmpeg 的 FATE 服务器。如果您想提交结果,请务必检查您的 CPU、操作系统和编译器组合是否已在上述网站上列出。

在第三部分,您可以找到 FATE makefile 目标和变量的完整列表。

2 从您的 FFmpeg 源代码目录使用 FATE

如果您想在您的机器上运行 FATE,您需要有样本。您可以通过构建目标 fate-rsync 获取样本。从顶层源代码目录使用此命令

make fate-rsync SAMPLES=fate-suite/
make fate       SAMPLES=fate-suite/

上述命令通过命令行传递 makefile 变量来设置样本位置。也可以在源代码配置时通过使用 --samples=<样本目录路径> 调用 configure 来设置样本位置。之后,您可以调用 makefile 目标而无需设置 SAMPLES makefile 变量。以下命令说明了这一点

./configure --samples=fate-suite/
make fate-rsync
make fate

告诉 FATE 样本目录位置的另一种方法是确保环境变量 FATE_SAMPLES 包含您的样本目录路径。这可以通过例如将该变量放入您的 shell 配置文件或在您的交互式会话中设置它来实现。

FATE_SAMPLES=fate-suite/ make fate

不要在样本路径中使用 ‘~’ 字符来指示主目录。由于 shell 的细微差别,这将导致 FATE 失败。

请注意,默认情况下某些断言是禁用的,因此请注意在配置时设置 --assert-level=<level>,例如,当寻求尽可能高的测试覆盖率时

./configure --assert-level=2

请注意,提高断言级别可能会对性能产生影响。

要获取完整的测试列表,请运行命令

make fate-list

您可以通过指定列表中带有 fate- 前缀的相应元素来指定要运行的测试子集,例如

make fate-ffprobe_compact fate-ffprobe_xml

这使得在出现故障时更容易运行一些测试,而无需运行完整的测试套件。

要使用自定义包装器运行测试,请将 --target-exec 传递给 configure 或设置 TARGET_EXEC Make 变量。

3 将结果提交到 FFmpeg 结果聚合服务器

要将您的结果提交到服务器,您应该通过 FFmpeg 源代码中的 shell 脚本 tests/fate.sh 运行 fate。此脚本需要使用配置文件作为其第一个参数来调用。

tests/fate.sh /path/to/fate_config

可以在 doc/fate_config.sh.template 中找到带有描述各个配置变量的注释的配置文件模板。

此处也提供了提到的配置模板

slot=                                    # some unique identifier
repo=git://source.ffmpeg.org/ffmpeg.git  # the source repository
#branch=release/2.6                       # the branch to test
samples=                                 # path to samples directory
workdir=                                 # directory in which to do all the work
#fate_recv="ssh -T [email protected]" # command to submit report
comment=                                 # optional description
build_only=     # set to "yes" for a compile-only instance that skips tests
ignore_tests=

# the following are optional and map to configure options
arch=
cpu=
cross_prefix=
as=
cc=
ld=
target_os=
sysroot=
target_exec=
target_path=
target_samples=
extra_cflags=
extra_ldflags=
extra_libs=
extra_conf=     # extra configure options not covered above

#make=          # name of GNU make if not 'make'
makeopts=       # extra options passed to 'make'
#makeopts_fate= # extra options passed to 'make' when running tests,
                # defaulting to makeopts above if this is not set
#tar=           # command to create a tar archive from its arguments on stdout,
                # defaults to 'tar c'
#fate_targets=  # targets to make when running fate; defaults to "fate",
                # can be set to run a subset of tests, e.g. "fate-checkasm".

#fate_environments=  # a list of names of configurations to run tests for;
                     # each round is run with variables from ${${name}_env} set.

# One example of using fate_environments:

# target_exec="qemu-aarch64-static"
# fate_targets="fate-checkasm fate-cpu"
# fate_environments="sve128 sve256"
# sve128_env="QEMU_CPU=max,sve128=on"
# sve256_env="QEMU_CPU=max,sve256=on"

# The variables set by fate_environments can also be used explicitly
# by target_exec, e.g. like this:

# target_exec="qemu-aarch64-static -cpu \$(MY_CPU)"
# fate_targets="fate-checkasm fate-cpu"
# fate_environments="sve128 sve256"
# sve128_env="MY_CPU=max,sve128=on"
# sve256_env="MY_CPU=max,sve256=on"

根据配置模板创建适合您需要的配置。slot 配置变量可以是任何尚未使用的字符串,但建议您按照以下模式命名:‘arch-os-compiler-compiler version’。配置文件本身将在 shell 脚本中获取,因此可以使用所有 shell 功能。这使您可以根据构建需要设置环境。

对于您的第一次测试运行,fate_recv 变量应为空或注释掉。这将像往常一样运行所有内容,除了它将省略向服务器提交结果。以下文件应存在于配置文件中指定的 $workdir 中

  • configure.log
  • compile.log
  • test.log
  • report
  • version

当一切正常工作后,您可以创建一个 SSH 密钥对并将公钥发送给 FATE 服务器管理员,可以通过电子邮件地址 [email protected] 联系他们。

配置您的 SSH 客户端,以便在连接到 FATE 服务器时使用该密钥进行公钥身份验证。另外,不要忘记检查服务器的身份并接受其主机密钥。通常可以通过手动运行 SSH 客户端并在您接受密钥后将其杀死来实现。FATE 服务器的指纹是

RSA

d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51

ECDSA

76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86

如果您在连接 FATE 服务器时遇到问题,使用一个或多个 -v 选项尝试 ssh 命令可能会有所帮助。您应该获得有关您的 SSH 配置和身份验证过程的详细输出。

剩下的唯一一件事就是自动化 fate.sh 脚本的执行和样本目录的同步。

4 将新样本上传到 FATE 套件

如果您需要上传样本,请发送邮件至 samples-request。

这适用于在 fate 套件服务器上拥有帐户的开发人员。如果您上传新的样本,请确保它们尽可能小,每个客户端上的空间、网络带宽等都会从较小的测试用例中受益。此外,请记住较旧的检出使用现有的样本文件,这意味着在实践中通常不要替换、删除或覆盖文件,因为这很可能会破坏较旧的检出或版本。此外,提交所需的所有样本应在推送之前 24 小时上传。如果您需要一个帐户来频繁上传样本或您希望通过这样做来帮助其他人,请发送邮件至 ffmpeg-devel。

#First update your local samples copy:
rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite

#Then do a dry run checking what would be uploaded:
rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite

#Upload the files:
rsync -vaL  --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite

5 FATE makefile 目标和变量

5.1 Makefile 目标

fate-rsync

将样本文件下载/同步到配置的样本目录。

fate-list

将列出所有 fate/回归测试目标。

fate-list-failing

列出上次执行时失败的 fate 测试。

fate-clear-reports

删除之前测试执行的测试报告(摆脱来自 fate-list-failing 的潜在过时结果)。

fate

运行 FATE 测试套件(需要 fate-suite 数据集)。

5.2 Makefile 变量

V

详细级别,可以设置为 0、1 或 2。

  • 0:仅显示测试参数
  • 1:仅显示测试中使用的命令
  • 2:显示所有内容
SAMPLES

在 make 时指定或覆盖 FATE 样本的路径,它仅在运行回归测试时才有意义。

THREADS

指定在运行回归测试时使用的线程数,它对于检测与线程相关的回归非常有用。

此变量可以设置为字符串“random”,可以选择后跟一个数字,如“random99”。这将导致每个测试使用随机数量的线程。如果指定了一个数字,则将其用作最大线程数,否则最大为 16。

如果测试失败,用于该测试的线程计数将写入错误文件。

THREAD_TYPE

指定测试的线程策略,可以是 ‘slice’ 或 ‘frame’,默认值为 ‘slice+frame

CPUFLAGS

指定 CPU 标志。

TARGET_EXEC

指定或覆盖用于运行测试的包装器。TARGET_EXEC 选项提供了一种通过 valgrindqemu-userwine 包装运行 FATE,或者通过 ssh 在远程目标上运行 FATE 的方法。

GEN

设置为 ‘1’ 以生成缺失或不匹配的参考。

HWACCEL

指定在运行回归测试时要使用的硬件加速,默认使用 ‘none’。

KEEP

设置为 ‘1’ 以在测试成功时保留由 fate 测试生成的临时文件。默认值为 ‘0’,这将删除这些文件。当测试失败时,文件总是会被保留。

5.3 示例

make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate

本文档于 2025 年 1 月 21 日 使用 makeinfo 生成。

telepoint.bg 提供托管。