如何对运行 PowerShell 脚本的 C# 库进行单元测试

How to unit test a C# library that runs PowerShell scripts

我有一个 C# 库,它运行几个 PowerShell 脚本来操作 Windows Hypervisor。 (例如打开和关闭虚拟机、使用 vhds 创建虚拟机、获取开关等)很难模拟环境并控制脚本的输出。 checking/validating 的脚本可能更容易,但用于操作目的的脚本可能会令人头疼,因为这些方法中的大多数可能是不可逆的。

我找到了一个很好的 PowerShell 单元测试框架 Pester。但是我的代码包含大量 C# 代码。有什么好的方法可以优雅地处理这个单元测试问题吗?

提前致谢!

这里有几点需要说明:

  1. 当你测试的代码做多个事情(单元)时,根据定义,它是一个集成测试,因为它测试多个单元的集成(@Xerillio 的评论).
  2. 当您测试的代码与基础架构(文件系统、数据库,在您的情况下 Powershell 和 VM 等)交互时,根据定义,它是一个集成测试。

您可以尝试在 C# 中的单独函数中提取少量代码并对它们进行单元测试,让您确定这些工作并在 Powershell 中做同样的事情(使用 Pester)。但真正的问题是;你想达到什么目的?我假设您想确保您的应用程序现在可以正常工作并在将来继续工作(不会倒退),在这种情况下,您可以更多地研究 端到端 方法进行测试。

  • 找到您的应用程序的最外部点与您可以从测试中交互的内容,这样您就可以测试堆栈的最大部分。
  • 检查您可以自动测试哪些部分而不会造成破坏(您提到“不可逆方法”)
  • 使用单元测试框架在 C#(如 xUnit)中设置测试,明确表达 SetupTeardown 阶段,分别设置所需的一切测试前和测试后清理(请记住,默认情况下测试可能 运行 并行,这不适用于文件系统上的共享资源等)

这避免了重写代码 just 因为你 want to unit test it。另一方面,提取纯单元可以更轻松地测试这些特定单元。