2

我有一个 PHPUnit 测试,它使用正则表达式验证日志文件的输出。日志文件看起来像这样(第一行是空的,但我不知道如何在此处显示):

<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 测试环境中失败。通过将此函数应用于 measure.log 文件,我已将 windows 换行符替换为 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 );
}

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

4

2 回答 2

1

解决方案是始终检查换行符。我用 php 在 windows 机器上创建的日志文件有 unix 换行符:

在 Windows 上使用 php 创建的日志文件

在 unix 中从 CVS 签出的 PHPUnit 源文件有 unix 换行符:

Unix 中的 PHPUnit 源文件

Windows 中 CVS 的 PHPUnit 源文件检出有 windows 换行符:

Windows 中的 PHPUnit 源文件

这些换行符破坏了我的正则表达式验证。所以现在我总是将换行符替换为 unix 换行符。

// replace possible windows line breaks with unix line breaks
$strExpectedMeasurementLog = preg_replace( "|\r\n|", "\n", $strExpectedMeasurementLog);
$strActualMeasurementLog = preg_replace( "|\r\n|", "\n", $strActualMeasurementLog);    
于 2012-06-15T13:00:07.153 回答
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 更改为 CRLF。)

改进

以上内容有点粗略,因为它允许使用空格字符而不是换行符。所以一个可怕的错误报告可能仍然通过。哪个可能不好?下一个版本只是将模板中的换行符替换为“接受 CR 和 LF 的任意组合”:

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

尽管不是您问题的一部分,但这个问题将“任何空格序列,但不是单个空格”替换为“需要一个或多个空格”:

$strExpectedMeasurementLog=preg_replace("/ {2,}/",' +',$strExpectedMeasurementLog);
于 2012-06-15T01:33:44.977 回答