Как выполнить TDD и модульное тестирование в PowerShell?

Когда MS внедряет PowerShell во все новые серверные продукты, я начинаю (неохотно) думать, что мне нужно отнестись к этому серьезно. Часть "серьезного отношения" - это TDD. Вы нашли хорошие методы для модульного тестирования скриптов Power Shell?

Я нашел образцы насмешек от Mr Geek Noise - но мне бы очень хотелось что-то вроде RhinoMocks. Брайан Хартсок имеет образец запуска тестов на строках PowerShell из MS Test. Немного хакерский, но вроде работает.

Я хочу, чтобы опыт TDD Powershell был таким же чистым, как и на «настоящих» языках.


Обновите, чтобы уточнить:

Первые два ответа пытаются отвлечь меня от тестирования Powershell. Мнения интересные. Я не хочу знать, стоит ли тестировать в PowerShell. Это субъективный вопрос, который следует задать на другом форуме. Мне нужно решение для модульного тестирования PowerShell. Если вы думаете, что это плохая идея (возможно, так оно и есть), относитесь к ней как к забавному академическому вопросу.

  • Да, языки сценариев объединяют разрозненные системы. Однако, как уже отмечалось, на динамическом языке также легко имитировать и ломать швы.
  • Я не про "отладку" спрашиваю. Отладка - чрезвычайно полезная тема. Я позволю кому-нибудь другому спросить об этом.
  • Может быть, скрипты PS должны быть простыми. Язык поддерживает модульность, и в PS неизбежно будут реализовываться сложные процессы (даже если это плохая идея).
  • Ответ на этот вопрос - не «Вы не можете». Я вижу (из связанных блогов, которые немного устарели), что некоторые люди продвинулись вперед в решении этой проблемы.

Повторюсь: Как реализовать автоматическое тестирование логики Powershell в стиле xUnit? Интересны интеграционные тесты, особенно интересны модульные тесты, разрушающие зависимости.


person Precipitous    schedule 02.06.2009    source источник
comment
посмотрите stackoverflow.com/questions/1004424/ есть аналогичный вопрос с некоторыми ссылками (сообщение PSUnit и Ли Холмса)   -  person stej    schedule 17.06.2009
comment
Никогда не относитесь к Powershell легкомысленно. Это невероятно мощный инструмент с минимальным кодом.   -  person D3vtr0n    schedule 22.11.2012


Ответы (6)


Скотт Мук начал проект легкого фреймворка BDD для PowerShell под названием Pester:

https://github.com/pester/Pester

person Martin Suchanek    schedule 04.01.2011
comment
Намного более приятный дизайн, чем у PsUnit. Не требует гадания с профилями или установщиками. Я сделал это и начну использовать на этой неделе. - person Precipitous; 30.01.2011
comment
Вот статья в блоге Скотта о докторе scottmuc.com/ блог / разработка / - person Ameer Deen; 04.07.2011
comment
Я также написал серию из трех частей по TDD для PowerShell, используя Pester - см. Практическое модульное тестирование PowerShell - person Michael Sorens; 22.12.2015

PsUnit теперь обновлен с помощью фреймворка. У меня была та же проблема, что и у вас, несколько месяцев назад, и я почувствовал, что PsUnit был слишком большим и сложным для количества скриптов, которые мне приходилось писать, поэтому я написал свою собственную структуру модульного тестирования для PS. PS имеют такую ​​же характеристику, как и другие языки сценариев, такие как, например, python, т.е. вы можете переопределять функции в любом месте в любое время, даже с областью действия в методах тестирования, что отлично подходит для подделки (также известного как насмешка). То есть, если у вас есть функция или объект, который вы хотите протестировать, который зависит от других функций, вы можете объявить их в своем методе тестирования, чтобы создать локальную поддельную реализацию.

Итак, независимо от того, какую среду тестирования вы решите использовать, я бы сказал, что PS очень легко превратить в TDD. По крайней мере, это был мой опыт.

person Cellfish    schedule 21.08.2009
comment
PsUnit довольно приятный и легкий. - person Ian Patrick Hughes; 06.11.2011

Я думаю, вы спрашиваете о «стратегиях тестирования», а не конкретно о TDD, поэтому я отвечу на оба вопроса.

Основная часть вашей работы в PowerShell будет связана с интеграцией множества разрозненных систем с помощью командлетов и объектных конвейеров. Если вы хотите быть уверены, что ваши сценарии PowerShell работают, приложите как можно больше усилий для создания идеальной промежуточной среды, чтобы протестировать все эти системы как можно точнее.

Выполнение ваших скриптов в идеальной промежуточной среде будет бесконечно более ценным, чем «конкретизация вашего дизайна» с помощью TDD или «проверка намерения вашего кода» с помощью постфактуальных модульных тестов.

Небольшие заметки, которые могут помочь:

  • Переключатель -whatif существует во встроенных командлетах. Также я только что узнал, что вы тоже можете это сделать: -whatif:$someBool - вы узнаете, когда вам это понадобится.
  • ISE, входящий в V2, имеет отладчик. Сладкий.
  • Вы всегда можете написать собственный командлет на C # и делать там все, что захотите.
person Peter Seale    schedule 02.06.2009
comment
Хм ... ты тоже сомневаешься в его возможности. Обратите внимание, что блог Geek Noise демонстрирует решение для имитации (разрозненных систем). - person Precipitous; 03.06.2009
comment
Я предполагаю, что это возможно, но кого это волнует? Какой смысл знать, что вы ввели \\ server \ fileshare и в тесте, и в скрипте? Вы либо переопределите взаимодействие с внешними командлетами, либо вы будете тестировать взаимодействия только внутри своей собственной системы (которая в конечном итоге станет ОЧЕНЬ маленькой частью вашего скрипта). Я полагаю, что это имеет значение, но, опять же, вы получите Намного больше пользы от проведения реального тестирования в промежуточной среде (и, если возможно, в самом продукте). - person Peter Seale; 03.06.2009
comment
Ни системное, ни модульное тестирование не дают гораздо большей пользы - и то, и другое необходимо. Если я тестирую взаимодействие с внешними командлетами, это не модульный тест. Вот тривиальный пример общей логики, которая выигрывает от модульного тестирования / имитации: у нас есть сценарий после развертывания, который выявляет интересные ошибки в журнале событий Windows, исключая спам. Здесь выделяется шикарный стиль - командлет не нужен. Критерии фильтрации сложны и деликатны. Извлеките критерии where-объекта для работы и протестируйте различные входные данные. Легко придумать другие примеры. - person Precipitous; 22.08.2009

Мертвая дискуссия, но опасения живы.

Единственное, чего я не вижу в обсуждении полезности модульного тестирования PS, учитывая его предполагаемое использование, - это модули в корпоративной системе. Представьте себе настройку предприятия с центральным репозиторием для общих задач сетевого / файлового уровня, реализованных в PS. В этом случае у вас есть небольшое количество разработчиков и сетевых специалистов, у которых есть несколько частично совпадающие обязанности. Разработчик создает модуль, инкапсулирующий бизнес-логику, и его полезность сразу же признается, так что в кратчайшие сроки другие присоединяются и включают модуль в свои собственные усилия. Модуль включен во что угодно, от разовых интерактивных скриптов до клиентских приложений среднего размера; Хотя некоторые могут не согласиться с вариантами использования языка сценариев оболочки, эволюция в этой области является постоянной.

Я считаю, что в этом сценарии имеет смысл определить набор «контрактов» для этих общих модулей. Если обмен знаниями является неотъемлемой частью организации, возможно, более одного человека будут изменять эти модули. Наличие модульных тестов, подтверждающих целостность модулей, будет иметь большое значение для поддержания порядка и минимизации хаоса, таким образом поддерживая (возможно, увеличивая) ценность самих модулей.

Что касается предпочтительного подхода, я его еще не принял. PS вызывает в памяти текучую / динамичную / подвижную субстанцию. Сдерживать его внутри жесткой структуры, подобной той, что я видел с TDD, кажется неестественным. Однако, учитывая описанный выше сценарий, эту цель нельзя игнорировать. Неважно, я разорван, извини, что трачу твое время. Спасибо за чтение.

person Draghon    schedule 25.05.2012
comment
Это звучит несколько похоже на то, о чем я писал пару лет назад в разделе PowerShell & .Net - Building Systems as Toolkits - chrisoldwood.blogspot.co.uk/2011/11/. Я написал много клея на PS, и мне было бы удобнее, если бы я мог провести его модульное тестирование - особенно обработку ошибок, поскольку ее часто трудно смоделировать в тестовой среде. - person Chris Oldwood; 06.11.2013

Я пишу несколько базовых сценариев PowerShell с TDD, как в следующей модели:

Во-первых, спецификация в SUT_spec.ps1:

Import-Module -Name .\my_SUT.ps1

$case1_input=@{}
$case1_output=@{}
f1 $case1_input $case1_output

$case1_result = $case1_output["Output"] -eq "expected"
"f1 case1: $case1_result"

# repeat for all test cases

Remove-Module -Name my_SUT

Во-вторых, мой модуль (SUT) как функция в файле my_SUT.ps1:

function f1($the_input, $the_output)
{
    #take input from $the_input hashtable, process it and put output into $the_output hashtable.

    $the_output["Output"]="results"
}

В-третьих, готовая к выпуску основная точка входа в виде отдельного файла, такого как SUT_spec.ps1, но с входными данными из реальных внешних источников.

person Marco Dorantes    schedule 25.09.2019

Судя по вашему вопросу, я думаю, что вас ждет разочарование. Powershell - это всего лишь небольшой язык командной строки. Конечно, он может делать все, что может делать C #, и даже больше, но то же самое может делать язык ассемблера. Конечно, он тоже объектно-ориентированный и связан с библиотеками .NET, но так же и C #, который является гораздо более чистым языком.

Если решение длиннее, чем один лайнер, или вы считаете, что вам нужно выполнить TDD, тогда вы не хотите использовать Powershell. Это загадочный язык, полный сюрпризов, которого следует избегать в сложных случаях.

Если вы хотите выполнить специальный поиск и заменить или форматировать текст, или осмотреть свою файловую систему, тогда Powershell - ваш друг. Что вам действительно нужно, так это использовать его понемногу каждый день и часто повторять, чтобы оставаться знакомым с синтаксисом. По этой причине также избегайте библиотек Powershell с открытым исходным кодом и забудьте о написании собственных CmdLets, если у вас нет очень специализированного случая для использования специальной командной строки. Правила связывания труб загадочны и уродливы.

Это все, конечно, только мое мнение, но я давно пользуюсь Powershell и теперь мне намного больше нравится, когда я смотрю на это так.

person Mike    schedule 02.06.2009
comment
Я предполагаю, что сценарии PowerShell будут написаны, потому что MS настаивает на этом. Быстро станет полезным. Поскольку сценарии PS будут написаны, и они будут программами (какими бы скромными они ни были), я хочу, чтобы они были надежными. Итак, я хочу их протестировать. Вы можете не согласиться, но тогда давайте назовем это академическим упражнением: как бы вы провели модульное тестирование сценария PowerShell? Практический вывод может заключаться в том, что это слишком сложно (я думаю, что не невозможно), и я должен вместо этого использовать IronPython для написания сценариев, если я настаиваю на качестве. :) - person Precipitous; 02.06.2009
comment
Никто не сомневается, что TDD в Powershell возможен. Это определенно возможно, в конце концов, Powershell может делать все, что может C #, и даже немного. Функциональный характер Powershell теоретически может сделать его даже лучшим языком тестирования, чем C #. Проблема в том, что синтаксис и общий дизайн Powershell ... ну, уродливы и удивительны. Давайте поговорим еще раз после того, как у вас будет год опыта с этим ... - person Mike; 03.06.2009
comment
Я использую PS как минимум 3 года для повседневной работы (в основном для надежных файловых возможностей) - теперь мы можем поговорить :) Я согласен, что это некрасиво. Тем не менее, он обладает БОЛЬШОЙ функциональностью. Сюрпризы заключаются в том, ПОЧЕМУ я хочу это проверить. - person Precipitous; 03.06.2009
comment
Кстати, всякий раз, когда я задаю вопрос о Powershell, я также обычно получаю ответы, в которых говорится, что мне нельзя использовать Powershell, и редко получаю фактический ответ, поэтому я понимаю, что это раздражает. Прошу прощения за это! И есть случаи, когда Powershell - ваш единственный вариант, например, на сайтах клиентов. - person Mike; 03.06.2009
comment
Мне нравится PowerShell, и чем больше я использую и узнаю о нем, тем больше он мне нравится! Я думаю, что таких, как я, тоже немало. И не забывайте, что PowerShell - теперь большая часть Visual Studio в виде Консоль диспетчера пакетов NuGet. - person knut; 20.09.2012
comment
Спустя годы я все еще чувствую то же самое. Я здесь просто потому, что заметил, что регулярно теряю баллы из-за этого ответа. Быть по сему. :) Тем не менее, я все еще пользуюсь Powershell, иногда он бывает полезен, просто каждый раз, когда я возвращаюсь к нему, мне приходится его переучивать. Он просто не прилипнет. Кстати, иногда лучшим вариантом является JavaScript. - person Mike; 12.04.2013