src_test

函数 src_test
目的 运行预安装测试脚本
沙盒 已启用
权限 user
调用 ebuild

默认 src_test

EAPI 6 中的默认测试阶段等效于以下步骤:

src_test() {
    if nonfatal emake check -n &> /dev/null; then
        emake check
    elif nonfatal emake test -n &> /dev/null; then
        emake test
    fi
}

src_test样例

src_test() {
    cd "${S}"/src/testdir || die

    # Test 49 won't work inside a portage environment
    sed -i -e 's~test49.out~~g' Makefile || die

    # Try to run the non-gui tests only
    # pass -j1 if tests do not support being run in parallel
    emake -j1 test-nongui
}

包中支持的测试套件

如果打包的软件配备了测试套件,则使软件包知道它是明智的。这使包管理器可以运行软件的单元测试。具有测试套件的软件包必须声明“test” USE 标志。

IUSE="test"

要考虑的下一个重要方面是仅测试依赖项,即仅运行测试套件所需的依赖项。应在 USE 标志后面的 DEPEND 中指定仅测试依赖项。请参阅测试依赖项部分以获取更多信息。

通常,默认设置 src_test 是可以的。有时,如果某些测试无法与可移植环境一起使用,则有必要将其从列表中删除。失败的原因可能包括:

  • 需要使用 沙盒 不允许的文件。
  • 需要用户输入(src_test 不能是交互式的)。
  • 需要 root 权限。

通常,从 Makefile 使用 sed 或跳过特定 make 目标中删除相关测试就足够了。

尝试确保测试对于你的 ebuild 正常工作。一个好的测试套件对架构维护者非常有帮助。有时有必要完全跳过测试。这可以通过在 ebuild 中 设置RESTRICT="test"来完成。

注意: 如果上游提供了无法使用的测试套件,请考虑与他们讨论如何修复它。损坏的测试套件要求开发人员调查每个失败的测试以确定它是正确的还是测试失败。

需要网络或服务访问的测试

有时,测试套件(和其他构建时程序)会尝试使用远程或本地网络或主机上运行的生产服务器。所有这些都是严格禁止的。开发人员应该在隔离的环境中修复此类测试,或者完全禁用它们,除非用户明确允许。最低限度是,测试一定不能因启用FEATURES=network-沙盒而失败。

出于以下原因,禁止在构建过程中访问 Internet:

  • 构建可能在没有 Internet 访问或互联网访问受限的环境中运行,并且这一定不会导致测试(构建)失败;
  • Internet 连接可能不稳定(例如,接收不良),在这种情况下,连接中断或数据包丢失一定不会导致测试失败或挂起,也不会造成不必要的延迟;
  • Internet 连接可能正在有限的数据计划上运行,在这种情况下,额外的网络使用可能给用户带来额外的冲击或其他不便;
  • 测试使用的远程网络服务可能暂时或永久不可用,从而导致意外的测试失败;
  • 访问远程站点始终会带来隐私问题,并可能对安全造成威胁(例如,通过无意间公开有关系统的信息)。

修复需要 Internet 访问的测试通常需要与上游合作,并移植测试以使用测试技术,例如模拟或使用重播数据。因此,开发人员向上游报告该问题,并跳过需要网络访问的测试。建议明确说明跳过测试的原因,以便其他开发人员可以在本地重新启用它们以运行更完整的测试套件。

此外,出于以下原因,还禁止在构建过程中访问本地服务器:

  • 测试必须可靠地运行,而不依赖于特定服务器是否在整个构建过程中都在运行,
  • 使用生产服务进行测试非常危险,因为它可能会无意间暴露那些服务中的错误,从而导致不稳定,数据丢失甚至暴露出安全漏洞。

修复需要访问本地服务的测试通常是通过在测试阶段启动这些服务的其他隔离实例来完成的。这些服务必须在 UNIX 套接字上或在环回接口上运行,以可靠地阻止远程访问。

对于在测试阶段(通过 ebuild 或测试本身)公开的所有联网服务,UNIX 套接字比 IP 套接字更受青睐,因为它们为唯一的命名和访问控制机制提供了更好的方法。IP 套接字可能会与其他本地服务发生端口冲突,本地系统用户可以访问 IP 套接字,他们可能会通过测试来利用漏洞。

通过FEATURES=network-沙盒提供了针对这些问题的附加保护。但是,这只是依赖于特定 Linux 内核名称空间机制的可选 Portage 函数,开发人员不应依赖于启用它。

需要 X11 的测试

某些软件包包括测试(或其他构建时应用程序),这些测试尝试使用用户的 X11 会话,但无法连接到该会话。这些测试需要进行修复,以独立于 X11 服务器的运行,而 X11 服务器在构建软件包时可能正在运行或可能未运行。

如果所讨论的程序不是严格需要 X11,而只是试图利用 DISPLAY 变量的设置,最好的解决方案是在 ebuild 中简单地取消设置此变量。

src_test() {
    # tests attempt to connect to X11 and fail when it is set
    # however, they work just fine without X11
    unset DISPLAY

    default
}

如果软件包实际上需要运行的 X11 服务来运行完整的测试套件,则可以使用 virtualxeclass 为测试提供隔离的 Xvfb 环境。它提供了未连接到任何物理设备的虚拟 X11 显示器,并且程序可以可靠地使用。

inherit virtualx

src_test() {
    virtx default
}

results matching ""

    No results matching ""