LibYUI 框架在您需要一个可用于 X 和 ncurses 的应用程序时,会带来巨大的优势。但对于 Qt 而言,集成测试是一个已经解决的问题,意味着有多种可用的工具,而对于 ncurses 而言,情况并非如此乐观。此外,使用不同的工具会给框架开发带来额外的努力。因此,一切都始于 openQA,它使用高级模糊逻辑进行屏幕比较。这种方法降低了测试开发的成本,但当 UI 发生变化时,维护仍然很困难。

考虑到以上所有因素,Ladislav Slezák 和 Rodion Iafarov 正在致力于一个合适的解决方案,以 Ladislav 在 Hack Week 15 提出的建议 作为起点。这个想法很简单:提供一个 HTTP/JSON API,允许通过读取和设置不同的 UI 属性来与 LibYUI 交互。因此,如果某个按钮被移动、调整大小或分配了新的快捷键,我们就不再需要调整测试代码了。

显然,这个功能不需要在生产系统中,所以我们为此创建了单独的软件包。您可以在这里找到 GitHub 仓库,其中包含一些文档。

演示时间!

听起来很酷,但实际操作起来更好。在下面的屏幕录像中,您可以看到用户如何使用命令行中的 cURL 与 YaST 主模块进行交互。

LibYUI Testing Framework in Action

如何测试新的软件包

如果您想尝试一下,可以使用我们为您准备的软件包。但是,建议使用虚拟机,以免污染(或意外破坏)您的系统。请注意。 :smiley:

首先,您需要获取新的软件包,目前在 OBS 中的 YaST:Head 项目 中可用。导航到 Repositories 选项卡 并获取与您正在运行的发行版匹配的仓库。之后,您应该能够安装 libyui-rest-api 软件包。此外,您需要更新相关软件包,并且 YaST2 模块使用最新的 LibYUI 重新编译。为此,只需运行以下命令,其中 YaST:Head 是上一步中添加的仓库

zypper up --allow-vendor-change -r YaST:Head

在安装了所需的软件后,您需要启动一个 YaST 模块,并将环境变量 Y2TEST 设置为 1

xdg-su -c 'Y2TEST=1 YUI_HTTP_PORT=9999 yast2 host' # for Qt
sudo Y2TEST=1 YUI_HTTP_PORT=9999 yast2 host # for ncurses

要允许远程连接,您可以添加 YUI_HTTP_REMOTE=1。出于安全原因,默认情况下仅允许来自 localhost 的连接。

现在,您应该能够通过在浏览器中导航到 https://:9999 来看到如下截图所示的内容。

LibYUI Testing Framework Browser

后续步骤

如您所见,我们尚未为 HTTP 服务器的 POST 和 GET 请求实现包装器,但这将是下一步。我们正在尝试寻找一种解决方案,该解决方案允许我们在终端中本地运行测试,在 CI 中使用稳定的发行版版本,并最终在 openQA 中用于开发构建。

即将推出的其他功能

  • 将软件包拆分为单独的 ncurses 和 Qt 部分(更少的依赖项,无法在没有 X 的最小系统上进行测试)。
  • 改进插件加载。
  • 支持更多的小部件和属性。
  • 添加 基本身份验证 支持。
  • 改进安全性 添加通过 SSL 支持加密和对等验证
  • 添加对基于 Gtk 的 UI 的支持。
  • 添加 IPv6 支持 (示例)。毕竟,我们现在已经是 2019 年了。 :smiley:

安全提示

YaST 通常以 root 权限运行,这意味着任何可以连接到 HTTP/JSON API 的人都可以读取值并发送按钮点击。并且由于尚未提供身份验证,这是一个很大的安全问题。简而言之:请勿在生产系统中使用 API!它仅被设计用于在安全环境中进行测试

结束语

我们对这个项目感到非常兴奋,原因有几个。一方面,因为我们预计它会减少集成测试的维护负担。另一方面,因为它是一个 Hack Week 优势和跨团队协作的良好示例。

如果您感兴趣,我们将尝试通过在 YaST sprint 报告中定期发布信息来让您了解最新动态。