2013-11-25 48 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