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 服务来运行完整的测试套件,则可以使用 virtualx
eclass 为测试提供隔离的 Xvfb 环境。它提供了未连接到任何物理设备的虚拟 X11 显示器,并且程序可以可靠地使用。
inherit virtualx
src_test() {
virtx default
}