从纠缠测试输出调试信息



我正在用C#编写一个系统,它有很多功能需要测试。一个功能是一组PowerShell自定义cmdlet,用于管理我的系统。

我正在使用pester(v5(来测试我的cmdlet,并且将为我想要测试的许多场景提供大量测试用例。

我可以成功地使用pester,但我无法从测试中获得任何调试输出——只有测试报告。测试报告可以查看通过和失败的内容,但如果我失败了,那么我希望能够输出结果,为我提供出错的背景。

我已经尝试了我能想到的所有PesterConfiguration设置,但都没有用,例如

$PesterPreference = [PesterConfiguration]::Default
#$PesterPreference.Output.Verbosity = "Diagnostic"
$PesterPreference.Debug.WriteDebugMessages = $true
#$PesterPreference.Debug.WriteDebugMessagesFrom = "*"

例如,假设我有一个get-foocmdlet,它返回一个具有Thing属性的对象,该属性的值应为"Bar"

我可以编写一个纠缠测试来检查这一点,但我希望能够将返回的对象作为测试的一部分输出,以查看以下内容:

Name     Value
----     -----
Thing    Bar
Other    124
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
$obj = get-foo   
write-output $obj
$obj | Should -Not -BeNullOrEmpty
$obj.Thing | Should -Be "Bar"
}
}

如果没有获得输出的能力,那么我必须直接在PowerShell中重建纠缠器之外的测试设置和结构——这是一个痛苦的过程。

如果有人对如何获得我的产出有任何建议,我将不胜感激。

谢谢,

David

答案似乎是设置$VerboseReference="继续";在脚本中

例如

$VerbosePreference = "Continue"
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
$obj = get-foo   
$obj | out-string | write-verbose
$obj | Should -Not -BeNullOrEmpty
$obj.Thing | Should -Be "Bar"
}
}

将按预期转储$obj的详细信息。这也适用于$DebugPreference、$InformationPeference等

您可以通过使用-PassThru获得的结果对象来访问每次测试的StandardOutput。演示:

# Just using a container here to avoid creating a testfile
$container = New-PesterContainer -ScriptBlock {
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
function get-foo { 1..3  | % { "hello $_" } }
$obj = get-foo
write-output $obj
$obj | Should -Not -BeNullOrEmpty
}
}
}
$pesterResult = Invoke-Pester -Container $container -PassThru
$pesterResult.tests | Format-Table ExpandedPath, StandardOutput
ExpandedPath                             StandardOutput
------------                             --------------
Test My CmdLet.get-foo should return bar {hello 1, hello 2, hello 3}

我找不到任何配置选项来显示我在控制台上看到的相同内容,所以我使用PassThru和for循环打印之后的所有测试输出:

$(Invoke-pester -PassThru).Tests | ForEach-Object -Process {"-"*80;$_.Result + ": " + $_.Name;"-"*80;$_.StandardOutput}

最新更新