长期以来,测试 Windows 桌面应用一直是客户最迫切的需求之一,因为没有人拥有每月并行运行数千次此类测试的基础设施。网页测试相对容易:无界面浏览器可以在 Linux 容器中数秒内启动,成本只是几分之一美分,测试结束后即被丢弃。Windows 桌面测试则没有对应的方案。每个测试都需要一台完整的虚拟机,因为 Windows 容器不包含图形桌面。一台冷启动的 Windows 虚拟机需要 2 至 3 分钟 才能启动,而且必须有用户登录,因为 Windows UI 自动化只能在活动的桌面会话中运行。机器在多次运行之间还会保留已安装的文件、注册表项、用户配置文件和已保存的登录信息,同时每个应用都带有各自的安装程序、管理员提示和首次运行对话框。远程 Windows 机器本身不提供内置的跟踪、日志或截图功能,而大多数测试基础设施都是围绕 Linux 设计的。
团队的解决方案是将 Windows 机器视为手机:一台设备被一个测试占用、只使用一次、然后丢弃。该架构借鉴了其移动测试基础设施。Kubernetes 中的一个自定义设备调度器通过设备声明(Device Claim)分配 Google Compute Engine 上的一台 Windows 虚拟机,测试则使用 WebdriverIO 和 Appium 远程控制它。设备模型需要进行两项扩展:设备可以位于集群之外,并且声明可以返回桌面连接地址,包括用于浏览器的 CDP。
该系统由三部分组成:一个维护预热 Windows 虚拟机池的控制器、一个执行测试代码的 Linux 运行器 Pod,以及运行被测应用和小型桌面代理的 Windows 虚拟机本身。运行器通过 Playwright 的 CDP 获取浏览器内容,通过 Appium 操作原生应用,并通过 WebRTC 流让人们实时观看测试,事后还可回放录制内容。
每台虚拟机都是一次性的。没有人会登录、修补或让它连续运行数周,每次使用后都会由一台全新的机器替换。
来源: Hacker News · 由HeadlinesBriefing整理摘要