#powershell #jobs #cmdlet #pester
Вопрос:
Я использую pester для тестирования своих пользовательских командлетов. Тесты представляют собой сквозные тесты, которые запускают среду; компилируют и загружают сборки и выполняют тесты на динамически скомпилированном коде.
Мне нужно выполнить фактические тесты в новом процессе PowerShell (чтобы сборки можно было каждый раз компилировать и загружать), поэтому я использую start-job для запуска тестов в фоновом режиме start-job
и ожидания результатов receive-job -wait
. Что-то вроде этого:
Describe 'Run' {
It 'StartJobTest' {
start-job -script {invoke-pester .MyTests.Tests.ps1} | receive-job -wait
}
}
Все работает нормально, за исключением того, что я не могу получить статус успешного или неудачного теста, возвращаемый с задания, чтобы тест с вызовом pester мог быть отмечен как успешный или неудачный.
Кто-нибудь знает, как этого добиться. Я попробовал настроить $global:PesterPreference.Run.Exit = $true
, но это не имело никакого значения.
Любая помощь или предложения с благодарностью принимаются,
Дэвид
Ответ №1:
Я думаю, вам нужно использовать переключатель-PassThru:
Возвращает пользовательский объект (PSCustomObject), содержащий результаты теста. По умолчанию Invoke-Pester записывает данные в основную программу, а не в выходной поток (stdout). Если вы попытаетесь сохранить результат в переменной, переменная будет пустой, если вы не используете
PassThru
параметр.
Describe 'Run' {
It 'StartJobTest' {
$Results = Start-Job -Name Invoke-Pester -ScriptBlock {
Invoke-Pester -Path '.MyTests.Tests.ps1' -PassThru
} | Receive-Job -Wait -AutoRemoveJob
$Results.FailedCount | Should -BeExactly 0
}
}
P.S. В Pester v5 этот переключатель заменен на ConfigurationProperty
Run.PassThru
: https://pester.dev/docs/migrations/v4-to-v5
Комментарии:
1. Отлично… это сработало идеально. Спасибо.