3 使用 ptest 测试软件包
软件包测试(ptest)在目标机器上测试由 OpenEmbedded 构建系统生成的软件包。
一个 ptest 至少包含实际测试,以及启动测试的 shell 脚本 run-ptest。
启动脚本不能包含实际测试内容,它只负责启动测试。
实际测试既可以是运行二进制程序并检查输出的简单 shell 脚本,
也可以是包含多个测试程序和数据文件的复杂系统。
测试使用 Automake 格式输出结果:
result: testname
其中,result 可以是 PASS、FAIL 或 SKIP,
testname 可以是任意用于标识测试的字符串。
已经启用 ptest 的 Yocto 项目配方列表见 Ptest Wiki。
备注
继承 ptest 类的配方被称为“已启用 ptest”。
3 在构建中加入 ptest
向镜像添加软件包测试分为两步:
选择构建并打包所有 ptest 软件包。
确定其中哪些 ptest 软件包应加入镜像。
首先,在 配置文件 中加入以下设置, 启用所有 ptest 软件包的构建:
DISTRO_FEATURES:append = " ptest"
这会构建并打包所有 ptest 软件包,但不会将它们加入镜像。 接下来,可以用以下两种方式之一将测试包加入镜像:
要加入生成的全部 ptest 软件包,添加:
EXTRA_IMAGE_FEATURES += "ptest-pkgs"
如果只需要其中几个,可以采用类似以下的设置:
IMAGE_INSTALL:append = " e2fsprogs-ptest zlib-ptest"
构建完成后,ptest 文件会安装到镜像的 /usr/lib/package/ptest 目录中,
其中 package 是软件包名称。
备注
要列出本地软件包源中所有可安装到镜像的 ptest 软件包,
而不只是当前选中的软件包,可以使用 oe-pkgdata-util:
$ oe-pkgdata-util list-pkgs "*-ptest"
acl-ptest
attr-ptest
bash-ptest
... etc etc ...
3 运行 ptest
ptest-runner 软件包会安装一个 shell 脚本,
依次遍历并运行所有已安装的 ptest 测试套件。
执行过程中,ptest-runner 会统计 ptest 总数和失败数,
结束后将摘要输出到控制台。如果任一 run-ptest 失败,
ptest-runner 返回 '1'。
在镜像中加入任意 ptest 软件包,都会自动加入 ptest-runner。
3 准备软件包
要让配方支持在目标硬件上运行已安装的 ptest, 需要修改构建待测软件包的配方。每个配方应完成以下工作:
确保继承 ptest 类: 在配方中加入:
inherit ptest
创建 run-ptest: 该脚本负责启动测试。把脚本放在可通过 SRC_URI 引用的位置。
run-ptest成功执行时必须返回 0, 否则会被判定为失败。以下是启动dbus测试的例子:#!/bin/sh cd test make -k runtest-TESTS
返回正确的退出码:
run-ptest成功时必须返回 0,失败时返回 1。ptest-runner依靠该退出码统计成功与失败的测试。至少输出一项测试结果:
run-ptest执行后, 必须在控制台输出至少一条如下格式的测试结果:result: testname
result可以是PASS、SKIP或FAIL,testname可以是任意名称。 可以输出任意数量的测试结果。满足依赖: 如果测试新增了软件包平时没有的构建或运行时依赖, 例如测试套件运行时需要 make,应在配方中使用 DEPENDS 和 RDEPENDS 声明。以下示例添加 make 运行时依赖:
RDEPENDS:${PN}-ptest += "make"添加构建测试套件的函数: 支持交叉编译测试套件的软件包并不多, 因而通常需要自行添加交叉编译函数。
许多基于 Automake 的软件包使用
make check这样的单一命令来编译并运行测试。 原生make check在同一台机器上构建和运行,而交叉编译要求在主机上构建, 并面向目标架构执行,尽管 ptest 等场景的执行经常也发生在主机上。 Yocto 项目附带的 Automake 包含将构建与执行分离的补丁。 因此,使用这份已修补且未经额外修改的make check的软件包可以自动交叉编译。仍然需要添加
do_compile_ptest来构建测试套件, 例如在配方中加入:do_compile_ptest() { oe_runmake buildtest-TESTS }
完成特殊配置: 如果编译测试代码前需要特殊配置, 必须在配方中加入
do_configure_ptest函数。安装测试套件: ptest 类会自动将
run-ptest复制到目标, 然后运行 makeinstall-ptest以运行测试。 如果这些步骤还不够,需要创建do_install_ptest, 并确保它在 “make install-ptest” 完成后被调用。