2012-06-14 51 views
2

我有一個PHPUnit測試,它用一個正則表達式驗證日誌文件的輸出。日誌文件看起來像這樣(第一行是空的,但我不知道如何顯示在這裏):phpunit assertRegExp()測試在UNIX中傳遞,在Windows中失敗

<empty line> 
lfworker01: 
----------------------------------------------------------- 
Last update:    2012-06-14 11:43:17 
Last Segment Sent:   2009-12-02 23:25:00 (1259792700) 
Current Segement:   2009-12-03 00:25:00 (1259796300) 
Clicks processed Segment: 3 
Open sessions Segment:  1 
Duration Segment:   0,06 sec 
Speed Segment:    47,67 clicks/sec 
Uptime:     0 days 00:00:00 
Clicks processed overall: 3 
Avg Speed overall:   81,70 clicks/sec 
Current memory used:  16,75 MB 
Max memory used:   16,75 MB 

我驗證了正則表達式的內容:

$strExpectedMeasurementLog = "# 
lfworker01: 
----------------------------------------------------------- 
Last update:    \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 
Last Segment Sent:   2009-12-02 23:25:00 \(1259792700\) 
Current Segement:   2009-12-03 00:25:00 \(1259796300\) 
Clicks processed Segment: 3 
Open sessions Segment:  1 
Duration Segment:   \d*,\d{2} sec 
Speed Segment:    \d*,\d{2} clicks/sec 
Uptime:     0 days 00:00:00 
Clicks processed overall: 3 
Avg Speed overall:   \d*,\d{2} clicks/sec 
Current memory used:  \d*,\d{2} MB 
Max memory used:   \d*,\d{2} MB#"; 

$strActualMeasurementLog = file_get_contents(dirname(__FILE__)."/applogs/measurement.log"); 
self::assertRegExp($strExpectedMeasurementLog, $strActualMeasurementLog); 

PHPUnit的測試是在unix環境中創建的。此測試通過unix測試環境,但在Windows測試環境中失敗。我已經appyling此功能可將measurement.log文件替換爲UNIX換行符窗口換行:

public function unixtodos($strPathFile) 
{ 
    $strCurrent = file_get_contents($strPathFile); 

    $strPattern = "|\r\n|"; 
    $strReplace = "\n"; 
    $strNew = preg_replace($strPattern, $strReplace, $strCurrent); 

    file_put_contents($strPathFile, $strNew); 
} 

它仍然不匹配,我的想法:(

+0

如果我下面的回答不工作也可能是某處的一個錯誤,所以請發表您使用您的每個UNIX和Windows環境的是PHP和PHPUnit的版本。還可以得到一個文本編輯器(例如scite就可以了),您可以在其中查看LF和CR字節,查看每臺計算機上的報告以及每臺計算機上的phpunit源文件。 –

+0

並不完全,但您指出了我正確的方向來查看LF和CR字節並查看phpunit源文件。謝謝達倫! – mles

回答

1

解決方法是始終檢查換行符。在Windows機器用PHP上創建我的日誌文件Unix的換行符:

Logfile created with php on windows

PHPUnit的源文件在UNIX中籤出CVS的Unix的換行符:

PHPUnit Source File in unix

PHPUnit的源在Windows中的CVS文件結帳有窗口換行符:

PHPUnit Source File in windows

這些換行符打破了我的正則表達式驗證。所以現在我總是將換行換成unix換行符。

// replace possible windows line breaks with unix line breaks 
$strExpectedMeasurementLog = preg_replace("|\r\n|", "\n", $strExpectedMeasurementLog); 
$strActualMeasurementLog = preg_replace("|\r\n|", "\n", $strActualMeasurementLog);  
0

一種方法是用「\ s +」替換正則表達式中的所有空格,即「我希望在這裏有一些空白,但我不關心它到底是什麼」,我認爲這很適合你的情況,因爲它意味着你的測試不會(重要提示:如果某人稍微調整了報表佈局,那麼您的測試的全部內容就會被捕獲,那麼這就是錯誤的做法!)

不足之處是你的正則表達式變成了一個可怕的模糊反斜槓,而不是你目前使用的可讀模板。但是,讓我們讓PHP爲我們做出嘔心瀝血的工作;請參閱下面的示例,其中preg_replace使正則表達式對空白區別不敏感。

/** */ 
class RegexTest extends PHPUnit_Framework_TestCase{ 

function testRegex(){ 
$strExpectedMeasurementLog = "# 
lfworker01: 
----------------------------------------------------------- 
Last update:    \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 
Last Segment Sent:   2009-12-02 23:25:00 \(1259792700\) 
Current Segement:   2009-12-03 00:25:00 \(1259796300\) 
Clicks processed Segment: 3 
Open sessions Segment:  1 
Duration Segment:   \d*,\d{2} sec 
Speed Segment:    \d*,\d{2} clicks/sec 
Uptime:     0 days 00:00:00 
Clicks processed overall: 3 
Avg Speed overall:   \d*,\d{2} clicks/sec 
Current memory used:  \d*,\d{2} MB 
Max memory used:   \d*,\d{2} MB#"; 

$strExpectedMeasurementLog=preg_replace("/\s+/",'\s+',$strExpectedMeasurementLog); 

$strActualMeasurementLog = file_get_contents("test.lf.txt"); 
self::assertRegExp($strExpectedMeasurementLog, $strActualMeasurementLog); 

$strActualMeasurementLog = file_get_contents("test.crlf.txt"); 
self::assertRegExp($strExpectedMeasurementLog, $strActualMeasurementLog); 
} 

} 

(test.lf.txt是複製和從你的問題粘貼; test.crlf.txt是它的一個副本,其中的LF在我的文字編輯器改爲CRLFs。)

精化

上面有點粗糙,因爲它允許使用空格字符而不是換行符。所以一個可怕的報告可能仍然會通過。哪個可能不好?接下來的這個版本只是替換換行符到您的模板分爲「接受CR和LF類的任意組合」:

$strExpectedMeasurementLog=preg_replace("/[\r\n]+/",'[\r\n]+',$strExpectedMeasurementLog); 

而且雖然不是你的問題的一部分,這一替代「的空間任何序列,但不是單一的空間」 ,「需要一個或多個空格」:

$strExpectedMeasurementLog=preg_replace("/ {2,}/",' +',$strExpectedMeasurementLog);