2013-11-25 29 views
0

我迁移从JUnit的相当多的测试,以斯波克:正则表达式:匹配JUnit assertEquals?

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

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

为了使事情更快我想通过正则表达式来替换(大部分)的JUnit与Spock的断言表达 - 监督和文件通过-文件。 assertFalse,assertTrueassertNotNull很容易,但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

+0

你不应该比较像这个userDTO.getFirstName()。equals(“John Doe”)而不是userDTO.getFirstName()==“John Doe”的字符串? –

+1

@MitakshGupta Spock是一个基于groovy的DSL测试,字符串可以用== –

回答

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

+0

来比较真棒,太棒了! – stephanos