我正在为我正在处理的项目对一些 SWT 和 Swing 代码进行单元测试,只要我从 Eclipse 运行它们,测试就可以正常运行。
一旦我在我的 hudson 环境中运行它们,它就会失败,因为 hudson 在无头模式下运行测试。
这样做的最佳方法是什么?请仅提供开源解决方案(因为该项目是开源的)。
您可以运行Xvfb(X 虚拟帧缓冲区,一个在内存中执行所有图形操作的 X11 服务器),这工作正常。
但是 Hudson 的 Xvnc 插件还有另一种解决方案。只需安装插件并选中作业配置屏幕中的复选框:
替代文字 http://www.justinedelson.com/blog/wp-content/uploads/xvnc_box.jpg
Hudson 然后会自动启动一个 Xvnc 会话并将 DISPLAY 环境变量设置为适当的值,然后在构建完成时关闭会话。这与 Xvfb 方法相比的一个优点是,如果您同时构建多个 Swing/SWT 项目,则每个构建都有自己的 X 会话。这可能根本不是问题,但似乎是个好主意。
在使用这个插件之前,你显然必须安装 Xvnc。不太明显(尽管明智)的是您还必须设置密码。你可以通过运行:
$ vncpassword
这必须与 Hudson 运行的用户相同。
试试Abbot Java GUI 测试框架和SWTbot。至少 SWTbot应该能够做到。
如果两者都没有提供无头模式,那么这篇博文可能会为您提供一些关于如何摆脱 UI 进行测试的想法。
使用 Swing,我倾向于组织事物,以便可以在顶部没有窗口的情况下创建组件树。这样做可以让您在单元测试中简单地创建一个 JPanel 并将其用作您的顶级组件。有些东西是你无法测试的,例如焦点和创建 Frame 以进行正常操作所涉及的任何逻辑,但绝大多数都可以测试。
您可能想查看 FEST 库以使生活更轻松,无论您是否无头,它看起来都非常好: http: //fest.easytesting.org/swing/wiki/pmwiki.php
我确定我之前在这里发布过这个,不知道发生了什么。
Cacio 允许无头运行 Swing 应用程序。
http://rkennke.wordpress.com/2011/10/17/cacio-for-ui-testing/
我不知道 SWT,但是对于 Swing,你不能。窗口(JFrame、JDialog 等)的任何实例化,即使它从未设置为可见,也会在无头模式下(在 JDK 5 上)崩溃。我们所做的不是在无头模式下运行并安装Xvfb来提供窗口,而实际上没有安装真正的窗口系统。
你可以试试RedDeer测试框架 https://github.com/jboss-reddeer/reddeer
• 支持在 Jenkins CI 环境中运行测试(类似 Hudson)