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变量来设置样本位置。也可以在源代码配置时设置样本位置,运行configure命令:--samples=<path to the samples directory>之后,你可以在不设置SAMPLESmakefile变量的情况下调用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> at configuration time, e.g. when seeking the highest possible test coverage:

./configure --assert-level=2

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

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

make fate-list

可以通过指定列表中对应的元素以及fate-前缀来运行一部分测试,例如:

make fate-ffprobe_compact fate-ffprobe_xml

在发生故障时,只运行部分测试而不是整个测试套件会更容易。

如果要使用自定义包装器运行测试,请传递--target-execconfigure或设置TARGET_EXECMake变量。

3 将测试结果提交到FFmpeg结果汇总服务器

要将结果提交到服务器,你应该通过命令行脚本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 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可以是尚未使用的任何字符串,但建议按照以下模式命名:‘架构-操作系统-编译器-编译器版本’。配置文件本身将在一个shell脚本中被分析,因此可以使用所有shell功能。这使你能够为构建设置所需的环境。

首次测试运行时变量fate_recv应该为空或注释掉。这会按正常流程运行所有内容,除了省略提交结果到服务器部分。以下文件应出现在配置文件中指定的$workdir中:

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

当一切正常工作后,可以创建SSH密钥对,并将公钥发送给可以通过电子邮件联系的FATE服务器管理员:fate-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服务器有问题,尝试使用命令ssh以及一个或多个-v选项可能会有所帮助。这样可以详细输出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

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

5.2 Makefile变量

V

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

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

指定或在生成时覆盖FATE样本路径,这只在运行回归测试时有效。

THREADS

指定运行回归测试时使用的线程数,十分适合检测线程相关的回归问题。

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

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

THREAD_TYPE

指定测试哪种线程策略,‘slice’ 或者 ‘frame’,默认值为‘slice+frame

CPUFLAGS

指定CPU标志。

TARGET_EXEC

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

GEN

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

HWACCEL

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

KEEP

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

5.3 示例

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

本文档使用以下工具生成makeinfo.

托管服务由以下机构提供telepoint.bg