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

2008-10-13    | |
打印本文章
RSS

导读:本文介绍如何利用Hyper-V和PowerShell自动化构造测试环境。

关键词:Hyper-V PowerShell 测试环境

正在加载数据...

  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 "root\virtualization" -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 "root\virtualization" -ComputerName $hostServer;
$virtualSystemService = Get-WmiObject -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization" -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 "root\virtualization" -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 "root\virtualization" -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;
 }
}

原文出处:http://blog.ixpub.net/html/83/15069983-270558.html
来源:IT168    作者:WS2008:虚拟化    
  评论
相关的专家答疑
 
在4月22日,VMware发布了vSphere。VMware vSphere提供哪些版本?在许可方面的改动有哪些?本文将一一为您解答。
 
尽管vSphere的vCenter提供了许多有用的新功能,但是有三个小功能,尤其对于VMware Infrastructure 3来说最需要的……
 
VMware将VMware Infrastructure 3(基础建设)改为VMware vSphere 4(虚拟圈),可以看出这次新版产品的功能有较大的改进,以及VMware对于服务器虚拟化的企图心……
 
VMware ESX的下一版本只能运行在64位CPU上。因此你可能疑惑你目前的硬件是否是64位CPU,以便你能升级到vSphere。
 
北京时间4月20日晚间,Oracle(甲骨文)宣布以74亿美元收购Sun。不过Oracle收购Sun所产生的影响真正体现在虚拟化市场,由于是对VMware来说。
虚拟化部署项目包括几个阶段和重大的规划,以满足IT现有的技术环境。如果执行得正确,虚拟化部署的这些阶段能帮助你评估和测量现有的技术资产,并决定你的虚拟化需求。本手册将介绍虚拟化项目实施过程中的三大阶段,教您如何正确执行以便获得成功。
在之前的专题“虚拟桌面基础架构VDI”以及“桌面虚拟化VDI实施流程指导手册”中,我们学习了VDI的定义以及实施流程。在本专题中,我们主要学习VDI的使用情况,需要注意的事项及技巧。
什么是VMware vSphere?它主要有哪些新功能?如果升级到vSphere,硬件要求是什么?如何创建VMware vSphere子操作系统?VMware vSphere的亮点究竟在哪里?  2009年4月21日,VMware公司宣布推出新一代虚拟化平台VMware vSphere。这是VMware继三年前发布VMware ESX之后的又一重大举措。在本期技术手册中,我们将详细介绍VMware vSphere,从下面几个方面进行探讨……
最新更新
专家答疑
技巧
吴炫国
能否简单介绍一下Hyper-V的远程控制台功能?我不太清楚如何实现远程管理的功能,许多时候会出现RPC错误。我的环境是公网。
Serdar Yegulalp
在主机物理磁盘上如何排列虚拟硬盘最合适?排列虚拟硬盘的最佳方式是什么?如果你的服务器有三个驱动,宿主了两个虚拟操作系统,可以……
Scott Feuless
如果业务单位反对采用虚拟化的话,IT该怎么办?阻碍虚拟化采用的关键是什么?如何说服业务单位采用虚拟化?

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录