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テスト環境では失敗します。この関数をmeasurement.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

1つのアプローチは、正規表現のすべての空白を「\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);

そして、あなたの質問の一部ではありませんが、これは「スペースの任意のシーケンスですが、単一のスペースではありません」を「1つ以上のスペースが必要」に置き換えます。

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