PowerShell Script Analyzer, Script browser 和 Pester

简介:

昨天在MVA上看PowerShell5的最新功能的合集视频,第一个演讲人是微软PowerShell 开发组的经理,他提到了DevOp 的发展趋势,他认为对于PowerShell而言,除了基本的PowerShell的技能,还需要掌握以下基本的技能和工具:


  • PowerShell DSC

  • 版本控制 Git & Github

  • 脚本最佳优化 Script Analyzer

  • 单元测试 Pester



PowerShell DSC和Github 豆子倒是用过,后面两个是什么呢?


首先看看Script Analyzer,这个东东预定义了一堆policy,用来扫描你的脚本是否满足最佳实践,比如参数的位置啊,别名啊,明文密码等等。


安装很简单,如果已经安装了psget的模块,可以直接下载安装,然后激活即可,豆子用的win10,自己已经安装了因此可以直接下载


1
2
PS C:\> Install-Module -name psscriptanalyzer
PS C:\>  Enable-ScriptAnalyzer


可以在ISE 的Add-On看见多出来的选项,勾选之后出现一个新的窗口

wKioL1dg3PfCWGzXAAAiWaiIbRk164.png


随便打开一个脚本文件扫描一下 就能看见一堆警告,比如下面的警告因为我用了大量的别名而不是全称


wKiom1dg2-eACxCQAAEd3JcYlFY579.png



顺便提一下和这个一起常见的的插件 Script Browser, 安装方式很类似


1
2
PS C:\> Install-Module -name scriptbrowser
PS C:\>  Enable-ScriptBrowser


这个script browser的功能允许我们直接在微软的脚本中心里面搜索自己需要的脚本,比如我输入cpu,那么相关的脚本自动就出来了

wKiom1dg3M3hxEnMAAEZ3ZVlO74773.png


最后来看看什么是 Pester。


Pester 是基于TDD方式的单元测试框架。TDD(Test-Driven Development)的意思是我们想实现某个功能,我们先写一个测试的代码出来,然后执行他会报错,因为真正的功能代码我们还没实现;然后我们再根据我们预先写好的测试代码,倒过来去写功能以便他能通过测试。当测试功能都通过的时候 我们认为这个开发的功能就实现了。


首先下载模块,这个可以从github或者powershell gallery下载, 目前的版本是3.4

1
PS C:\>  import-module  pester -force


看看这个模块有哪些命令,功能很多,这里作为入门演示,我们只用的上几个最基本的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PS C:\>  Get-Command  -Module pester
CommandType     Name                                               Version    Source                           
-----------     ----                                               -------    ------                           
Function         AfterAll                                           3.4.0      pester                           
Function         AfterEach                                          3.4.0      pester                           
Function         Assert-MockCalled                                  3.4.0      pester                           
Function         Assert-VerifiableMocks                             3.4.0      pester                           
Function         BeforeAll                                          3.4.0      pester                           
Function         BeforeEach                                         3.4.0      pester                           
Function         Context                                            3.4.0      pester                           
Function         Describe                                           3.4.0      pester                           
Function         Get-MockDynamicParameters                           3.4.0      pester                           
Function         Get-TestDriveItem                                   3.4.0      pester                           
Function         In                                                  3.4.0      pester                           
Function         InModuleScope                                      3.4.0      pester                           
Function         Invoke-Mock                                         3.4.0      pester                           
Function         Invoke-Pester                                       3.4.0      pester                           
Function         It                                                 3.4.0      pester                           
Function         Mock                                               3.4.0      pester                           
Function         New-Fixture                                         3.4.0      pester                           
Function         New-PesterOption                                    3.4.0      pester                           
Function         SafeGetCommand                                     3.4.0      pester                           
Function         Set-DynamicParameterVariables                       3.4.0      pester                           
Function         Set-TestInconclusive                                3.4.0      pester                           
Function         Setup                                              3.4.0      pester                           
Function         Should                                             3.4.0      pester


现在来看个实际的例子,比如说我想写一个function来测试能否ping通一个计算机。按照TDD的逻辑,我实现这个功能之前,先把他的测试代码写出来。


首先学习第一个命令是new-fixture,指定一个目录和function的名字,他会自动创建一个目录,并且在这个目录下创建两个文件出来。第一个文件是我需要实现功能的脚本文件;第二个是这个功能脚本对应的测试文件。后者在前面的名字后自动加了一个tests的后缀


1
2
3
4
5
6
PS C:\temp\tester>  New-Fixture  -Path PingHostExample -Name pinghost
     Directory: C:\temp\tester\PingHostExample
Mode                LastWriteTime         Length Name                                                          
----                -------------         ------ ----                                                          
-a ----       15/06/2016   2:11 PM             29 pinghost.ps1                                                  
-a ----       15/06/2016   2:11 PM            261 pinghost.Tests.ps1


psedit 直接在ISE里面打开看看自动生成的内容

1
2
PS C:\temp\tester> psEdit .\PingHostExample\pinghost.ps1
PS C:\temp\tester> psEdit .\PingHostExample\pinghost.Tests.ps1


第一个是空的


wKioL1dg4XjzEhqQAAA5kZ5xPcc058.png


第二个自动生成一个测试的模板;注意前两行的作用是获取当前目录,然后获取第一个脚本的名字,然后dot source 导入到内存里面。


Describe的意思这一组测试的名字是啥; It代表的每一个单独的测试,后面跟了个名字, 大括号里面有个管道,管道前面是要执行的操作;后面是理论上应该出现的结果;他们会进行匹配,如果失败,就会报错。

wKiom1dg4GeR-RX6AABte5cIT74569.png


现在来执行一下试试看, invoke-Pester这个命令会自动的在当前目录和子目录下寻找执行 test.ps1命名的脚本,当然也可以指定某个目录搜索


结果报错。这是正常的,因为pinghost.ps1里面现在是空的。 可以看见报错命令是返回结果是true,而我们定义的测试文件期望返回值为false 所以报错

wKiom1dg4XHRj2heAABBlvCLlMY660.png


现在修改一下我的脚本

1
2
3
4
5
6
function  pinghost {
param (
[string] $computername = $env:COMPUTERNAME
)
Test-Connection  -ComputerName  $computername  -Quiet -Count 1
}


测试脚本

1
2
3
4
5
6
7
8
9
10
11
Describe  "pinghost"  {
     It  "Ping Localhost"  {
         pinghost | Should Be  $true
     }
     It  "Ping DC"  {
         pinghost -computername ( get-addomaincontroller ).hostname | Should be  $true
     }
     It   "Not Exist" {
         pinghost -computername  "XXX"  | Should be  $false
     }
}


执行看看,成功

wKioL1dg49aCHoSKAAApJeyI3CM822.png



Pester有很多function,上面的例子仅仅介绍了最简单的几个。接下来博客豆子会进一步说明其他function。


PowerShell的开发和使用是微软系统未来的方向,比如最新的windows 2016 nano server就完全摒弃了本地登录和图形界面,只能通过powershell进行远程配置。现在看来,掌握了基本的PowerShell 完全不够,未来需要学习的东西还有很多。







本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1789459,如需转载请自行联系原作者

目录
相关文章
|
Docker Windows 容器
Containers feature is disabled. Enable it using the PowerShell script (in an administrative PowerShe
Containers feature is disabled. Enable it using the PowerShell script (in an administrative PowerShe
135 0
|
1月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
39 0
|
2月前
|
Windows
Powershell 重新排列去重 Windows环境变量
【9月更文挑战第13天】本文介绍如何使用PowerShell对Windows环境变量进行重新排列和去重。首先通过`$env:`访问环境变量,接着使用`-split`命令分割路径,再利用`Select-Object -Unique`去除重复项。之后可根据需要对路径进行排序,最后将处理后的路径组合并更新环境变量。注意修改环境变量前应备份重要数据并了解潜在影响。
127 10
|
6月前
|
存储 Ubuntu Linux
windows可以安装Ubuntu,ubuntu上也可以安装Powershell
powerhsell除了可以在windows上使用外,还可以在Ubuntu上部署开发环境。下面介绍Ubuntu上安装powershell的方法。
203 0
下一篇
无影云桌面