[Windows PowerShell07]-Windows Session 交互的解决方案

         在自动化做CodeUI Test的时候,我们希望在Deploy Server上使用Invoke或者PowerShell PSSession 远程调用MSTest 跑 TestCase,通过TestCase 连ALM,然后驱动Clinet端的QTP,这样来完成Automation的过程。这个过程中我们会发现使用PowerShell无论是使用Invoke还是PSSession调MSTest都会失败,因为TestAgent不支持远程调用的方式。那么为什么不支持呢.因为MSTest和QTP的agent不在同一个Session,在windows XP 之后的Windows系统都对Session的管理方式都有所改变。对于XP来说,服务和应用程序都在一个session里面。

         对于xp之后的系统,服务和应用程序在不同的session。不同session之间是不可以交互的。这导致在XP环境下通过service与桌面交互的方式来解决上述自动化测试的问题的解决方案也不成立。网上有一些解决session穿透问题的方法,写得比较全面,也很好,对于解决这个问题来说,显得有些复杂。PowerShell作为服务器管理的一个重要的脚本语言,能否对于这种问题有较好的解决方案呢?答案是有。

        微软提供了一个跨服务器调用的利器-psExec。关于psExec的详细介绍及其用法见MSDN官方网站:http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

其中值得一提的是pxExec可以指定被远程调用的应用程序在哪个(些)CPU上运行,也可以指定被远程调用的应用程序在哪个session里面运行,我们刚才说到我们的问题就是要让QTP和MSTest在同一个session里面运行。

        我们先使用powershell获取winlogon进程所在的session。然后我们远程启动PowerShell,在PowerShell里面使用MSTest,这个可以使用一个脚本文件。后面的工作就顺理成章了。那么我们如何在启动PowerShell的同时去让PowerShell run 一个脚本呢?这就涉及到给进程传参数。这种使用方式非常普遍,MSDos也支持这种方式,也是微软推崇的一种方式,很多微软提供的工具都支持这种方式。微软的WIX可以提供个性化的参数设置及支持,帮助做自动化安装部署,这个后面再阐述。

        这样我们做起来就很简单了。

        1) 获取winlogon 的 session

        $SessionID = (Get-Process -ProcessName "winlogon").SessionID

        2) 远程启动powershell

        D:\psExec \\192.168.1.197 -u administrator -p 1234 -i $SessionID powershell -File D:\runQTP.ps1

        3) 连接ALM,驱动ATP等

         C# code ...

        4)搜集结果

        runQTP.ps1很简单

        MSTest /testcontainer:D:\testproject.dll

        注意:可能需要设置MSTest的环境变量。

         

你可能感兴趣的:(powershell)