#powershell #nunit #pester
#powershell #nunit #pester
Вопрос:
В Pester 4 командлет предлагает возможность явного указания выходного пути.
Invoke-Pester -Script $testFile -PassThru -Verbose -OutputFile $tr `
-OutputFormat NUnitXml -CodeCoverage "$tmp/*-*.ps1" `
-CodeCoverageOutputFile $cc -Show All
В версии 5 этот параметр объявлен как устаревший набор параметров и выдает соответствующее предупреждение.
WARNING: You are using Legacy parameter set that adapts Pester 5 syntax to Pester 4 syntax. This parameter set is deprecated, and does not work 100%. The -Strict and -PesterOption parameters are ignored, and providing advanced configuration to -Path (-Script), and -CodeCoverage via a hash table does not work. Please refer to https://github.com/pester/Pester/releases/tag/5.0.1#legacy-parameter-set for more information.
Какая реализация запланирована для следующих версий? Если параметр больше недоступен, следует ли извлекать результаты тестирования из объекта result?
Ответ №1:
Для нового Pester 5 написана довольно хорошая документация, которую вы можете найти здесь: https://github.com/pester/Pester#simple-and-advanced-interface .
Эта ссылка должна привести вас к определенному разделу, который вы ищете.
По сути, они переместили конфигурацию в класс assembly [PesterConfiguration]
. Вы можете получить доступ к значениям по умолчанию, используя [PesterConfigruation]::Default
или, что более вероятно, преобразуя его в новый объект, который вы настроите с вашими конкретными параметрами и путем вывода. Вы могли бы сделать это следующим образом в качестве примера:
$configuration = [PesterConfiguration]@{
Run = @{
Path = $testFile
}
Output = @{
Verbosity = 'Detailed'
}
Filter = @{
Tag = 'Acceptance'
ExcludeTag = 'WindowsOnly'
}
Should = @{
ErrorAction = 'Continue'
}
CodeCoverage = @{
Enable = $true
OutputPath = $yourPath
}
}
Затем вы передаете этот объект конфигурации в Invoke-Pester . т.е. Invoke-Pester -Configuration $configuration
Вы все равно можете использовать некоторые параметры в этом «устаревшем» стиле, Pester просто накричит на вас, чтобы вы не слишком удивились, когда он устарел.
В качестве примечания — я не вижу формат nunit для тестового вывода, поэтому я не знаю, прекратили ли они это. Единственное, что я вижу, это ‘JaCoCo’.
Ответ №2:
Я использую Pester 5.1.1 для тестирования ресурсов Azure после их развертывания. В службах Azure DevOps я выполняю задачу PowerShell в конвейере, которая запускает один сценарий (Start-Pester.ps1 ), который, в свою очередь, вызывает тесты из другого сценария (после развертывания.Тесты.ps1) при передаче необходимых значений параметров.
Запуск-Pester.ps1
param(
[string]$SubscriptionId,
[string]$TenantId,
[string]$Username,
[string]$Password,
[string]$ResourceGroupName,
[string]$FunctionAppName,
[string]$EventHubNamespaceName,
[string]$EventHubNamespaceAuthorizationRuleName,
[string]$EventHubName,
[string]$EventHubAuthorizationRuleName,
[string]$EventHubAuthorizationRuleName1,
[string]$ModulePath,
[switch]$Publish,
[string]$ResultsPath
)
[string]$SubscriptionId = (Get-Item env:SubscriptionId).value
[string]$TenantId = (Get-Item env:TenantId).value
[string]$Username = (Get-Item env:Username).value
[string]$Password = (Get-Item env:Password).value
[string]$ResourceGroupName = (Get-Item env:ResourceGroupName).value
[string]$FunctionAppName = (Get-Item env:FunctionAppName).value
[string]$EventHubNamespaceName = (Get-Item env:EventHubNamespaceName).value
[string]$EventHubNamespaceAuthorizationRuleName = (Get-Item env:EventHubNamespaceAuthorizationRuleName).value
[string]$EventHubName = (Get-Item env:EventHubName).value
[string]$EventHubAuthorizationRuleName = (Get-Item env:EventHubAuthorizationRuleName).value
[string]$EventHubAuthorizationRuleName1 = (Get-Item env:EventHubAuthorizationRuleName1).value
$WarningPreference = "SilentlyContinue"
Set-Item Env:SuppressAzurePowerShellBreakingChangeWarnings "true"
[array]$ModuleName = @("Az.Accounts", "Az.Resources", "Az.EventHub", "Az.Functions")
foreach ($Module in $ModuleName) {
Install-Module $Module -Scope CurrentUser -Force -SkipPublisherCheck -confirm:$false -AllowClobber
Import-Module -Name $Module
Get-InstalledModule -Name $Module -AllVersions | Select-Object Name, Version
}
# Authentication
$Credentials = New-Object System.Management.Automation.PSCredential ($Username, $(ConvertTo-SecureString $Password -AsPlainText -Force))
Connect-AzAccount -Credential $Credentials -ServicePrincipal -Tenant $TenantId
# Subscription
Set-AzContext -Subscription $SubscriptionId
$PesterModule = Get-Module -Name Pester -ListAvailable | Where-Object { $_.Version -like '5.*' }
if (!$PesterModule) {
try {
Install-Module -Name Pester -Scope CurrentUser -Force -SkipPublisherCheck -MinimumVersion "5.0" -Repository PSGallery
$PesterModule = Get-Module -Name Pester -ListAvailable | Where-Object { $_.Version -like '5.*' }
}
catch {
Write-Error "Failed to install the Pester module."
}
}
Write-Host "Pester version: $($PesterModule.Version.Major).$($PesterModule.Version.Minor).$($PesterModule.Version.Build)"
$PesterModule | Import-Module
if ($Publish) {
if (!(Test-Path -Path $ResultsPath)) {
New-Item -Path $ResultsPath -ItemType Directory -Force | Out-Null
}
}
$Tests = (Get-ChildItem -Path $($ModulePath) -Recurse | Where-Object { $_.Name -like "*Tests.ps1" }).FullName
$Params = [ordered]@{
Path = $Tests;
Data = @{
ResourceGroupName = $ResourceGroupName;
FunctionAppName = $FunctionAppName;
EventHubNamespaceName = $EventHubNamespaceName;
EventHubNamespaceAuthorizationRuleName = $EventHubNamespaceAuthorizationRuleName;
EventHubName = $EventHubName;
EventHubAuthorizationRuleName = $EventHubAuthorizationRuleName;
EventHubAuthorizationRuleName1 = $EventHubAuthorizationRuleName1;
}
}
$Container = New-PesterContainer @Params
$Configuration = [PesterConfiguration]@{
Run = @{
Container = $Container
}
Output = @{
Verbosity = 'Detailed'
}
TestResult = @{
Enabled = $true
OutputFormat = "NUnitXml"
OutputPath = "$($ResultsPath)Test-Pester.xml"
}
CodeCoverage = @{
Enabled = $true
Path = $Tests
OutputFormat = "JaCoCo"
OutputPath = "$($ResultsPath)Pester-Coverage.xml"
}
}
if ($Publish) {
Invoke-Pester -Configuration $Configuration
}
else {
Invoke-Pester -Container $Container -Output Detailed
}
После развертывания.Tests.ps1
param(
[string]$ResourceGroupName,
[string]$FunctionAppName,
[string]$EventHubNamespaceName,
[string]$EventHubNamespaceAuthorizationRuleName,
[string]$EventHubName,
[string]$EventHubAuthorizationRuleName,
[string]$EventHubAuthorizationRuleName1
)
Describe "Structure Tests" {
BeforeAll {
if ($ResourceGroupName.Length -gt 0) {
$ResourceGroupData = Get-AzResourceGroup -Name $ResourceGroupName
}
if ($EventHubNamespaceName.Length -gt 0) {
$EventHubNamespaceData = Get-AzEventHubNamespace -ResourceGroupName $ResourceGroupName -Name $EventHubNamespaceName
$EventHubNamespaceAuthorizationRuleData = Get-AzEventHubAuthorizationRule -ResourceGroupName $ResourceGroupName -NamespaceName $EventHubNamespaceName -Name $EventHubNamespaceAuthorizationRuleName
}
if ($EventHubName.Length -gt 0) {
$EventHubData = Get-AzEventHub -ResourceGroupName $ResourceGroupName -NamespaceName $EventHubNamespaceName -EventHubName $EventHubName
$EventHubAuthorizationRuleData = Get-AzEventHubAuthorizationRule -ResourceGroupName $ResourceGroupName -NamespaceName $EventHubNamespaceName -EventHubName $EventHubName -Name $EventHubAuthorizationRuleName
$EventHubAuthorizationRuleData1 = Get-AzEventHubAuthorizationRule -ResourceGroupName $ResourceGroupName -NamespaceName $EventHubNamespaceName -EventHubName $EventHubName -Name $EventHubAuthorizationRuleName1
}
if ($FunctionAppName.Length -gt 0) {
$FunctionAppData = Get-AzFunctionApp -Name $FunctionAppName -ResourceGroupName $ResourceGroupName
}
}
# Resource Group
Context -Name "Resource Group" {
It -Name "Passed Resource Group existence check" -Test {
$ResourceGroupData | Should -Not -Be $null
}
}
# Event Hub Namespace
Context -Name "Event Hub Namespace" {
It -Name "Passed Event Hub Namespace existence check" -Test {
$EventHubNamespaceData | Should -Not -Be $null
}
It -Name "Passed Event Hub Namespace tier check" -Test {
$EventHubNamespaceData.Sku.Tier | Should -Be "Standard"
}
It -Name "Passed Event Hub Namespace TU check" -Test {
$EventHubNamespaceData.Sku.Capacity | Should -Be 1
}
It -Name "Passed Event Hub Namespace auto-inflate check" -Test {
$EventHubNamespaceData.IsAutoInflateEnabled | Should -Be $true
}
It -Name "Passed Event Hub Namespace maximum TU check" -Test {
$EventHubNamespaceData.MaximumThroughputUnits | Should -Be 2
}
It -Name "Passed Event Hub Namespace shared access policies check" -Test {
$EventHubNamespaceAuthorizationRuleData.Rights.Count | Should -Be 3
}
}
# Event Hub
Context -Name "Event Hub" {
It -Name "Passed Event Hub existence check" -Test {
$EventHubData | Should -Not -Be $null
}
It -Name "Passed Event Hub 'Listen' shared access policies check" -Test {
$EventHubAuthorizationRuleData.Rights | Should -Be "Listen"
}
It -Name "Passed Event Hub 'Send' shared access policies check" -Test {
$EventHubAuthorizationRuleData1.Rights | Should -Be "Send"
}
}
# Function App
Context -Name "Function App" {
It -Name "Passed Function App existence check" -Test {
$FunctionAppData | Should -Not -Be $null
}
It -Name "Passed Function App AppSettings configuration existence check" -Test {
$FunctionAppData.ApplicationSettings | Should -Not -Be $null
}
It -Name "Passed Function App APPINSIGHTS_INSTRUMENTATIONKEY existence check" -Test {
$FunctionAppData.ApplicationSettings.APPINSIGHTS_INSTRUMENTATIONKEY | Should -Not -Be $null
}
It -Name "Passed Function App FUNCTIONS_WORKER_RUNTIME value check" -Test {
$FunctionAppData.ApplicationSettings.FUNCTIONS_WORKER_RUNTIME | Should -Be "dotnet"
}
}
}
Как вы можете видеть, я перезаписываю [PesterConfiguration]::Default с моей конфигурацией.
И да, блок TestResult с NUnitXml также работает.
Просто добавьте задачу публикации результатов тестирования в конце конвейера. Он получит результаты тестирования и опубликует их.
Надеюсь, это поможет кому-то в будущем.
Ответ №3:
Они переместили многие параметры в новый объект конфигурации. Описано здесь: https://pester-docs.netlify.app/docs/commands/New-PesterConfiguration
Старый:
Invoke-Pester -Script $testFile -PassThru -Verbose -OutputFile $tr `
-OutputFormat NUnitXml -CodeCoverage "$tmp/*-*.ps1" `
-CodeCoverageOutputFile $cc -Show All
Новое:
$configuration = [PesterConfiguration]@{
PassThru = $true
Run = @{
Path = $testFile
}
Output = @{
Verbosity = 'Detailed'
}
TestResult = @{
Enabled = $true
OutputFormat = "NUnitXml"
OutputPath = $tr
}
CodeCoverage = @{
Enabled = $true
Path = "$tmp/*-*.ps1"
OutputPath = $cc
}
}
Invoke-Pester -Configuration $configuration