Использование RegExp в тестировании

Предлагаю обсудить в этой теме сабж с точки зрения тестировщиков :)

 

Интересно, где можно их применять. 

Пока знаю два варианта: 

1. для grep и скриптов в юниксе  при работе с логами;

2. в JMeter можно обрабатывать полученные данные и их использовать.

И еще такой вопрос. Универсален ли синтаксис или может варьироваться в зависимости от места использования?

Когда-то находила сайты, на которых можно протестировать написанное выражение, с ходу не вспомню, может, кто-то может сразу поделиться полезными ссылочками? В JMeter можно проверить, но это не очень универсальный способ :)

 

 

которые мне задали

Как должно выглядеть рв если '[a-z]', но в тоже время [^(com)].

запрет на ноль, но если ноль и запетая с [1-9], то разрешить

http://myregexp.com/

очень помогли бы regex'ы в локаторах селениума (xpath) если бы они работали...

Awesome, thanks!

Мне доводилось парсить XML при помощи регулярных выражений. Дело было так: когда-то у нас был внутриконторский автотестовый тул, который имел и свой иксемельный лог. Я перекидывал данные из этого тула и ещё из разных мест тоже в нашу систему TCDB при помощи импорта XML в обычный ADO.NET DataSet. Но с некоторых пор программеры нашего тула оборзели и их XML стал слишком сложным и валил DataSet.

Переписывать мой тул на хождение по нодам мне не хотелось, поэтому я просто стал построчно считывать их XML и пропускать эти строки через выражение. И работало идеально (я поначалу боялся, но нет, всё получилось даже без багов).  А вот в поиске контролов при тестировании десктопного приложения мы используем wildcard - и достаточно, и оператора (того, кто генерит или пишет тест) не напрягает. 

Ну и, конечно, прекрасный поиск по регулярным выражениям в SharpDevelop (там и обычный поиск мне очень нравится). А с приходом в тестирование PowerShell несколько лет назад, использование регекспов стало просто плёвым делом.

круто, еще б пример кода парсанья скинули с реджекспами)

Итак, по порядку :)

1. Где можно их применять?

Имхо, сценарии использования РВ в автоматизации тестирования можно условно разделить на 2 группы:

  • валидация текстовых значений (т.е. проверить, что сообщение, дата, цена и т.п. соответствует заданному шаблону)
  • извлечение нужной информации из текста (например, получение числовых значений из сообщения "Найдено X записей за Y секунд." или отдельных компонентов даты/времени из строки "31 May 2012, 9:00 PM")

А также не забываем про поддержку поиска с использованием РВ в Notepad++, Total Commander и др. приложениях.

2. Универсален ли синтаксис?

"Диалектов" регулярных выражений очень много, подробнее можно почитать здесь -- http://www.regular-expressions.info/refflavors.html

3. Онлайн сервисы для проверки РВ

Принимая во внимание разнообразие "диалектов", советую использовать сервисы "заточенные" под определенный язык, дабы избежать сюрпризов. Примеры:

4. Бонус :)

 

  • валидация текстовых значений (т.е. проверить, что сообщение, дата, цена и т.п. соответствует заданному шаблону)
  • извлечение нужной информации из текста (например, получение числовых значений из сообщения "Найдено X записей за Y секунд." или отдельных компонентов даты/времени из строки "31 May 2012, 9:00 PM")

А можно немного конкретнее, в каких именно форматах файлов/приложениях/инструментах можно это делать?

 

 

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

Т.е. там две части (насколько я помню код трёх или четырёхлетней давности), одна часть просто читает файл построчно, вторая делает заключение по шаблону. Разумеется, ориентирован на строго определённые значения.

Кстати, никто не спросил, а я отвечу: кому надо освоить регекспы быстро и достаточно неплохо, книжка Бен Форта "Регулярные выражения за 10 минут". Написана супер, тонкая, стоит копейки. Я в своё время прорешал за короткое время восемь или девять глав из десяти, мне этого хватило для моих применений.

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

конечно, что это не полностью, что нужно, но тем неменее, так используется сейчас.

да, кстати, совсем забыл рассказть о PowerShell - это действительно мощный инструмент и там очень просто использовать регулярные выражения

Вероятно, мы не так поняли друг друга. Я написал о применении РВ в автоматизации тестирования, а в ней, по большому счету, все зависит не от "формата файла/приложения/инструмента", а от языка программирования, на котором вы пишете автотесты. Хотя, бывает и поддержка РВ на уровне тула, например, в QTP можно использовать РВ при описании свойств объекта в object repository.

Делать можно везде :)

примерчик на пауэршелл (просто находит строки в файле, самое простое применение):

Set-StrictMode -Version Latest
cls

# our test file (it doesn't exist now)
[string]$fileName = "c:\1\test.file.txt";
if (-not (Test-Path -Path "c:\1")) {
    $null = New-Item -Path c:\ -ItemType directory -Name 1;
}
if (Test-Path -Path $fileName) {
    Remove-Item -Path $fileName;
}

# our templates
[string]$template1 = "asdf"; # should return asdf
[string]$template2 = '(?=sadf).*'; # should return asdf from the same line
[string]$template3 = '[Ww][e]+?'; # should return two lines
# it would return four by default
# however, I'll use the -cmatch operator
# to indicate that it's case-sensitive

# let's create a file and feed it with letter sequences
"sadfasdf" >> $fileName
";lroiuykahsdf" >> $fileName
"5349579weqh" >> $fileName
"stgjwelkrtuiu" >> $fileName
"kljtu" >> $fileName
"stgjWelkrtuiu" >> $fileName
"stgjwElkrtuiu" >> $fileName

# read the file and parse the content
Get-Content -Path $fileName | %{
    if ($_ -match $template1) {Write-Host "template 1: " + $_;}
    if ($_ -match $template2) {Write-Host "template 2: " + $_;}
    if ($_ -cmatch $template3) {Write-Host "template 3: " + $_;}
    }

как в каких?

что то вроде:

Assert.That(Regex.IsMatch(driver.FindElement(By.Id("result-message")).Text, "You successfully bought \\d+ items"));

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

спасибо за ссылки и картинка в действительности правдивая, если знаешь, как быстро написать регулярные выражения.

помнию, первые разы я долго писал даже небольшие выражения, а сейчас как на рисунке :) почти супер-мен :)

проще юзать contains с таких случаях для String-ов )

С помощью contains вы проверите строку на наличие подстроки, а не на соответствие шаблону.

Вы бы еще предложили сделать split по пробелам и проверить по отдельности каждое слово из массива :)

На сборище начальников тестовых отделов было сказано: "Мы переходим на Boost. Нашли багу в дотнете - не работают регекспы". Я фшоке. "А как же эти, ну миллионы программистов, которые юзают дотнет? Вы что, чуваки, нашли звёздный баг?"

Я попросил пример. Пример выглядел так:

слово.*слово.*слово.*слово.*слово.*слово.*слово.*слово.*слово.*слово

Там были опорные слова, после которых искалось значение. Эту строчку генерил тестовый тул, а другой тестовый тул парсил.

При запуске проверки регекспа, оно действительно зависало намертво (или на очень долгое время, установить не захотелось).

Объяснение-то простое (хорошо иметь перед глазами картинку из книжки Фридла любого издания, где показано стрелками, как процессор регекспов бегает по строке), каждая .* - это полный перебор по сути.

А тут получился перебор, помноженный на перебор, помноженный на перебор, ...

В бусте или это обошли, или у них баг в чём-то другом, не выяснял.