我将如何测试 PowerShell 函数是否正确地流式传输来自管道的输入?
How would I test that a PowerShell function properly streams input from the pipeline?
我知道如何编写一个函数来流式传输来自管道的输入。我可以通过阅读函数的源代码来合理地判断它是否会正常执行。但是,是否有任何方法可以实际 测试 正确的行为?
我接受 "testing" 的任何定义...是我可以 运行 或更自动化的一些手动测试。
如果您需要示例,假设我有一个将文本拆分为单词的函数。
PS> Get-Content ./warandpeace.txt | Split-Text
我如何检查它是否从管道流式传输输入并立即开始拆分?
向您的 Split-Text
函数添加一些 Write-Verbose
语句,然后使用 -Verbose
参数调用它。您应该实时看到输出。
您可以编写一个辅助函数,当管道项目传递给它并由下一个命令处理时,它会为您提供一些指示:
function Print-Pipeline {
param($Name, [ConsoleColor]$Color)
begin {
$ColorParameter = if($PSBoundParameters.ContainsKey('Color')) {
@{ ForegroundColor = $Color }
} else {
@{ }
}
}
process {
Write-Host "${Name}|Before|$_" @ColorParameter
,$_
Write-Host "${Name}|After|$_" @ColorParameter
}
}
假设您有一些功能要测试:
$Text = 'Some', 'Random', 'Text'
function CharSplit1 { $Input | % GetEnumerator }
filter CharSplit2 { $Input | % GetEnumerator }
你可以这样测试它们:
PS> $Text |
>>> Print-Pipeline Before` CharSplit1 |
>>> CharSplit1 |
>>> Print-Pipeline After` CharSplit1
Before CharSplit1|Before|Some
Before CharSplit1|After|Some
Before CharSplit1|Before|Random
Before CharSplit1|After|Random
Before CharSplit1|Before|Text
Before CharSplit1|After|Text
After CharSplit1|Before|S
S
After CharSplit1|After|S
After CharSplit1|Before|o
o
After CharSplit1|After|o
After CharSplit1|Before|m
m
After CharSplit1|After|m
After CharSplit1|Before|e
e
After CharSplit1|After|e
After CharSplit1|Before|R
R
After CharSplit1|After|R
After CharSplit1|Before|a
a
After CharSplit1|After|a
After CharSplit1|Before|n
n
After CharSplit1|After|n
After CharSplit1|Before|d
d
After CharSplit1|After|d
After CharSplit1|Before|o
o
After CharSplit1|After|o
After CharSplit1|Before|m
m
After CharSplit1|After|m
After CharSplit1|Before|T
T
After CharSplit1|After|T
After CharSplit1|Before|e
e
After CharSplit1|After|e
After CharSplit1|Before|x
x
After CharSplit1|After|x
After CharSplit1|Before|t
t
After CharSplit1|After|t
PS> $Text |
>>> Print-Pipeline Before` CharSplit2 |
>>> CharSplit2 |
>>> Print-Pipeline After` CharSplit2
Before CharSplit2|Before|Some
After CharSplit2|Before|S
S
After CharSplit2|After|S
After CharSplit2|Before|o
o
After CharSplit2|After|o
After CharSplit2|Before|m
m
After CharSplit2|After|m
After CharSplit2|Before|e
e
After CharSplit2|After|e
Before CharSplit2|After|Some
Before CharSplit2|Before|Random
After CharSplit2|Before|R
R
After CharSplit2|After|R
After CharSplit2|Before|a
a
After CharSplit2|After|a
After CharSplit2|Before|n
n
After CharSplit2|After|n
After CharSplit2|Before|d
d
After CharSplit2|After|d
After CharSplit2|Before|o
o
After CharSplit2|After|o
After CharSplit2|Before|m
m
After CharSplit2|After|m
Before CharSplit2|After|Random
Before CharSplit2|Before|Text
After CharSplit2|Before|T
T
After CharSplit2|After|T
After CharSplit2|Before|e
e
After CharSplit2|After|e
After CharSplit2|Before|x
x
After CharSplit2|After|x
After CharSplit2|Before|t
t
After CharSplit2|After|t
Before CharSplit2|After|Text
啊,我有一个非常简单的解决方案。这个概念是将您自己的步骤插入到具有明显副作用的管道中 before 您正在测试的函数。例如...
PS> 1..10 | %{ Write-Host $_; $_ } | function-under-test
如果您的待测函数是 "bad",您将看到 1..10 的所有输出两次,如下所示
1
2
3
1
2
3
如果被测函数懒惰地处理管道中的项目,您会看到交错的输出。
1
1
2
2
3
3
我知道如何编写一个函数来流式传输来自管道的输入。我可以通过阅读函数的源代码来合理地判断它是否会正常执行。但是,是否有任何方法可以实际 测试 正确的行为?
我接受 "testing" 的任何定义...是我可以 运行 或更自动化的一些手动测试。
如果您需要示例,假设我有一个将文本拆分为单词的函数。
PS> Get-Content ./warandpeace.txt | Split-Text
我如何检查它是否从管道流式传输输入并立即开始拆分?
向您的 Split-Text
函数添加一些 Write-Verbose
语句,然后使用 -Verbose
参数调用它。您应该实时看到输出。
您可以编写一个辅助函数,当管道项目传递给它并由下一个命令处理时,它会为您提供一些指示:
function Print-Pipeline {
param($Name, [ConsoleColor]$Color)
begin {
$ColorParameter = if($PSBoundParameters.ContainsKey('Color')) {
@{ ForegroundColor = $Color }
} else {
@{ }
}
}
process {
Write-Host "${Name}|Before|$_" @ColorParameter
,$_
Write-Host "${Name}|After|$_" @ColorParameter
}
}
假设您有一些功能要测试:
$Text = 'Some', 'Random', 'Text'
function CharSplit1 { $Input | % GetEnumerator }
filter CharSplit2 { $Input | % GetEnumerator }
你可以这样测试它们:
PS> $Text |
>>> Print-Pipeline Before` CharSplit1 |
>>> CharSplit1 |
>>> Print-Pipeline After` CharSplit1
Before CharSplit1|Before|Some
Before CharSplit1|After|Some
Before CharSplit1|Before|Random
Before CharSplit1|After|Random
Before CharSplit1|Before|Text
Before CharSplit1|After|Text
After CharSplit1|Before|S
S
After CharSplit1|After|S
After CharSplit1|Before|o
o
After CharSplit1|After|o
After CharSplit1|Before|m
m
After CharSplit1|After|m
After CharSplit1|Before|e
e
After CharSplit1|After|e
After CharSplit1|Before|R
R
After CharSplit1|After|R
After CharSplit1|Before|a
a
After CharSplit1|After|a
After CharSplit1|Before|n
n
After CharSplit1|After|n
After CharSplit1|Before|d
d
After CharSplit1|After|d
After CharSplit1|Before|o
o
After CharSplit1|After|o
After CharSplit1|Before|m
m
After CharSplit1|After|m
After CharSplit1|Before|T
T
After CharSplit1|After|T
After CharSplit1|Before|e
e
After CharSplit1|After|e
After CharSplit1|Before|x
x
After CharSplit1|After|x
After CharSplit1|Before|t
t
After CharSplit1|After|t
PS> $Text |
>>> Print-Pipeline Before` CharSplit2 |
>>> CharSplit2 |
>>> Print-Pipeline After` CharSplit2
Before CharSplit2|Before|Some
After CharSplit2|Before|S
S
After CharSplit2|After|S
After CharSplit2|Before|o
o
After CharSplit2|After|o
After CharSplit2|Before|m
m
After CharSplit2|After|m
After CharSplit2|Before|e
e
After CharSplit2|After|e
Before CharSplit2|After|Some
Before CharSplit2|Before|Random
After CharSplit2|Before|R
R
After CharSplit2|After|R
After CharSplit2|Before|a
a
After CharSplit2|After|a
After CharSplit2|Before|n
n
After CharSplit2|After|n
After CharSplit2|Before|d
d
After CharSplit2|After|d
After CharSplit2|Before|o
o
After CharSplit2|After|o
After CharSplit2|Before|m
m
After CharSplit2|After|m
Before CharSplit2|After|Random
Before CharSplit2|Before|Text
After CharSplit2|Before|T
T
After CharSplit2|After|T
After CharSplit2|Before|e
e
After CharSplit2|After|e
After CharSplit2|Before|x
x
After CharSplit2|After|x
After CharSplit2|Before|t
t
After CharSplit2|After|t
Before CharSplit2|After|Text
啊,我有一个非常简单的解决方案。这个概念是将您自己的步骤插入到具有明显副作用的管道中 before 您正在测试的函数。例如...
PS> 1..10 | %{ Write-Host $_; $_ } | function-under-test
如果您的待测函数是 "bad",您将看到 1..10 的所有输出两次,如下所示
1
2
3
1
2
3
如果被测函数懒惰地处理管道中的项目,您会看到交错的输出。
1
1
2
2
3
3