我正在将相当多的测试从JUnit迁移到Spock:
// before
assertEquals("John Doe", userDTO.getFirstName());
// after
userDTO.getFirstName() == "John Doe"
为了让事情更快,我想通过正则表达式替换(大部分)JUnit的断言表达式与Spock's - 监督和逐个文件。 assertFalse
,assertTrue
和assertNotNull
很简单,但assertEqual
不是,因为它有2个参数。
我目前的尝试是:assertEquals\(([^;]+),([^;]+)\);
。但是这不能很好地工作,因为它不知道,
是否分隔了assertEquals参数。 如何解决此问题?
我的测试用例是:
assertEquals(az, bz);
assertEquals(az(), bz);
assertEquals(az, bz());
assertEquals(az(), bz));
assertEquals(az, bz(cz, dz));
assertEquals(bz(cz, dz), az);
PS:嵌套方法调用超出了范围。
答案 0 :(得分:1)
通常,将任意嵌套结构与正则表达式匹配不是您应该做的事情。但是,如果我们将您的需求限制在此处列出的测试用例(删除第4个,这是一个错误),那么我们可以做一些事情。您还可以为各种其他有限的案例构建正则表达式,而不会使事情变得太难。
我将使用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_]