(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
PowerShell
PowerShell 1 min

Pester: testes automatizados para scripts PowerShell e infraestrutura

João Barros 12 de May de 2026 1 min de leitura

O Pester é o framework de testes nativo do PowerShell, incluído no Windows por defeito e usado para validar scripts, módulos e configuração de infraestrutura. Testes com Pester tornam scripts PowerShell production-ready.

Instalar e estrutura básica

Install-Module Pester -Force -Scope CurrentUser

# Estrutura de um ficheiro de testes (Get-UserInfo.Tests.ps1)
BeforeAll {
    . "$PSScriptRoot/Get-UserInfo.ps1"  # importar o script a testar
}

Describe "Get-UserInfo" {
    Context "Utilizador válido" {
        It "Retorna objecto com DisplayName" {
            $result = Get-UserInfo -UPN "admin@empresa.pt"
            $result.DisplayName | Should -Not -BeNullOrEmpty
        }
        It "Retorna email correcto" {
            $result = Get-UserInfo -UPN "admin@empresa.pt"
            $result.Mail | Should -Be "admin@empresa.pt"
        }
    }

    Context "Utilizador inválido" {
        It "Lança erro para UPN inválido" {
            { Get-UserInfo -UPN "naoexiste@empresa.pt" } | Should -Throw
        }
    }
}

Mocking — isolar dependências externas

BeforeAll { . "$PSScriptRoot/Send-Report.ps1" }

Describe "Send-Report" {
    It "Chama Send-MailMessage com destinatário correcto" {
        Mock Send-MailMessage { }  # não envia email real

        Send-Report -To "gestor@empresa.pt" -Subject "Relatório"

        Should -Invoke Send-MailMessage -Times 1 `
            -ParameterFilter { $To -eq "gestor@empresa.pt" }
    }
}

Testes de infraestrutura Azure

Describe "Infraestrutura Azure — rg-analytics-prod" {
    BeforeAll { Connect-AzAccount -Identity }

    It "Storage Account existe" {
        Get-AzStorageAccount -ResourceGroupName "rg-analytics-prod" `
            -Name "stadatalakeprod" | Should -Not -BeNullOrEmpty
    }
    It "Key Vault tem soft-delete activado" {
        $kv = Get-AzKeyVault -VaultName "kv-bconcepts-prod"
        $kv.EnableSoftDelete | Should -Be $true
    }
}

Integrar no Azure DevOps

- task: PowerShell@2
  inputs:
    targetType: inline
    script: |
      Install-Module Pester -Force -Scope CurrentUser
      $result = Invoke-Pester -Path ./tests -PassThru
      if ($result.FailedCount -gt 0) { exit 1 }

Conclusão

Scripts PowerShell sem testes são um risco em produção. Pester torna trivial escrever testes unitários (com mocks para isolar APIs) e testes de infraestrutura (para validar estado pós-deploy). Integre-os em pipelines CI/CD para prevenir regressões.

Partilhar: