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


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

Я нашел образцы насмешек от Мистер Гик Шум - но мне бы очень хотелось что-то вроде RhinoMocks. Брайан Хартсока имеет образец выполнения тестов на строки powershell из MS Test. Немного суховато, но кажется, это работает.

то, что я хочу, это опыт Powershell TDD, который так же чист, как и на "реальных" языках.


обновление для уточнения:

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

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

переформулировать: как реализовать автоматизированное тестирование логики Powershell в стиле xUnit? интеграционные тесты интересны, модульные тесты, которые разбивают зависимости наиболее интересными.

5 64

5 ответов:

Scott Muc запустил проект для облегченной платформы BDD для PowerShell под названием Pester:

https://github.com/pester/Pester

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

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

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

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

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

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

  • The -whatif переключатель существует на встроенные командлеты. Также я только что узнал, что вы можете сделать это:-whatif:$someBool - вы будете знать, когда вам это нужно.
  • ISE, входящий в V2, имеет отладчик. Сладкий.
  • вы всегда можете закодировать пользовательский командлет в C# и сделать все, что вы хотите есть.

мертвая дискуссия, но проблемы очень живы.

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

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

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

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

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

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

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