Unit testing 如何在powershell中进行TDD和单元测试?
随着微软将powershell打入所有新的服务器产品,我开始(不情愿地)认为我需要认真对待它。“认真对待”的一部分是TDD。您找到了单元测试powershell脚本的好方法吗 我已经找到了来自的嘲弄样本,但我真的很喜欢类似的东西。具有对MS Test中的powershell字符串运行测试的示例。有点不对劲,但似乎有用 我想要的是Powershell TDD体验,它与“真实”语言一样干净Unit testing 如何在powershell中进行TDD和单元测试?,unit-testing,powershell,tdd,pester,Unit Testing,Powershell,Tdd,Pester,随着微软将powershell打入所有新的服务器产品,我开始(不情愿地)认为我需要认真对待它。“认真对待”的一部分是TDD。您找到了单元测试powershell脚本的好方法吗 我已经找到了来自的嘲弄样本,但我真的很喜欢类似的东西。具有对MS Test中的powershell字符串运行测试的示例。有点不对劲,但似乎有用 我想要的是Powershell TDD体验,它与“真实”语言一样干净 更新以澄清: 前两个答案试图引导我远离测试Powershell。这些意见很有趣。我不想知道在powershe
更新以澄清: 前两个答案试图引导我远离测试Powershell。这些意见很有趣。我不想知道在powershell中测试是否是个好主意。这是一个主观问题,应该在不同的论坛上提出。我想要一个单元测试powershell的解决方案。如果你认为这是一个坏主意(可能是),把它当作一个有趣的学术问题
- 是的,脚本语言将不同的系统粘合在一起。然而,正如已经指出的,在动态语言中模仿和打破接缝也很容易李>
- 我不是在问“调试”。调试是一个非常有用的话题。我会让别人问的李>
- 也许PS脚本应该很简单。该语言支持模块化,复杂的过程不可避免地会在PS中实现(即使这是个坏主意)李>
- 这个问题的答案不是“你不能”。我可以看到(从有点老的链接博客上)一些人在这个问题上取得了进展李>
重新声明:如何以xUnit的风格实现Powershell逻辑的自动测试?集成测试很有趣,打破依赖关系的单元测试最有趣 从你的问题来看,我认为你正在走向失望。Powershell只是一种小小的命令行语言。当然,它可以做C#可以做的任何事情,甚至更多,但汇编语言也可以。当然,它也是面向对象的,并与.NET库相连接,但C#也是如此,它是一种更干净的语言 如果一个解决方案比一行程序长,或者您认为需要TDD它,那么您就不想使用Powershell。这是一种充满惊喜的神秘语言,任何复杂的事情都要避免 如果您想进行一些特别的搜索、替换或格式化文本,或者在文件系统中四处查看,那么Powershell就是您的朋友。您真正想做的是每天使用一点,并经常重复,以便熟悉语法。出于这个原因,还应避免使用开源Powershell库,并忘记编写自己的cmdlet,除非您有特别的特殊情况可用于临时命令行。管道绑定规则既神秘又丑陋
当然,这只是我的观点,但我是一名长期使用Powershell的用户,现在我对它感到非常高兴。我想你问的是“测试策略”,而不是具体的TDD,所以我将回答这两个问题 您在PowerShell中的大部分工作将是通过cmdlet和对象管道集成一系列不同的系统。如果您想确信您的PowerShell脚本工作正常,请尽可能多地构建一个完美的登台环境,以便尽可能准确地测试所有这些系统 在完美的登台环境中运行脚本比通过TDD“充实您的设计”或通过事后单元测试“测试您的代码意图”更有价值 可能有帮助的小提示:
- 内置cmdlet上存在
开关。我还发现你也可以这样做:-whatif
-你会知道什么时候需要它-whatif:$someBool
- V2中的ISE有一个调试器。好极了
- 您始终可以在C#中编写自定义cmdlet,并在那里执行任何您想要的操作
所以,关于您选择使用哪个测试框架,我想说PS对于TDD来说非常容易。这至少是我的经验。Scott Muc已经启动了一个项目,为PowerShell开发一个名为Pester的轻量级BDD框架:
讨论已经结束,但人们的担忧依然存在 考虑到单元测试的预期用途,在讨论单元测试的有用性时,我发现缺少的一件事涉及到企业系统中的模块。设想一个企业设置,其中有一个用于在PS中实现的常见网络/文件级任务的中央存储库。在该设置中,您有少量的开发人员和网络专家,所有这些人的职责略有重叠。开发人员创建了一个封装业务逻辑的模块,它的有用性会立即得到认可,这样其他人很快就会加入并将该模块合并到他们自己的工作中。该模块包含在从一次性交互脚本到中型客户端应用程序的任何内容中;虽然有些人可能不同意shell脚本语言的用例,但在这个领域,进化是一个不变的概念 在这个场景中,我相信为这些通用模块定义一组“契约”是有价值的。如果知识共享是组织不可或缺的一部分,那么可能会有多人修改这些模块。让单元测试验证完整性
Import-Module -Name .\my_SUT.ps1
$case1_input=@{}
$case1_output=@{}
f1 $case1_input $case1_output
$case1_result = $case1_output["Output"] -eq "expected"
"f1 case1: $case1_result"
# repeat for all test cases
Remove-Module -Name my_SUT
function f1($the_input, $the_output)
{
#take input from $the_input hashtable, process it and put output into $the_output hashtable.
$the_output["Output"]="results"
}