如何在PowerShell中进行TDD和unit testing?

随着MS Powerding到所有新的服务器产品,我开始(不情愿)认为我需要认真对待。 TDD是“认真对待”的一部分。 你有没有find好的方法来unit testing电源shell脚本?

我发现Geek Noise先生嘲笑的样品 – 但我真的很喜欢RhinoMocks 。 Brian Hartsock有一个MS Test的PowerShellstring运行testing样本。 有点哈克,但似乎工作。

我想要的是Powershell TDD的体验,就像“真实”的语言一样干净。


更新澄清:

前两个答案试图引导我远离testingPowershell。 意见很有趣。 我不想知道在PowerShell中testing是否是个好主意。 这是一个应该在另一个论坛上提出的主观问题。 我想要一个解决scheme来unit testingPowerShell。 如果你认为这是一个坏主意(可能是),把它当作一个有趣的学术问题。

  • 是的,脚本语言将不同的系统粘合在一起。 但是,正如已经指出的那样,用dynamic语言来模拟和断开接缝也是很容易的。
  • 我不是在问“debugging”。 debugging是一个非常有用的话题。 我会让别人问这个问题
  • 也许PS脚本应该很简单。 这种语言支持模块化,在PS中实现复杂的stream程是不可避免的(即使是一个坏主意)。
  • 这个问题的答案不是“你不能”。 我可以看到(从链接的博客 – 这是有点老),有些人已经在这个问题上取得了进展。

重新说明: 如何以xUnit的风格实现Powershell逻辑的自动化testing? 集成testing很有趣,unit testing可以打破最有趣的依赖关系。

Scott Muc已经为PowerShell开发了一个名为Pester的轻型BDD框架项目:

https://github.com/pester/Pester

PsUnit现在更新了一个框架。 我和你几个月前有同样的问题,我觉得PsUnit对于我必须编写的脚本数量来说太复杂了,所以我为PS编写了我自己的unit testing框架。 PS和其他脚本语言(如python)有相同的charectaristics,例如你可以随时随地重写函数,即使在testing方法中有作用域,这对伪造(aka mocking)很有用。 也就是说,如果你想要testing的函数或对象依赖于其他的函数,你可以在你的testing方法中声明它们来创build一个本地伪造的实现。

所以你select使用哪个testing框架的angular度我会说PS对于TDD来说非常容易。 至less这是我的经验。

我想你是在问“testing策略”而不是TDD,所以我会回答这两个问题。

PowerShell中的大部分工作将通过cmdlet和对象pipe道集成一系列不同的系统。 如果您想确信您的PowerShell脚本能够正常工作,请尽可能多地努力构build完美的临时环境,以便尽可能准确地testing所有这些系统。

在完美的分级环境中运行脚本将比通过TDD“充实devise”或通过事后unit testing“testing代码的意图”更有价值。

小笔记可能有助于:

  • -whatif开关存在于内置cmdlet中。 我也发现你也可以做到这一点: -whatif:$someBool – 当你需要的时候你会知道的。
  • V2中的ISE有一个debugging器。 甜。
  • 您可以随时在C#中编写自定义cmdlet,然后在其中执行任何操作。

死的讨论,但关切是非常活着的。

从unit testingPS的实用性的讨论中看出,我们所看到的一个事情就是在企业系统中使用模块。 试想一下,在PS中实现一个通用networking/文件级任务的中央存储库的企业设置。 在这种情况下,您只有less数开发人员和networking专家,这些开发人员和networking专家的职责略有重叠。 开发人员创build一个封装业务逻辑的模块,其用处立即得到确认,以便其他人立即跳入并将模块合并到自己的工作中。 该模块包含在从一次性交互式脚本到中型客户端应用程序的任何内容中; 虽然有些人可能不同意shell脚本语言的使用情况,但在这个领域里,进化是一个常数。

在这种情况下,我相信为这些常见模块定义一套“契约”是有价值的。 如果知识共享是组织不可或缺的组成部分,那么可能有多人修改这些模块。 通过unit testingvalidation模块的完整性将大大有助于维持秩序并最大限度地减less混沌,从而维持(也许会增加)模块本身的价值。

至于一个首选的方法,我还没有采取一个。 PS让人想起stream体/dynamic/敏捷的物质。 把它包含在一个刚性结构中,比如我所见过的TDD,感觉不自然。 但是,考虑到上述情况,这个目标不容忽视。 没关系,我很伤心,很抱歉浪费你的时间。 感谢您的阅读。

从你的问题,我认为你是失望。 Powershell只是一个小小的命令行语言。 当然,它可以做任何C#可以做的事,甚至更多,但汇编语言也是如此。 当然,它也是面向对象的,并且被.NET库所吸引,而C#也是如此,这是一个非常干净的语言。

如果一个解决scheme比一个class轮长,或者你认为你需要TDD,那么你不想使用Powershell。 这是一个充满惊喜的神秘语言,任何事情都要避免。

如果你想做一些特别的search,replace或格式化文本,或者在你的文件系统中查看,那么Powershell就是你的朋友。 你真正想要做的是每天使用它,经常重复自己,以便熟悉语法。 出于这个原因,也要避免使用开放源代码的Powershell库,而忘记编写自己的CmdLets,除非你有一个非常特殊的命令行使用情况。 pipe道绑定规则是神秘和丑陋的。

这当然只是我的看法,但我是一个很长时间的PowerShell用户,现在我更加高兴,因为我这样看待它。

Interesting Posts