TLDR; Эта статья охватывает основу для тестирования Puster, который вы используете для проверки скриптов PowerShell.
Зачем тестировать
Причина, по которой вы хотите иметь тесты, много:
- Правильность Отказ Убедитесь, что ваш код работает как предназначен для определенных сценариев.
- Уверенность Отказ Когда у вас много тестов, охватывающих ваш код, он создает уровень доверия. С этой уверенностью вы начинаете смешивать, чтобы изменить это, если вы, например, нужно будет рефакторизировать код и убедиться, что он все еще работает после этих изменений.
- Архитектура Отказ Еще одна причина наличия тестов заключается в том, что она приводит к приводу в архитектуру. Если вы создаете тесты вокруг того, что вы делаете, вы гарантируете, что вы построите свой код таким образом, чтобы это тестировалось. Это, приводит архитектуру Отказ
Есть много других причин желающих иметь тесты, но три выше вполне убедительно.
Что такое Pester
Putter — это тестовая каркас, предназначенная для PowerShell и является модулем, который вы можете установить. Он имеет несколько особенностей:
- Утверждения Отказ PESTER поставляется с разнообразными способами утверждения условий, которые будут определять, следует ли потерпеть неудачу ваши тесты или нет.
- В состоянии запустить тесты . Вы можете запустить тесты с PESTER, как один тест с одним куском ввода, а также одновременно тестирование многих различных входов одновременно.
- Может группировать ваши тесты в тестовых люксах Отказ Когда вы начинаете иметь несколько тестов, вы хотите, чтобы способ создать тесты на более крупные логические группы, это то, что являются тестовыми люксами.
- Способность насмешлить звонить Отказ В ваших тестах у вас могут быть вызова командам, которые выполняют побочные эффекты, такие как доступ к хранилище данных или созданию файла, например. Когда вы хотите, чтобы ваши тесты сосредоточиться на поведении на тестах, насмешливая идея.
Установить
Чтобы установить Petter, вы запускаете команду ниже.
Install-Module -Name Pester -Force
Как только он установлен, вы можете начать создавать ваши тесты.
С точки зрения страницы:
Petter работает на Windows, Linux, MacOS и в любом месте благодаря PowerShell. Он совместим с Windows PowerShell 3, 4, 5, 6 и 7. Pester 3 поставляется предварительно установлен с Windows 10
Наш первый тест
Для нашего первого теста мы узнаем, как писать тест, а также запустить его.
- Чтобы создать наш первый тест, создайте файл A-test.ps1.
- Добавьте следующий код:
Describe "A suite" { It "my first test" { $Value = "Value" $Value | Should -Be "Value" } }
Тест выше, есть Опишите
Конструкция, которая является объявлением набора и строковый аргумент, давая набор имени. В номере есть определение испытаний Это
, который также имеет строковый аргумент, который представляет имя теста. В тесте есть тест, где код установлен:
$Value = "Value"
И тогда он утверждается:
$Value | Should -Be "Value"
Обратите внимание на использование Должен ... , который определяет равенство между
$ Ценность и «ценность».
- Чтобы запустить тест, позвоните
Вызвут-Petter
(./для пути в Linux и MacOS а также , \ for windows):
Invoke-Pester ./A-Test.ps1
Результат работы теста:
Starting discovery in 1 files. Discovery found 1 tests in 6ms. Running tests. [+] //A-Test.ps1 42ms (11ms|26ms) Tests completed in 44ms Tests Passed: 1, Failed: 0, Skipped: 0 NotRun: 0
Более реальный тест
Первый тест был отличным в том, что он позволил нам понять механику тестирования и концепции, как набор, тест, и утверждение, как Должно быть
. Более настоящий просмотрный тест проверил бы код в файле сценария, который не находится в нашем тестовом файле. Вот шаги, которые мы возьмем дальше:
- Создайте файл сценария с нашим производственным кодом.
- Точечный источник сказал файл сценария.
- Создайте тест и запустите его.
Создать производственный код
У вас будет код, который вы хотите проверить, но давайте создадим этот файл сценария для демонстрации.
- Создать файл Get-tomato.ps1.
- Добавьте следующий код:
Function Get-Tomato() { new-object psobject -property @{ Name = "Tomato" } }
Этот код создаст пользовательский объект за каждый раз Get-Tomato ()
Функция вызывается.
- Давайте источник точка Это следующее так, сессия знает об этом:
. ./Get-Tomato.ps1
- Убедитесь, что ваша функция была подхвачена запуском:
Get-Tomato
Вы должны увидеть следующее в консоли:
Name ---- Tomato
Создать тест
Теперь, когда у нас есть наш производственный код, давайте автор теста дальше.
- Создать файл Get-Tomato. Tests.ps1 и дать ему следующий код:
Describe "Tomatoes" { It "Get Tomato" { $tomato = Get-Tomato $tomato.Name | Should -Be "Tomato" } }
- Запустите тест с
Вызвут-Petter
:
Invoke-Pester ./Get-Tomato.Tests.ps1
Вы должны увидеть следующий вывод:
Invoke-Pester ./Get-Tomato.Tests.ps1 Starting discovery in 1 files. Discovery found 1 tests in 6ms. Running tests. [+] //Get-Tomato.Tests.ps1 66ms (9ms|52ms) Tests completed in 68ms Tests Passed: 1, Failed: 0, Skipped: 0 NotRun: 0
Отлично вы провели тест на более реальный код.
Работа с побочными эффектами
У вас будет код, который вы пишете, что в конечном итоге выполняет побочные эффекты, как доступ к сетевому ресурсу или создать файл. Давайте посмотрим на такой случай, и насколько штестер обрабатывает его. Краткий ответ состоит в том, что вы можете использовать издевательства, конструировать, которое выполняется вместо фактической команды. Все, что вам нужно сделать, это сосредоточиться, чтобы правильное поведение случается
Обновить производственный код
Итак, в этом случае представьте, что наш производственный код теперь будет иметь больше функций Сохранить-помидор
который сохраняет объект к файлу.
- Обновите _get-tomato.ps1_file с этим кодом:
Function Save-Tomato() { Param( [string] $Name ) New-Item -ItemType File -Path ./Tomato.txt -Value $Name -Force }
- Точечный источник Код, чтобы убедиться, что он поднят:
. /Get-Tomato.ps1
Создать тест
Хорошо, так вы добавили Сохранить-помидор ()
к вашему файлу сценария. Теперь для теста. Ваш код звонит Новый элемент
, что создает новый файл. В рамках тестирования вы не хотите, чтобы он создал файл каждый раз, когда тест работает. Скорее всего, вы просто хотите увидеть, что тест делает то, что он должен, то есть, вызывая правильную команду/s. Итак, чтобы решить эту проблему, мы можем издеваться, заменить текущую реализацию Новый элемент
С нашим собственным.
Чтобы издеваться, нам сначала нужно заменить фактическую реализацию, как так:
Позвоните в команду. На данный момент вам нужно позвонить в команду, как вы обычно делаете. В вашем случае это означает, что вы звоните
Сохранить-помидор ()
:
Save-Tomato # this should call New-Item
- Проверять. Последняя часть процесса издевательства состоит в том, чтобы убедиться, что вы издеваетесь был назван
- Команда
Должен -Информировать
, позволяет вам указать, какую команду она должна вызвать, например:
Should -Invoke -CommandName New-Item -Times 1 -Exactly
Приведенный выше код проверяет Новый элемент
называется ровно один раз.
- Давайте поставим все это вместе как тест:
It "Save tomato" { Mock -CommandName New-Item -MockWith {} Save-Tomato "my tomato" Should -Invoke -CommandName New-Item -Times 1 -Exactly }
- Удалить Tomato.txt. а затем запустить тест с
Вызвут-Petter
вот так:
Invoke-Pester ./Get-Tomato.Tests.ps1
На данный момент ваши тесты должны успешно работать так:
Starting discovery in 1 files. Discovery found 2 tests in 8ms. Running tests. [+] /Users/chnoring/Documents/dev/projects/powershell-projects/articles/Get-Tomato.Tests.ps1 78ms (34ms|37ms) Tests completed in 80ms Tests Passed: 2, Failed: 0, Skipped: 0 NotRun: 0
Кроме того, обратите внимание, как Tomato.txt не создается, потому что вы издеваетесь на звонок к Новый элемент
, успех.
Поздравляю, вы узнали, как установить Test Framework Prester, поверх этого, вы научились автосит свои первые тесты и даже узнали, как издеваться на вызов фактическим командам. Чтобы узнать больше, посмотрите на страницу GitHub Github:
Pester GG Page.
Оригинал: «https://dev.to/azure/test-your-powershell-code-with-pester-4hlc»