PS. тока по моему бредовая это затея. Мало того, чтонужно формализовать постановку теста, так еще надо формализовать результат. Что касается анализа образов, я думаю тут как unit-е не выйдет - фреймворки для модульного тестирования разговаривают с программистом и кодом на одном языке. Здесь же и постановку и результат нужно выводить используя графику. Иначе для дизайнера/версталы будет ад постановки/интерпретации.
Мне сейчас это представляется уже по другому:
Тесты создаются и обрабатываются вообще сторонними программами (не имеющими никакого отношения к PHP) и имеют следующую файловую структуру:
Код:
tests/
test1.png
test1.xml
test2.xml
Настройки тестов храняться в XML файлах (по сути, каждый XML файл аналог тестового метода в PHPUnit)
Пример test1.xml:
Код:
<test>
<expectedURL type="image">test1.png</actualURL>
<actualURL>http://localhost/test1.html</actualURL>
<areas>
<area type="text" form="rect" coords="10,10,60,60" />
<area type="exclude" form="rect" coords="0,0,10,10" />
</areas>
</test>
Пример test2.xml:
Код:
<test>
<expectedURL type="html" browser="c:/firefox.exe">http://localhost/test1.html</actualURL>
<actualURL>http://localhost/test1.html</actualURL>
<areas>...</areas>
</test>
Существует несколько программных модулей (по видимому, которые лучше будет написать на Java):
1. Программа для получения скриншотов в браузере (BrowserSnapshot)
2. Интерфейс для создания тестов (TestCreator)
3. Программа для исполнения теста (TestExecuter)
4. Программа для запуска тестов (TestRunner)
--BrowserSnapshot
На вход получает путь к браузеру (к исполняемому файлу) и URL адрес для загрузки. Программа открывает указанный браузер, загружает в него указанный URL и делает скриншот (который и возвращает вызывающей программе).
--TestCreator
Интерфейс для создания тестов (с помощью него формируются XML файлы). Форма интерфейса содержит элементы для обеспечения следующего функционала:
1. добавление картинки-образца (загрузка с локального компьютера или автоматическое получение прямо перед тестированием скриншота указанной страницы из браузера посредством BrowserSnapshot). Значение этого элемента хранится в XML файле в теге <expectedURL>.
2. нанесение на картинку прямоугольных областей двух типов (значение этого элемента хранится в XML файле в теге <areas>):
a) область исключения (сравнение этих областей не производится при тестировании)
b) область текста (сравнение этих областей происходит с использованием не строгого сравнения, этот тип, видимо, не обязательный, см. конец поста)
3. actualURL - URL адрес страницы, с которой надо будет сравнение производить, хранится в <actualURL>
--TestExecuter
На вход получает:
1. expectedImage (картинка-образец, берётся из <expectedURL>)
2. expectedImageMarking (разметка картинки, где отмечены области исключения и текстовые области, берётся из тега <areas>)
2. actualURL (адрес для загрузки в браузер, содержаний HTML код для сравнения с expectedImage)
3. browsersList (список браузеров, в которых следует выполнять тесты)
При запуске программа циклично запускает по очереди все указанные браузеры, выполняя для каждого следующие действия:
1. загружает страницу actualURL
2. получает скриншот страницы
3. производит анализ (сравнение) полученного скриншота с expectedImage, используя expectedImageMarking
4. Возвращает результат сравнения: thresholdOverload (превышение допустимого порога расхождений в процентах) и diffAreas (список областей (координаты квадратов), в которых произошло расхождение)
--TestRunner
Считывает все тесты из папки tests и для каждого выполняет алгоритм, описанный в TestExecuter.
Результат отображается следующим образом: если thresholdOverload превышает установленное значение, то выводится сообщение о том, что тест в таком то браузере не прошёл и показывается скриншот страницы actualURL, где красными прямоугольниками выделяются области diffAreas - что бы пользователь понял где то не так.
Т.е. подобная тестовая среда будет самостоятельная (не будет завязана на PHPUnit). А что бы это дело связать с PHP достаточно будет создать PHP страницу, которая будет генерировать нужный HTML для тестов по запросу (и эти URL'ы и надо будет прописать в XML файлах).
А если реализовать автоматическое определение областей текста, то можно будет подобную систему натравить на сайт (указав в качестве образца нужный браузер) и получить результат сравнение всех страниц в различных браузерах. Т.е. можно будет в одном браузере проверить визуальный вид сайта в ручную, а в остальных браузерах выполнить проверку автоматически.
Автоматическую определение текста, кстатии, можно довольно легко будет реализовать: достаточно в CSS задать для текста цвет-образец через !important и весь тест на сайте будет одного цвета. Таким образом можно будет отделить текст от остальной части картинки. Притом перед выбором цвета образца можно сделать скриншот сайта и выбрать в качестве цвета образца тот, который не присутствует на скриншоте. Можно так же несколько раз с различными цветами прогнать.
P.S.: мне всё это нужно как человеку, которого ужасно утомляет каждый раз после вёрстки вручную проверять результат как минимум в 8 браузерах (к тому же небольшое изменение может затронуть множество комбинаций результатов, как в моём примере с баннерной системой). Плюс, на мой взгляд, было бы просто здорово так же проверить сайт во всех минорных версиях браузеров (ff3.3, ff3.4, ff 3.5 и т.п.) в различных ОС.