2012-06-14 2 views
2

У меня есть PHPUnit Test, который проверяет вывод файла журнала с регулярным выражением. Файл_журнала выглядит следующим образом (первая строка пуста, но я не знаю, как показать, что здесь):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. Я заменил разрывы окна линии с перерывами UniX линии по appyling эту функцию в measurement.log файла:

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

Если мой ответ ниже не работает, это может быть ошибка где-нибудь, пожалуйста, отправлять версии PHP и PHPUnit, что вы используете на каждом из UNIX и окон среды. Также получите текстовый редактор (например, scite для этого), где вы можете видеть байты LF и CR, а также просматривать как ваши отчеты на каждой машине, так и исходный файл phpunit на каждой машине. –

+0

Не совсем, но вы указали мне в правильном направлении, чтобы посмотреть байты LF и CR и посмотреть исходный файл phpunit. Спасибо Даррену! – mles

ответ

1

Решение всегда проверяет разрывы строк. Мой лог-файл, созданный на компьютере окна с PHP имеет UNIX разрывы строк:

Logfile created with php on windows

Источник PHPUnit файл выписался из CVS в UNIX имеет Unix линия разбивается:

PHPUnit Source File in unix

Источник PHPUnit файл checkout из 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 была копия этого, с ЛФ изменен CRLFs в моем текстовом редакторе.)

УСОВЕРШЕНСТВОВАНИЯ

Вышеприведенное немного грубо, поскольку оно позволяет использовать символ пробела вместо линии. Так что ужасно искаженный отчет все равно может пройти. Что может быть плохо? Это следующая версия просто заменяет разрывы строк в шаблоны в «принять любую комбинацию СВК и ЛФ»:

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

И хотя не часть вашего вопроса, это один заменяет «любую последовательность пространств, но не единичные пространства» , с «требуют одного или нескольких пробелов»:

$strExpectedMeasurementLog=preg_replace("/ {2,}/",' +',$strExpectedMeasurementLog); 
Смежные вопросы