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

向镜像添加软件包测试分为两步:

  1. 选择构建并打包所有 ptest 软件包。

  2. 确定其中哪些 ptest 软件包应加入镜像。

首先,在 配置文件 中加入以下设置, 启用所有 ptest 软件包的构建:

DISTRO_FEATURES:append = " ptest"

这会构建并打包所有 ptest 软件包,但不会将它们加入镜像。 接下来,可以用以下两种方式之一将测试包加入镜像:

  1. 要加入生成的全部 ptest 软件包,添加:

    EXTRA_IMAGE_FEATURES += "ptest-pkgs"
    
  2. 如果只需要其中几个,可以采用类似以下的设置:

    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
    

    备注

    OpenEmbedded-Core (OE-Core) 已为常用测试框架提供专用类,例如:

    在配方中用 inherit 继承这些类后,后续步骤会自动完成。

  • 创建 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 可以是任意名称。 可以输出任意数量的测试结果。

    testimage 类和 logparser 模块会读取这些结果。

  • 满足依赖: 如果测试新增了软件包平时没有的构建或运行时依赖, 例如测试套件运行时需要 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 复制到目标, 然后运行 make install-ptest 以运行测试。 如果这些步骤还不够,需要创建 do_install_ptest, 并确保它在 “make install-ptest” 完成后被调用。