正则表达式:匹配JUnit assertEquals?

时间:2013-11-25 17:44:50

标签: java regex

我正在将相当多的测试从JUnit迁移到Spock:

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

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

为了让事情更快,我想通过正则表达式替换(大部分)JUnit的断言表达式与Spock's - 监督和逐个文件。 assertFalseassertTrueassertNotNull很简单,但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:嵌套方法调用超出了范围。

在线:https://www.debuggex.com/r/aESv3YmNWsakNgI6/1

1 个答案:

答案 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_]