Pull to refresh

Powershell для тестировщиков

Reading time 4 min
Views 29K


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

У меня точно такая же проблема, поэтому давайте начнем вместе. Почти в каждой современной версии Windows уже установлено «расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев». Использует оно «класссы» из .NET. На практике это значит, что мы можем работать с объектами.

На этом, пожалуй, закончим с теорией и приступим к практике. Запускаем команду «Выполнить» и пишем powershell. Появляется красивое окошечко приятного цвета. Почти все в powershelle делается через командлеты, которые похожие на всем нам знакомые функции.

Самый важный командлет это Get-Help. Он выводит справочную информацию. Например:

Get-Help Get-Help

– выдаст справку по Get-Help. Кстати, в консоли работает автодополнение по нажатию клавиши Tab.

Консоль — это, конечно, хорошо, но писать большие скрипты в ней не очень то удобно. Для этого есть Powershell ISE.
Запускается по аналогии: «Выполнить» — powershell_ise.

Видим мини IDE c возможностью отладки и прочими приятностями. В ней же мы можем сохранить наши труды в готовые скрипты с расширением ps1.

Пишем наш первый скрипт, сохраняем и пытаемся выполнить. Потеря-потерь — ничего не получается. Дело в том, что по умолчанию отключено выполнение скриптов. Изменим это — запускаем PowerShell с админскими правами и пишем:

Set-ExecutionPolicy RemoteSigned

Тем самым, установив политику выполнения скриптов – разрешить запуск скриптов, исключая совсем уж сомнительные. Не безопасно, но на первое время пойдет.

Теперь настала пора более полезных вещей. Для начала будем анализировать логи. Используем Get-ChildItem, который, как видно из названия, дает нам дочерние, в том числе вложенные элементы из какой-нибудь папки.
Собственно, сама папка задается параметром -Path.
Include — помогает нам искать по маске,
Recurse — значит что надо искать во вложенных папках.

В результате у нас получится что-то вида:

Get-ChildItem -Path “D:\Logs” -Include *.log -Exclude "!*" –Recurse

Здесь мы ищем все файлы с расширением .log, исключая файлы начинающиеся с !, в папке D:\Logs. Для дальнейшей работы нужно передать все объекты, что нашел Get-ChildItem на обработку. Делается это оператором | — он называется конвейер.

Get-ChildItem -Path $input_path -Include *.log -Exclude "!*" -Recurse | select-string -Pattern $text -Encoding "Default" -Context 0,10

Разберем то, что мы здесь понаписали: поочередно ищем в каждом файле, что дал нам Get-ChildItem строку совпадения по переменой $text. В этой переменной мы напишем строки, которые захотим найти в логах. -Encoding нужен для того, чтобы русский текст, если он есть в наших логах, отображался нормально, но не кракозябрами. -Соntext (начиная с Powershell версии 2.0) выводит вам строки до и после вхождения искомых символов.

Теперь о $text. Как вы уже заметили, переменные должны начинаться с символа «$».

$text = ‘(Fatal|Error|access|)’
Используя регулярное выражение, мы ищем все строки, где есть или Fatal или Error или acces.

Скрипт, в принципе, готов, но чего-то не хватает. Мы даем ему кучу логов и на выходе получаем мешанину строк. Лучше причесать вывод и, по возможности, куда-нибудь сохранить для дальнейшего анализа. В этом нам поможет переменная $_ — грубо говоря, текущий объект, переданный нам. В нашем случае это будет конкретный файл с логом. Например, $_.FileName — имя файла, $_.LineNumber — номер строки, где совпал наш текст, ну и так далее. На выходе получаем:

$text = ‘(Fatal|Error|access)’
Get-ChildItem -Path $input_path -Include *.log -Exclude "!*" -Recurse |
select-string -Pattern $text -Encoding "Default" -Context 0,10 |
foreach {@($_.FileName), @($_.LineNumber), @($_.Line), @($_.Context.PostContext)} > $output_file


> — запишет вывод в указанный файл.

Можно доработать наш скрипт под различные нужды. Например, надо определить, где метод выполнялся слишком долго. Мы знаем, что в нашем логе время выполнения метода пишется так — "(128 мс)". Поэтому надо найти всё, что выполняется больше 1000 мс. Меняем переменную $text=’(\d{3,} мс)’ — это значит, будем искать «скобочку», за ней число, где не менее 3 знаков, затем пробел, потом символы «мс» и еще одну «скобочку».

Мы можем найти самую часто встречаемую ошибку, или метод:

Select-string -Pattern "data\d$" -Path input.txt | Group-Object Line | Sort-Object Count -Descending | Select Count,Name -First 2 > out.txt

Как это работает, я думаю, вы догадаетесь сами.

Закончим с логами и рассмотри еще одну задачу — обновления тестовых площадок. Разобьем на две части – копирование новых версий на тестовые машины, и непосредственно обновление.

Тут выясняется еще одно замечательное свойство Powershell. Из одного места мы можем запускать скрипты, которые будут применяться уже в других местах. Для этого достаточно выполнить команду:

Enable-PSRemoting -Force

Настройка должна выполняться на двух машинах — управляющей и управляемой. Тем самым мы включаем WS (http://en.wikipedia.org/wiki/WS-Management). Проверяется командой:

Test-WsMan COMPUTER

К удаленному компьютеру мы теперь можем обращаться так:

Invoke-Command -ComputerName COMPUTER -FilePath "d:\SCRIPT\script.ps1"

Script.ps1 выполнится на машине COMPUTER. Таким образом, с помощью Start-Process, и прочих команд, которые могут установить наше ПО, мы обновим тестовую площадку.

Но перед этим нам надо скопировать необходимые файл. Сделаем это так:

foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
Copy-Item $source -Destination \\$computer\$dest -Recurse
} else {
"$computer is not online"
}
}


Где, computers = @(“COMPUTER”, “COMPUTER1”, “COMPUTER2”) — список наших серверов,
$source = «c:\files» — папка, откуда мы будем копировать,
$dest = «c$» — директория, куда мы будем копировать

Список вдохновляющих/полезных статей


Jump Start в PowerShell (часть I)
Jump Start в PowerShell (часть II)
Первые шаги для пауэршельшиков
Регулярные выражения в Powershell
Полезная программа для анализа регулярных выражений

Ну вот, пожалуй, и все. Будьте здоровы, и чаще делайте бэкапы.
Tags:
Hubs:
+10
Comments 18
Comments Comments 18

Articles