자바스크립트를 활성화 해주세요

p044 Pester모듈의 테스트 파일을 빨리 만드는 템플릿

 ·  ☕ 3 min read

powershell 모듈은 만들었습니다. 함수도 이미 많이 만들었습니다. Pester 모듈을 사용하는 테스트를 빨리 만드는 팁은 없을까요?

우선 Pester에 New-Fixture라고 하는 명령어가 있습니다. 단 3.4.0 버전입니다. 최근 버전에는 실장되어 있지 않은 것 같습니다.

New-Fixture

1
2
3
4
5
PS C:\www> gcm new-fixture

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        New-Fixture                                        3.4.0      Pester

이 함수를 사용하려고 생각하셨다면, 함수를 만들 때에 사용하셨어야합니다. 이 명령어는 함수를 정의하는 파일 하나와 그의 테스트파일 하나, 즉 두개의 ps1 파일을 생성해 냅니다. 만드는 자리는 옵션을 주지 않았다면 현재 디렉토리입니다. 예를 들어 다음 명령을 실행하였다면

New-Fixture Clean

.\Clean.ps1 파일 하나와

1
2
3
function Clean {

}

.\Clean.Tests.ps1 파일 하나를 생성해 냅니다. 함수 파일을 로드하는 코드까지 만들어 줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"

Describe "Clean" {

    It "does something useful" {
        $false | Should Be $true
    }
}

우선 Pester의 Test파일은 Describe > Context > It 순서로 외우시면 편합니다.

하나의 테스트파일에는 여러개의 Describe가 있을 수 있습니다.

Describe는 함수단위로 설정하는 경우가 많습니다. 그다음은 Context.

위의 에제에서는 Context라는 Layer가 없습니다만, 실제로 사용하실 때는 Context도 함께 사용합니다. Context는 주로

  • 정상작동테스트
  • 이상작동테스트

또는

  • 로컬환경
  • 개발환경
  • 스테이징 환경
  • 프러덕션 현경

별로 나누기도 합니다.

It은 그냥 하나의 단위 테스트를 나타냅니다.

Should

가능하면 최근버전, 엄밀히 말하면 버전 4 이상을 사용하는 것이 좋습니다. Windows10에서 기본으로 설치되어 있는 Pester의 버전이 3.4.0입니다만, 몇 가지 개선사항이 있습니다.

예를 들면 New-Fixture라는 명령어도 사라지고 (추측입니다만 함수의 파일과 Tests의 파일이 같은 디렉토리에서 생성되는 것을 강제하는 느낌이어서 제외시킨 것 같습니다.) 서브커맨드 형식이었던 Be 등이 옵션인 -Be등으로 바뀌었습니다. 이쪽이 훨씬 IntelliSense등으로 Suggestion하기에는 더 적합합니다. 즉 IDE에서 지원해 주는 기능이 더 많기 때문에 가능하면 최근 버전을 사용하는 것이 좋습니다.

Should 는 테스트 ScriptBlock 안에서만 씌여져야 합니다. 그렇지 않으면 에러를 냅니다. 가장 간단한 형태의 테스트는 다음과 같습니다.

PS C:\www> describe "test" { it "test" { 1 | should -Be 1} }
Describing test
 [+] test 67ms

기타 Should의 활용법은 다음과 같습니다.

  • 1 | Should Be 1
  • {throw “error”} | Should -Throw
  • “aaa” | Should -Be “aaa”
  • $Null | Should -BeNullOrEmpty
  • 5 | Should -BeGreaterThan 0
  • “.\Test1.ps1” | Should -Exist
  • “tkim.info” | Should -BeOfType System.String
  • “ABCDefg” | Should -BeLike “ab*”
  • “ABCDefg” | Should -BeLikeExactly “ab*”

결과 보존하기

1
Invoke-Pester -OutputFormat NUnitXml -OutputFile text_result.xml

응용 1

파일이 아니라 모듈을 다시 load할 필요가 있다면 Import-Module을 고려하거나,

1
2
Get-Module "모듈명" | Remove-Module -Force
Import-Module "모듈명 또는 모듈 Path" -Force

응용 2

결과와 기대값을 배열로 준비해 두거나

1
2
3
4
5
6
$results = Invoke-FizzBuzz -Start 1 -End 15
$expects = 1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz'
$results.Count | Should -Be $expects.Count
for ($i = 0; $i -lt $results.Count; $i++) {
    $results[$i] | Should -Be $expects[$i]
}

응용 3

모듈이 완성된 경우에는 다음의 템플릿을 이용하여 테스트 파일을 만들거나 할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import-module Rcommon
$names = (gcm -module Rcommon).Name
foreach ($n in $names) {
    $content = @"
Describe "Testing $n" -tags "$n",'tkim' {

    BeforeAll {
     	`$ItArgs = @{}
    }

    Context "development configuration" {

        BeforeAll {
        	`$env:ENVMode = "development"
        }
        BeforeEach {}
        AfterEach {}
        AfterAll {}

        It "should throw exception for invalid parameter" {
            { $n `$null } | Should -Throw "parameter missing or invalid parameter"
        }
    }
}
"@ > "$n.Tests.ps1"

이로서 기본적인 Pester의 사용법을 알아보았습니다. 다음번에는 Mocking의 응용을 살펴보려고 생각하고 있습니다.

레퍼런스

공유하기

tkim
글쓴이
tkim
Software Engineer