2013-11-25 18 views
0

Я мигрируют довольно много тестов из JUnit Споку:Regex: соответствие JUnit assertEquals?

// before 
assertEquals("John Doe", userDTO.getFirstName()); 

// after 
userDTO.getFirstName() == "John Doe" 

Чтобы сделать вещи быстрее, я хочу, чтобы заменить (большинство) утверждают выражения JUnit с Спок с помощью регулярного выражения - обслуживаемые и файл-по -файл. assertFalse, assertTrue и assertNotNull просты, но assertEqual нет, так как он имеет 2 параметра.

Моя нынешняя попытка: assertEquals\(([^;]+),([^;]+)\);. Но это не так хорошо, потому что он не знает, отделяет ли параметр 0Eпараметр assertEquals или нет. Как это решить?


Мои тестовые случаи:

assertEquals(az, bz); 
assertEquals(az(), bz); 
assertEquals(az, bz()); 
assertEquals(az(), bz)); 
assertEquals(az, bz(cz, dz));  
assertEquals(bz(cz, dz), az); 

PS: Вложенные вызовы методов выходят за рамки здесь.

Интернет: https://www.debuggex.com/r/aESv3YmNWsakNgI6/1

+0

не должны вы сравните строки, подобные этому userDTO.getFirstName(). equals («John Doe») вместо userDTO.getFirstName() == «John Doe»? –

+1

@ MitakshGupta Spock - это отличная DSL-тестирование на основе тестов, строки можно сравнить с помощью == –

ответ

1

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

Я проиллюстрирую с помощью python, но то же самое, вероятно, работает в вашей среде IDE.

>>> import re 
>>> import pprint 
>>> t = ["assertEquals(az, bz);", \ 
...  "assertEquals(az(), bz);", \ 
...  "assertEquals(az, bz());", \ 
...  "assertEquals(az, bz(dz));", \ 
...  "assertEquals(bz(dz), az);", \ 
...  "assertEquals(az, bz(cz, dz));", \ 
...  "assertEquals(bz(cz, dz), az);"] 
>>> var = r'([a-z]+(\(([a-z]+(\s*,\s*[a-z]+)*)?\))?)' 
>>> res = [ \ 
...  re.sub(\ 
...   r'assertEquals\(\s*' + var + '\s*,\s*' + var + '\s*\)', \ 
...   r'\1 == \5', str \ 
...   ) \ 
...  for str in t] 
>>> pprint.pprint(res) 
['az == bz;', 
'az() == bz;', 
'az == bz();', 
'az == bz(dz);', 
'bz(dz) == az;', 
'az == bz(cz, dz);', 
'bz(cz, dz) == az;'] 

Важной частью является var:

(       # group the entire var before the comma 
    [a-z]+     # acceptable variable name 
    (      # followed by an optional group 
     \(     # containing a pair of matching parens 
     (     # which contain, optionally 
      [a-z]+    # an acceptable variable name 
      (     # followed by any number (0 or more) 
      \s*,\s*[a-z]+ # of commas followed by acceptable variable names 
     )* 
     )? 
     \) 
    )? 
) 

Чтобы получить эту работу на свой реальный код, вам придется изменить [a-z] к чему-то более разумном как [a-zA-Z0-9_]

+0

awesome, great! – stephanos

Смежные вопросы