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中国
相关推荐
-
回顾年度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提供更多的支持。