개요
Pester는 PowerShell 생태계의 표준 테스트 프레임워크로, 함수·스크립트가 의도한 대로 동작하는지 자동으로 검증하는 테스트 코드를 작성하게 해 준다. Part 6에서 함수를 만들고 Part 7에서 오류 처리를 다뤘다면, 이 장은 “그 함수가 실제로 옳게 동작하는지 어떻게 확신할 것인가"라는 질문에 답하며 Part 8(테스트와 코드 품질)을 시작한다. Windows PowerShell 5.1부터 기본 내장되어 있고, PowerShell 7에서도 별도 설치 없이 널리 쓰인다.
정신 모델은 “Describe는 테스트 대상을 이름 붙여 묶는 상자, It은 ‘이런 상황에서는 이래야 한다’는 개별 주장 하나, Should는 그 주장이 실제로 참인지 확인하는 검사기"라는 것이다.
사용법
| |
종류
| 요소 | 역할 |
|---|---|
Describe | 테스트 대상을 묶는 최상위 블록(보통 함수 이름) |
Context | Describe 안에서 시나리오별로 테스트를 더 세분화(선택 사항) |
It | 검증 하나를 나타내는 최소 단위 |
Should -Be | 값이 예상과 같은지 비교하는 대표적인 어서션(-BeTrue, -Throw, -Contain 등도 있음) |
BeforeAll/BeforeEach | 테스트 실행 전 준비 작업(주로 테스트 대상 스크립트를 점 소싱으로 불러옴) |
Invoke-Pester | 작성한 테스트 파일(*.Tests.ps1)을 실행하는 cmdlet |
예시
| |
| |
| |
주의사항·함정
It 블록 안의 스크립트 블록은 파이프라인 결과를 Should로 직접 넘겨야 검증이 이뤄진다: Add-Numbers -A 2 -B 3을 그냥 실행만 하고 Should로 파이프하지 않으면, 결과가 화면에 출력만 될 뿐 아무것도 검증되지 않은 채 테스트가 “통과"로 표시된다 — 이는 진짜 통과가 아니라 애초에 아무것도 확인하지 않은 것이다. 예외를 검증할 때({ ... } | Should -Throw)처럼 스크립트 블록으로 감싸야 하는 경우와, 값 자체를 파이프하는 경우를 구분해야 한다.
BeforeAll에서 점 소싱을 빠뜨리면 테스트 대상 함수를 찾을 수 없다: 테스트 파일과 실제 함수 정의 파일은 보통 분리돼 있으므로, BeforeAll 블록에서 53장의 점 소싱(. $PSScriptRoot\파일.ps1)으로 명시적으로 불러오지 않으면 “함수를 찾을 수 없다"는 오류가 난다. $PSScriptRoot를 써서 테스트 파일이 어디서 실행되든 상대 경로가 깨지지 않게 하는 것이 관례다.
테스트가 서로의 상태에 의존하면 실행 순서가 바뀔 때 깨지기 쉽다: 한 It 블록에서 만든 변수나 파일을 다른 It 블록이 가정하고 사용하면, 테스트를 하나만 따로 실행하거나 순서가 바뀌었을 때 예상치 못하게 실패한다. 각 It은 독립적으로 실행 가능하게 작성하는 것이 원칙이다.
이식성: Bash에는 bats, Python에는 pytest가 있듯 PowerShell에는 Pester가 사실상 유일한 표준 테스트 프레임워크로 자리 잡았다는 점이 특징이다. Describe/It 구조는 RSpec·Jasmine 같은 BDD(행위 주도 개발) 스타일 프레임워크의 문법을 그대로 계승해, 테스트 코드 자체가 “이 함수는 이래야 한다"는 자연어 문장에 가깝게 읽힌다.
![Featured image of post [PowerShell] 71. Pester 소개 — Describe/It/Should](/post/powershell/pester-describe-it-should-powershell/wordcloud_hu_1595d5cec06619f2.webp)
![[PowerShell] 69. Start-Transcript — 세션 기록](/post/powershell/start-transcript-session-record-powershell/wordcloud_hu_6bb3daff0bcf01e6.webp)
![[PowerShell] 70. Set-PSBreakpoint — 스크립트 디버깅](/post/powershell/set-psbreakpoint-debugging-powershell/wordcloud_hu_ce0529ad2ee3374e.webp)
![[PowerShell] 71. Pester 소개 — Describe/It/Should](/post/powershell/pester-describe-it-should-powershell/wordcloud_hu_65e0d7d8ff97f59.webp)
![[PowerShell] 72. PSScriptAnalyzer — 정적 분석과 코딩 규칙](/post/powershell/psscriptanalyzer-static-analysis-powershell/wordcloud_hu_fb1acde140a2de4f.webp)
![[PowerShell] 73. Measure-Command — 성능 측정과 벤치마킹](/post/powershell/measure-command-benchmark-powershell/wordcloud_hu_b078f0ca79bf08ab.webp)
![[PowerShell] 114. New-Guid/Get-Random — 유틸리티 모음](/post/powershell/new-guid-get-random-utility-powershell/wordcloud_hu_e9ded1c7c447f201.webp)
![[PowerShell] 00. 과정 개요와 커리큘럼](/post/powershell/getting-started-powershell/wordcloud_hu_15979a96cd2a594f.webp)
![[PowerShell] 100. Get-Credential과 PSCredential 객체](/post/powershell/get-credential-pscredential-object-powershell/wordcloud_hu_e8db052a57f9c242.webp)