用PowerShell和Hyper-V打造自动化测试环境

日期: 2008-10-12 来源:TechTarget中国 英文

  Microsoft终于在2008年6月26日发布了自己的又一款虚拟化产品Hyper-V。在Windows 2008中同时作为功能之一发布的Powershell则是Microsoft的新一代命令行Shell和脚本语言。有了这两样产品,对于那些做自动化测试的人员来说可谓是两个重要的好消息。这里我主要想介绍一下如何利用Hyper-V和PowerShell自动化构造测试环境。在使用Virtual Server2005的岁月里,测试人员主要是通过编写Javascript脚本访问它的COM接口来控制虚拟机。而到了Hyper-V时代,我们可以通过Hyper-V WMI(Windows Management Instrumentation)来对虚拟机做想要的操作。

  试想一下我们有这样一个测试需求:

  1.整个测试环境有多台测试机
  2.每次在跑自动化测试用例之前都需要安装要测试的产品
  3.测试产品不断更新,且每次都必须在干净的环境下安装

  为了节省自动化过程的时间,在Hyper-V中,我们可以做多个虚拟机,在做一番基本的配置之后,对每个虚拟机抓一个快照,由此作为起点。下面介绍PowerShell脚本对这些虚拟机的操作,主要做两件事:

  1.让虚拟机回到一个干净的状态,也就是我们之前抓得那个快照的状态。
  2.启动虚拟机

  先介绍两个函数,其中主要是WaitImageToState其功能是等待一台虚拟机变换到指定的状态,比如Hyper-V中虚拟机Running的状态码是2,就等到其状态变为2,当然还得有一个超时的Timeout设置:

function GetImageState
{
 param
 (
  [string]$image = $(throw “param -image is required.”),
  [string]$hostServer = $(throw “param -hostserver is required.”)
 )
 $virtualMachines = Get-WmiObject -Class “MSVM_ComputerSystem” -Namespace “rootvirtualization” -ComputerName $hostServer;
 foreach ($virtualMachine in $virtualMachines)
 {
  if ($image -ieq $virtualMachine.ElementName)
  {
   return $virtualMachine.EnabledState;
  }
 }
 throw “Cannot get the state of image [$image] on host server [$hostServer]”;
}
function WaitImageToState
{
 param
 (
  [string]$image = $(throw “param -image is required.”),
  [string]$hostServer = $(throw “param -hostserver is required.”),
  [int]$state = $(throw “param -$state is required.”),
  [int]$timeOut = $(throw “param -$timeOut is required.”)
 )
 do
 {
  $timeOut = $timeOut – 5;
  sleep (5);
  $currentState = GetImageState -image:$image -hostserver:$hostServer;
  if ($currentState -eq $state)
  {
   return;
  }
 
  if ($timeOut -le 0)
  {
   throw “Wait for image [$image] to state [$state] time out.”;
  } 
 }while($true);
}

  假设我们快照的名字叫Snapshot_StartPoint,托管机的名字叫ServerHasHyperVInstalled,下面的脚本可以恢复虚拟机到指定快照:

$snapshotName = “Snapshot_StartPoint”;
$hostServer = “ServerHasHyperVInstalled”;
$virtualMachines = Get-WmiObject -Class “MSVM_ComputerSystem” -Namespace “rootvirtualization” -ComputerName $hostServer;
$virtualSystemService = Get-WmiObject -Class “Msvm_VirtualSystemManagementService” -Namespace “rootvirtualization” -ComputerName $hostServer;
foreach ($virtualMachine in $virtualMachines)
{  
 if($virtualMachine.Caption -like “*Virtual Machine*”)
 {
  # get snapshot of the virtual machine
  $queryStr = “SELECT * FROM Msvm_VirtualSystemSettingData WHERE SystemName='” + $virtualMachine.Name + “‘ and SettingType=5”;
  $snapShots = Get-WmiObject -Query $queryStr -Namespace “rootvirtualization” -ComputerName $hostServer;
  foreach ($aSnapShot in $snapShots)
  {
   # revert to specified snapshot
   if ($aSnapShot.ElementName -ieq $snapshotName)
   {
    # apply snapshot
    $result = $virtualSystemService.ApplyVirtualSystemSnapShot($virtualMachine.__PATH, $aSnapShot.__PATH);
    if ($result.ReturnValue -ne 0)
    {
     throw “Failed to apply snapshot [“+$snapshotName+”] to VM [“+$image+”]”;
    }      
    WaitImageToState -image:$image -hostserver:$hostServer -state:3 -timeOut:120;
    Write-Host “Finished applying snapshot [$snapshotName] to VM [$image]”;
   }
  }
 }
}

  下面的代码是启动这些虚拟机:

$hostServer = “ServerHasHyperVInstalled”;
$virtualMachines = Get-WmiObject -Class “MSVM_ComputerSystem” -Namespace “rootvirtualization” -ComputerName $hostServer;
foreach ($virtualMachine in $virtualMachines)
{
 if($virtualMachine.Caption -like “*Virtual Machine*”)
 {
  $result = $virtualMachine.RequestStateChange(2);
  if ($result.ReturnValue -ne 4096)
  {
   throw “Failed to send start request to VM – ” + $virtualMachine;
  } 
  WaitImageToState -image:$virtualMachine -hostserver:$hostServer -state:$virtualMachineRun -timeOut:60;
 }
}

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • 回顾年度9大虚拟化技术

    虚拟化管理员从未放弃追寻更好虚拟化技术,以使他们的工作更快、更易于管理以及更好地优化。 我们看到,虚拟化工具在 […]

  • 从Azure VM到Hyper-V:想想这些技巧

    多年来,IT行业已经推动IT人员把工作负载转到云中。虽然在公有云中有一些好处,但有些工作负载更适合运行云本地数据中心中。

  • 功能多样的Get-VM PowerShell cmdlet,你知道多少?

    Hyper-V管理员能够使用Get-VM PowerShell cmdlet查看并调整一系列虚拟机配置信息。微软花费大量精力对PowerShell进行优化,以提升其对本地或者远程服务器的管理功能。

  • 支持Linux虚拟机:新版Hyper-V来帮忙

    大家都知道,Linux虚拟机无法利用Hyper-V针对Windows虚拟机提供的众多特性。幸运的是,情况已经发生变化,Hyper-V现在能够为Linux提供更多的支持。