在Windows上使用Jenkins和无需远程桌面连接的GUI测试

19
我们在Jenkins中使用主从配置,我们的.NET项目是由运行在Windows上的一个从Jenkins实例构建的。
有一堆GUI测试,但是只有在远程桌面连接(RDC)会话打开时才能运行。
当尝试在没有RDC的情况下运行测试时,Jenkins不显示任何测试进度。然后,当我连接到从机的桌面时,可以看到应用程序的主窗口启动了,但UI测试框架(White)无法执行任何操作。
Jenkins从节点是通过Java Web Start启动的。
我在几个网站上读到,很遗憾不能在没有RDC会话的情况下运行GUI测试。
我只想确认这是真的,并想知道是否有任何解决方法。
4个回答

15

测试运行前,您的从机必须处于桌面状态。我们曾遇到过同样的问题。

解决方案是让测试机器启动并自动登录到桌面。为了确保测试仅在桌面可用后开始,我们添加了一个定时任务,设置为在用户登录时运行,并通过Java Web Start启动Jenkins从机。这样,只有当桌面正在运行时,Jenkins才会看到从机。之后,一切都正常工作了。


嗨!感谢您的回答。它看起来与我一直在做的非常相似,但是并没有带来太多成功。我还注意到并阅读了每次最小化RDC窗口时,测试都会停止。 - Mike Borozdin
4
RDC 创建和销毁桌面。这会导致视觉测试出现问题 - 它们的桌面被清除并重新创建。当涉及到 RDC 时,这种视觉测试方法将无法使用。在我们运行测试时,我们从未在测试运行期间通过 RDC 连接。由于我们的测试机器是 VMWare VMs,我们通过 VM 控制台连接,该控制台显示监视器可以看到的内容,而不是 RDC 连接时创建的远程桌面。 - Jason Swager
我们的测试正在运行在一个EC2实例上,我们通常不会远程桌面连接到它们。唯一的原因是为了检查Jenkins在运行测试时为什么会停顿。当我们有一个打开的远程桌面连接会话时,我们可以看到测试正在Jenkins中运行,否则就没有任何反应。 - Mike Borozdin
2
Jason所描述的解决方案是我曾经使用过的唯一可行的方法。您可以在EC2机器上的cmd.exe窗口中运行“control userpasswords2”,并将其配置为在启动时自动登录到一个帐户。然后,您可以将Jenkins代理配置为在该桌面会话中运行(作为已登录的Windows用户)。如果通过RDC连接到机器仍然存在问题,建议尝试切换到VNC以连接到已登录的机器。 - Bill Agee
1
我认为这个链接很相关:https://forums.aws.amazon.com/thread.jspa?messageID=248701 - Francis Upton IV

10
我有一个Jenkins集群,运行不同类型的GUI测试,包括win32、swing和selenium。它们以24小时不间断的方式自动运行数千个测试。以下是我的解决方案:
  1. 如何保持GUI测试活动 - RDC无法解决,只有在RDC会话处于活动状态时,GUI应用程序才能正常运行。我已尝试过各种方法,请不要再试了。当RDC窗口最小化或断开连接后,你的测试将中断。到目前为止,解决方案是安装VNC Server(我使用的是UltraVNC)作为服务,并确保在登录时启动。还要确保不要使用RDC连接到测试机器,因为RDC会中断VNC会话。如果可能的话,也可以使用VNC客户端进行连接。但这取决于你的选择。我的做法是需要在计算机上调试时,我通过RDC连接并重新启动计算机,以确保设置#2和#3。

  2. 自动登录 - SysInternalsSuite中有一个名为autologon.exe的工具,需要在从机上运行。

  3. 自动注册从机 - 你所需的是Swarm插件- https://wiki.jenkins-ci.org/display/JENKINS/Swarm+Plugin。编写一个简单的批处理文件并将快捷方式放置在启动文件夹中。每次计算机自动登录时,它都会自动注册为从机。

我实际上将#2和#3组合成了一个简单的批处理文件:

autologon.exe <user> <domain> <password>
REM Here to make sure the logonCount is properly generated
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0xFFFF /f

start /min java -jar I:\CDC\jenkins\swarm-client-1.9-jar-with-dependencies.jar -executors 1 -fsroot c:\Jenkins -labels "Prod Win7 %ComputerName%" -master <Jenkins URL> -name farm-%ComputerName% -username <username> -password <password>

如果您更喜欢使用正式的自动登录注册表修改方法,请参考此链接:http://support.microsoft.com/kb/315231,您可以使用我在这里发布的注册表数据文件:http://serverfault.com/questions/269832/windows-server-2008-automatic-user-logon-on-power-on/606130#606130。 - Noam Manos

7

还有另外一种方法可以在不使用Windows自动登录的情况下完成(对我几台机器有效)。

1. 进入计算机管理 -> 服务和应用程序 -> 服务 -> Jenkins从属服务 -> 属性
2. 在登录选项卡中选择本地系统帐户并勾选允许服务与桌面交互
3. 点击确定关闭此窗口,然后重新启动Jenkins从属服务
4. 进入您的测试应用程序所在的目录,并在可执行的应用程序上选择属性
5. 在安全选项卡上点击编辑...
6. 在新窗口中点击添加..
7. 在新窗口中点击位置...并选择本地计算机(列表上最上方的选项),点击确定
8. 将LOCAL SERVICE放到窗口的白色区域中并点击检查名称,点击确定
9. 允许该用户完全控制,点击确定,关闭所有窗口

这就是全部内容。如果可以,请告诉我它是否起作用。


非常感谢!正是我正在寻找的! - falkon21
2
不幸的是,这会阻止服务与经过身份验证的网络驱动器进行交互。 - Dan
@Dan,你需要认证的网络驱动器是用来做什么的? - maQ
托管在网络驱动器上的公司NuGet源是主要的。 - Dan

2
如其他答案所述,需要进行配置,使Windows机器自动登录到真实用户,详情请参见其他答案。但对我来说这还不够,我需要设置一个作为服务运行的UltraVNC服务器来解决问题。该网站提到,通过RDP登录是这个技巧的问题,即使用VNC连接或在RDP访问后重新启动。

我知道这是一个老问题,但你能帮我设置一下吗?我安装了UltraVNC并启用了loopbackonly选项。现在它作为服务运行,但我该如何测试它呢?我想要实现的是,在服务器上预定运行的软件每5分钟截取服务器屏幕并存储,但如果我与VM断开连接,它就会停止。如果您告诉我您是如何解决这个问题的,我将不胜感激。谢谢。 - ChiragMS
@ChiragMS:我们不再运行这个设置了。我无法检查可能遗漏的细节。你是否理解通过RDP登录会停止解决方案工作的详细信息,即在RDP后机器必须重新启动以自动登录,只有这样它才能保持运行状态。你只能通过将屏幕截图写入网络共享并从另一台机器上检查此共享来从外部进行测试。 - jan
是的,我明白了那部分并进行了配置。现在它运行良好。谢谢。 - ChiragMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接