1 简介
FATE 是客户端上的扩展回归套件,也是在服务器端聚合和呈现结果的一种方式。
本文档的第一部分介绍了如何使用 FFmpeg 源目录中的 FATE 来测试 ffmpeg 二进制文件。第二部分介绍了如何运行 FATE 以将结果提交到 FFmpeg 的 FATE 服务器。
无论如何,您都可以通过访问此网站查看可公开查看的 FATE 结果:
http://fate.ffmpeg.org/
特别推荐所有为 FFmpeg 贡献源代码的人这样做,因为可以看到某些平台上的某些测试是否与他们最近的贡献不符。这通常发生在开发人员无法测试的平台上。
本文档的第二部分介绍了如何运行 FATE 以将结果提交到 FFmpeg 的 FATE 服务器。如果您想要提交结果,请务必检查您的 CPU、操作系统和编译器组合是否已在上述网站上列出。
在第三部分中,您可以找到 FATE makefile 目标和变量的综合列表。
2 从 FFmpeg 源目录中使用 FATE
如果您想在您的机器上运行 FATE,您需要准备好样本。您可以通过构建目标 fortune-rsync 获取样本。从顶级源目录中使用此命令:
make fate-rsync SAMPLES=fate-suite/
make fate SAMPLES=fate-suite/
上述命令通过命令行传递 makefile 变量来设置样本位置。也可以在源配置时通过使用 --samples=<path to the samples directory> 调用 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
您可以通过使用 fat- 前缀指定列表中的相应元素来指定要运行的测试子集,例如:
make fate-ffprobe_compact fate-ffprobe_xml
这样,在发生故障时,无需运行完整的测试套件,即可更轻松地运行一些测试。
要使用自定义包装器运行测试,请传递 --target-exec 以配置或设置 TARGET_EXEC Make 变量。
3 将结果提交给 FFmpeg 结果聚合服务器
要将结果提交给服务器,您应该通过 FFmpeg 源中的 shell 脚本 tests/fate.sh 运行 fat。需要使用配置文件作为第一个参数来调用此脚本。
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 fate@fate.ffmpeg.org" # 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 服务器管理员,您可以通过电子邮件地址 fat-admin@ffmpeg.org 联系管理员。
配置您的 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 测试套件(需要命运套件数据集)。
5.2 Makefile 变量
- V
-
详细程度,可设置为 0、1 或 2。
0:仅显示测试参数
1:仅显示测试中使用的命令
2:显示所有内容
- SAMPLES
-
在 make 时指定或覆盖 FATE 样本的路径,仅在运行回归测试时才有意义。
- THREADS
-
指定运行回归测试时要使用的线程数,这对于检测与线程相关的回归非常有用。
此变量可以设置为字符串“random”,后面可以跟一个数字,如“random99”,这将导致每个测试使用随机数量的线程。如果指定了一个数字,则将其用作最大线程数,否则最大线程数为 16。
如果测试失败,则用于该测试的线程数将写入 errfile。
- THREAD_TYPE
-
指定哪个线程策略测试,‘slice’ 或 ‘frame’,默认为 ‘slice+frame’
- CPUFLAGS
-
指定 CPU 标志。
- TARGET_EXEC
-
指定或覆盖用于运行测试的包装器。 TARGET_EXEC 选项提供了一种在 valgrind、qemu-user 或 wine 中包装的 FATE 或通过 ssh 在远程目标上运行 FATE 的方法。
- GEN
-
设置为“1”以生成缺失或不匹配的引用。
- HWACCEL
-
指定在运行回归测试时要使用的硬件加速,默认情况下使用“无”。
- KEEP
-
设置为“1”以在测试成功时保留由命运测试生成的临时文件。默认值为“0”,删除这些文件。测试失败时始终保留文件。
5.3 示例
make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate