Тестирование устаревшего PHP-кода для спагетти? - PullRequest
17 голосов
/ 22 декабря 2011

Я унаследовал довольно крупный самодельный проект электронной коммерции php4 + MySQL от разработчиков, которые буквально учили себя программированию и HTML, как они его написали.(Я бы вздрогнул, за исключением того, что это действительно впечатляет, что они смогли сделать так много, начав с нуля.) Моя работа состоит в том, чтобы поддерживать его и продвигать его с новыми функциональными возможностями.

Функциональность кода зависит от данных $_SESSION и других глобальных государственных структур, которые затем влияют на поток кода и какие части сайта отображаются с помощью операторов require.Когда я делал это в прошлом году, моей первой задачей было абстрагирование всего повторения в отдельные файлы, которые включаются с помощью операторов require, а также удаление большей части «логического» кода из «дисплея» или выходного кода, но я не могне удаляйте все это.Я переместил код в функции, где я могу, но это все еще довольно ограничено.Классы и методы, безусловно, сейчас исключены.

Все тесты проводятся вручную / визуально.Я хотел бы начать автоматизировать некоторые тесты, но я просто не знаю, с чего начать.Модульное тестирование функций довольно просто, но очень мало кода написано в функциях, и большая часть этого довольно проста.Я посмотрел на phpUnit и DbUnit, но все примеры и их обсуждение сосредоточены на классах и методах.

Итак, какие у меня есть варианты, чтобы начать реализовывать модульное тестирование на чем-то большем, чемсамые тривиальные части моего проекта?

Ответы [ 4 ]

20 голосов
/ 22 декабря 2011

Прежде всего PHPUnit может быть использован для проверки процедурного кода просто отлично . Не позволяйте факту, что примеры PHPUnit только показывают классы, удерживают вас. Так устроены тесты PHPUnit.

Вы можете просто написать тестовые классы и протестировать свою функцию на них без каких-либо проблем, и это должно быть вашей самой маленькой проблемой:)

Если код не работает на PHP 5.2+, то вы не можете использовать текущую версию PHPUnit, что, безусловно, вызывает больше беспокойства, и моя первая общая рекомендация - найти любые проблемы, которые может вызвать обновление PHP 5.


Чтобы начать с одной книжной рекомендации, чтобы избавить вас от хлопот:

Working Effectively with Legacy Code

Книга поможет вам избежать множества мелких ошибок, которые вам придется совершить самостоятельно, и поможет вам прийти в правильное мышление. Он основан на Java, но на самом деле это не проблема, так как большинство вещей легко адаптируется.


Тестирование сложно, потому что вы даже не знаете, для чего вообще нужно приложение

Подготовка модульных тестов к запуску занимает довольно много времени и не дает вам статуса «все еще работает», поэтому моей первой задачей было бы настроить некоторые интеграционные и интерфейсные тесты.

Такие инструменты, как Selenium и компоненты веб-тестирования Behat могут помочь вам в этом.

Преимущество использования Behat заключается в том, что вы можете написать хорошую документацию для , что на самом деле должен делать продукт . Независимо от того, как проходит проект, эти документы всегда будут иметь для вас значение .

Остальные читают что-то вроде: «Когда я захожу на этот URL-адрес и ввожу эти данные, пользователь должен быть создан, а когда я нажимаю там, я получаю электронное письмо, содержащее мой экспорт данных». Проверьте это. Это может быть полезно.


Самое главное - получить быстрый зеленый / красный индикатор, если он все еще работает!

Если вы затем обнаружите, что он был сломан, несмотря на то, что ваш "индикатор" горит зеленым, вы можете расширить тесты оттуда.


Когда вы не знаете, когда он сломан, вы никогда не будете достаточно уверены в том, чтобы изменить достаточно вещей вокруг, чтобы вы могли постепенно улучшать то, что нужно исправить или изменить.


После того, как у вас есть общее представление о том, как все работает, и вы доверяете своим маленьким тестам, чтобы показать вам, когда вы ломаете «все это», я бы сказал, что пришло время настроить небольшой Сервер непрерывной интеграции как Jenkins для PHP, который позволяет отслеживать состояние вашего проекта с течением времени. Вам не нужны все элементы QA в начале (возможно, чтобы получить представление о проекте), но просто увидеть, что все «все работает» возвращает «да», очень важно и экономит много времени, обеспечивая этого вручную.

2% Покрытие кода скучно

Когда вы находитесь в точке, когда вступают в игру модульное тестирование и покрытие кода, вы столкнетесь со средним показателем 0%. Это может быть довольно раздражающим, если никогда не видеть, как это число сильно растет.

Но вы хотите убедиться, что тестируете НОВЫЙ код, поэтому я бы предложил использовать PHP_Change_Coverage как described in this blog posting, поэтому убедитесь, что все, к чему вы прикасаетесь, имеет тесты после этого.

PHP Черная магия

function stuff() {
    if(SOME_OLD_UGLY_CONST == "SOME SETTING") {
         die("For whatever reasons");
    }
    return "useful stuff";
}

При тестировании это действительно раздражает, когда ваши скрипты die() но что делать?

Переработка всех сценариев без тестов может быть более вредной, чем вообще ничего не делать, поэтому, возможно, вы захотите взломать, чтобы сначала получить тесты.

Для этого и других решений страшных вещей есть расширение php test helpers.

<?php
set_exit_overload(function() { return FALSE; }
exit;
print 'We did not exit.';
unset_exit_overload();
exit;
print 'We exited and this will not be printed.';
?>
6 голосов
/ 22 декабря 2011

Я бы, вероятно, начал тестирование с помощью такого инструмента, как Watir или Selenium. Это позволит вам автоматически выполнять тестирование черного ящика всей страницы. После того, как вы настроили эти тесты, вы можете начать рефакторинг страниц PHP и создавать юнит-тесты, когда вы выполняете рефакторинг.

2 голосов
/ 22 декабря 2011

Перед вами стоит большая задача.Скорее всего, вы не сможете закодировать все тесты, которые необходимы, за любой разумный промежуток времени, и вашим менеджерам будет все равно, если вы это сделаете, если они считают, что приложение в основном работает.

Что вам нужно сделать, так это сосредоточитьсяна строительных испытаниях для нового или измененного кода приложения.Если у вашего приложения есть жизнь, этого будет достаточно, чтобы вы были заняты.

Вы также должны убедиться, что на самом деле тестируете этот новый код.Различая новые проверки (вы используете контроль исходных кодов, верно? Если нет, FIX THAT FIRST!) Против старых, вы можете увидеть, что изменилось, и получить точную информацию о местоположении о местоположении изменений.Вы (ну, ваш менеджер должен) хотите доказать, что эти изменения были проверены.Вы можете использовать инструмент покрытия кода, чтобы сказать, что было проверено, и взять пересечение этого с местоположением ваших новых изменений;пересечение лучше включать в себя весь модифицированный код.Наш PHP Test Coverage может предоставить информацию о покрытии и может рассчитать такие данные пересечения.

2 голосов
/ 22 декабря 2011

Устаревший код без юнит-тестов - это всегда боль.Реального решения не существует, потому что большую часть времени код написан не так, как его можно тестировать.На работе нам пришлось работать с большим количеством устаревшего кода.Мы написали модульные тесты для нового написанного кода (что тоже очень неприятно, потому что вы должны иметь возможность настроить некоторые тестовые данные и тому подобное).Таким образом, ситуация не ухудшится, и вы будете охватывать все больше старого унаследованного кода, который вызывается в вашем новом коде.Делая это, вы будете каждый раз приближаться к коду, который охватывается модульными тестами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...