Monday, July 09, 2012

Выбираю IDE для PHP или Netbeans не так уж и мертв.

Я верю, что самая классная IDE – это PHPStorm. Потому что эта та же IntelliJ IDEA, только для PHP. Но поскольку эта IDE платная, а методы бесплатного ее использования я публиковать не хочу, то я остановился на NetBeans.


Установка и настройка проекта на PHP в NetBeans 7.1

  1. Идем сюда http://netbeans.org/downloads/index.html, выбираем столбик с PHP и качаем
  2. Создаем новый проект (File->New Project).

    Напомню, что структура проекта такая:
    spairing
    |-www
    |-tests
  3. Указываем Source folder (z:\home\spairing)
  4. В Run Configuration меняем Project URL (http://www.spairing) и указываем Index file (www/index.php)
  5. Открываем File->Project properties, устанавливаем Web Root (www). Значок возле каталога www поменялся

    Значок возле каталога www должен поменяться
     
  6. Теперь можем запустить index.php, правой кнопкой мыши на файле и выбрать Run. Запустится браузер, в нем откроется страничка.
  7. Укажем путь где будут лежать юнит тесты
  8. Создам новый класс Profile.
  9. Теперь правой кнопкой мыши на папке Source folder и сгенерим юнит тесты:
  10. По идее в тестовых сорцах должен создаться юнит тест ProfileTest
  11. В сгенерированном тесте ProfileTest добавлю тест
  12. И запущу тесты (если с клавиатуры, то <Alt>+F6)

    Теперь можно начинать колбасить тесты и код.
  13. Ради интереса запущу этот тест из командной строки (команда phpunit ProfileTest.php из директории с тестовым файлом)

Можно начинать колбасить код! :)

Устанавливаем PHPUnit

Инструкция по установке PHPUnit взята отсюда: http://www.phpunit.de/manual/3.0/en/installation.html

Напомню, что все эти операции я проводил на Denwer с версией пхп 5.3.3. Корневая папочка  Денвера замаплена на диск Z:

Итак, чтобы поставить PHPUnit нужно

  1. Убедиться, что установлен Pear. Как его устанавливать я описывал здесь.
  2. Добавить channel, откуда будет установлен пакет PHPUnit:
    pear channel-discover pear.phpunit.de
  3. Добавить channel pear.symfony-project.com (нужен для зависимых модулей)
  4. Собственно, установить PHPUnit командой
    pear install phpunit/PHPUnit
    На ошибку загрузки опциональных зависимостей забиваем.
Дальше буду определяться с IDE и в ней уже создам пару тестов...

Устанавливаем PEAR

Дословный перевод определения PEAR, взятого отсюда http://pear.php.net определения что такое PEAR:
PEAR - это фреймворк и система распределения реюзабельных PHP компонент (PEAR is a framework and distribution system for reusable PHP components)
Pear - это как Setuptools или PIP в питоне.

Ставлю Pear


    1. Поскольку у меня Денвер, то сначала я скачал пакет расширений отсюда  http://www.denwer.ru/packages/php5.html и установил его. 
    2. Этот файл http://pear.php.net/go-pear.phar скачиваем в папку Z:\usr\local\php5\PEAR. Z - это диск, на который я замапил установленную дистрибуцию денвера (см. предидущий пост по установке)

    3. В папке с инсталляцией php запускаем go-pear.bat, на все вопросы жмем Enter.Если нету go-pear.bat, то здесь описан вариант установки руками:  http://szelenin.blogspot.com/2012/07/pear_20.html
    4. На дурацкий вопрос отвечаем Y и подтверждаем еще раз <Enter>  5. Все, pear установлен. Следуя рекомендациям внесем изменения в реестр из сгенерированного файла: 6. У меня внести не получилось, поэтому все переменные из z:\usr\local\php5\PEAR_ENV.reg я внес руками.

    Проверь правильность установки, это ВАЖНО:

      7. PHP_PEAR_PHP_BIN должна содержать полный путь к исполняемому php файлу, то есть к Z:\usr\local\php5\php.exe
       
      8. Директорию Z:\usr\local\php5 нужно добавить в переменную окружения PATH.

Проверка правильности установки Pear


Переходим на диск Z: и запускаем команду pear version. Если видим нечто подобное, значит pear возможно все-таки установлен. 
Чтобы полностью убедиться в правильности устнановки можно выполнить инструкции, описанные здесь
http://pear.php.net/manual/en/installation.checking.php



Ставим Denwer

Из неопубликованного. Однажды мне перемкнуло посмотреть что такое PHP и что-то на нем написать. Цель была пощупать насколько PHP TDDбелен. Я выбрал самый простой способ поставить все и не мучаться и остановился на Denver.

Ставим Denwer

  1. Устанавливаем Denwer. Качаем отсюда: http://www.denwer.ru/. Я выбрал php 5.3.3, т.к. с 5.4 были какие-то траблы. В пхп я чайник, так что траблов удалось унынкуть, выбрав версию 5.3.3.
  2. По идее этот шаг должен сделать сам инсталлер, не помню почему, но я делал это сам. Нужно замапить диск на проинсталленый денвер. Денвер у меня был в c:\workspace\bin\dever, следовательно: subst z: C:\workspace\bin\devner
  3. Если на рабочем столе появились иконки Start Denwer и Restart Denwer, значит все идет как надо:
     
  4. Теперь в директории z:\home можно создавать свои проекты. Я в z:\home создал директорию spairing и в ней папку www
    -home
     |-spairing
       |-www
  5. И в папке www создал index.php с вот таким содержимым
  6. Для того, чтобы можно было обращаться к приложению прописываю в хостах (<Windows>\System32\drivers\etc\hosts) такую строчку 127.0.0.1        www.spairing
  7. Если денвер не запущен, то запускаем его с помощью соотв. иконки
  8. Открываем страничку http://www.spairing. Должны увидеть примерно такую картинку:

    Дальше меня ждут сладкие минуты проникновения в мир программирования на php.

Friday, June 29, 2012

Как запустить DOS программу в Windows x64

Для тех, кто иногда ностальгирует по игрушкам, написанным для DOS и расстраивается от того, что в последних версиях Windows досовские игрушки не запускаются есть замечательное лекарство - DOSBox.


Как запустить DOS игрулю под Windows 7 x64

1. Скачиваем инсталляцию эмулятора DOSBox отсюда. 

2. Запускаем инсталлятор, устанавливаем.

3. Запускаем DOSBox. При запуске выведется синенькое окошечко с инструкциями.

4. Маунтим диск с досовскими игрульками командой mount

5. Переходим в папку с игрушкой. Мне пришлось ввести имя папки в досовском формате, т.к. ее длина превысила 8 символов:

6. Запускаем. Я запустил snake.exe и вот такое счастье мне высветилось:

Коллекции досовских игрушек можно пополнить отсюда
http://dosgames.ru/game
http://xn--80atapp0e.su/games.html

Friday, June 15, 2012

Настройка кодировки в IntelliJ IDEA

Столкнулся с проблемкой несоответствия кодировок ресурсных файлов и web страничек. В JSP страничке кодировка указана UTF-8, для проекта в IntelliJ IDEA тоже UTF-8, а в ресурсном файле - системная. Поэтому в моей вьюшке русские символы отображались некорректно. Понятно, что можно пофиксить с помощью утилиты native2ascii, которая находится в установленном JDK , но это приходилось бы делать каждый раз при изменении файлов.

Как пофиксить в Идее:
1. В окне настроек находим настройки File Encodings
2. Удивляемся почему для properties файлов не настроена кодировка по умолчанию и меняем Default encoding for properties files на UTF-8
3. Выбираем галочку "Transparent native-to-ascii conversion

Теперь IDEA будет автоматически переводить символы в ресурсных файлах из UTF-8 в ASCII код. В редакторе мы будем продолжать видеть русские символы:

Хотя на самом деле ресурсный файл уже закодирован:


Sunday, May 06, 2012

Песочница для отладки Ajax запросов на jQuery

В рамках знакомства с jQuery я давно хотел руками написать простой клиентский обработчик Ajax ответа, содержащий JSON. А то нами уже реализовано море серверной логики, которая взаимодействует с клиентом по REST/JSON, а что происходит на клиенте непонятно :). Вот что получилось:

Прежде всего создал веб проект для Maven на Jetty 8.1.3.v20120416:


Далее положил примерчик JSON в виде текстового файлика testdata.txt в папку webapp/resources:
{
"Player1":[1,4]
}


Далее создал index.jsp в корне webapp:

Что здесь интересного
1. Функция jQuery ajax - описание здесь
2. Структура $(document).ready(function...) - определяем функцию, которая вызовется после загрузки странички
3. $("input").click(function...) - определяем действие по клику на кнопочку.

Самые пригодившиеся мне материалы для изучения 18-ти минутный туториал по jQuery. Не пожалел потраченных 18-ти минут аж никак :)
jQuery для начинающих по-русски. Хорошо, что по-русски и с примерами, достойная дока, но мне этого не хватило
Ajax/jQuery.getJSON Simple Example. Здесь много примерчиков для понимания, очень помогли.
Simple Long Polling Example with JavaScript and jQuery . Классная статься с примерами как организовать long polling, попробую чуть позже :)

Thursday, April 26, 2012

Порядок с инициализации полей в Java

Сегодня обнаружил интересную багу. Не сразу понял в чем проблема, пока не запустил дебаггер :)

Есть такой класс А

Есть вот такой наследник класса A: Есть еще один наследник класса А:

Внимание, вопрос:
Какой результат выведется на экран, если запустить метод A.main?

Правильный ответ (для JDK 6):
null
foo2

Интересный задротский вопрос для собеседования получился, включу в собеседование на сеньорную позицию в Java :)

Tuesday, April 24, 2012

Automation testing dojo - настройка проекта на Robotframework

Краткая инструкция по установке

Видеомануал по установке Robotframework можно посмотреть здесь
Важно.Необходима версия Python, не ниже 2.6, но не Python 3.

Теперь, когда у вас установлен Python и setup tools, необходимо установить библиотеку robotframework-selenium2library. Я установил с помощью setup tools, запустив команду easy_install robotframework-selenium2library

Скачиваем шаблон проекта http://bit.ly/I7BZQZ и распаковываем. Я распаковал в C:\robotframework-template.

Пробуем запустить тест командой pybot --listener DojoListener.py SampleTest.txt. Если все успешно установлено, то тестовый сценарий упадет с ошибкой, обозначающей, что Selenium не смог найти элемент. Также выведется ошибка, которую выводит скрипт, репортящий результаты выполнения теста.
Возможная ошибка У меня во время запуска примера возникла ошибка '"[PYTHON_EXECUTABLE]"' is not recognized as an internal or external command, operable program or batch file . Чтобы ее пофиксить я зашел в Python\Scripts и в батнике прописал абсолютные пути к питону и роботу в pybot.bat

Устанавливаем Robotframework IDE (RIDE)

Скачиваем инсталляцию отсюда https://github.com/robotframework/RIDE/downloads и инсталлируем.

Прежде, чем запустить RIDE должен быть установлен wxPython. Качаем отсюда http://wxpython.org/download.php#stable
Важно. Если во время установки инсталлер просит ввести путь к установленному Python, то проверьте, чтобы версия wxPython совпадала с версией Python!


Теперь можно запустить RIDE. Для удобства я создал шорткат на скрипт [PythonInstalldir]\Scripts\ride.py на десктопе. Откроем тестовый файл (File->Open, выбираем C:\workspace\robotframework-template\SampleTest.txt).


Регистрация и логи

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

Заменим http://localhosth:8080 на реальный адрес приложения, которое будем автоматизировать.

Заменим JohnDoe на свое уникальное имя.

Важно - имя должно быть написано латинскими буквами без пробелов и спец символов.
Важно2 - Регистр имеет значение. Так JohnDoe и johndoe - это 2 разных пользователя

Соответствие тест кейзов сценариям

Сценарии, которые реализовывает приложение привязывается к тестам Robotframework'a с помощью тагов. В секции Settings, в строке Tags необходимо добавить так с текстом "Scenario N", где N - номер сценария.

Для запуска тестов из RIDE нужно указать полный путь к листенеру в строке Arguments на закладке Run:

После запуска вы должны увидеть сообщение о том, куда будут отправляться результаты тестов:

Saturday, April 21, 2012

Асинхронная событийаня модель в web разработке

Мой доклад на Ciklum Java Saturday. Асинхронная событийная модель в web разработке

The Camtasia Studio video content presented here requires JavaScript to be enabled and the latest version of the Adobe Flash Player. If you are using a browser with JavaScript disabled please enable it now. Otherwise, please update your version of the free Adobe Flash Player by downloading here.

Friday, March 23, 2012

Расширяем JUnit. Декларативные предусловия.

Нам довольно часто приходится писать тесты, в которых по мере разработки сценариев мы выносим общую логику в setUp. Это хорошая практика, но с увеличением количества тестовых сценариев setUp может разрастись до довольно больших размеров. Мне приходилось сталкиваться с такими тестами. Причем принцип Парето в них зачастую соблюдается так: 80% всех тестов используют 20% функциональности, находящейся в setUp. Кроме сложного setUp каждый тест еще обычно создает свои специфические предусловия. Это довольно сильно усложняет понимание такого теста, т.к. приходится постоянно помнить, что находится в setUp и, к тому же, понимать какие предусловия дополнительно создаются для каждого теста.

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

Итак, предположим нам нужно разработать фильтр для файлов, аналогичный тому, который мы используем в файловых менеджерах. Например если наложить фильтр *.txt, то должен вернутся список текстовых файлов.

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

А было бы легче работать с тестом, который написан таким образом?


Как такое может заработать?


Самый простой вариант - это реализовать свой ранер, наследник от базового класса org.junit.runner.Runner и указывать его в качества "запускальщика":



Полный текст кода класса FileFilterRunner


Что здесь интересного
1. Наследуемся от BlockJUnit4ClassRunner
2. Перекрыт метод runChild. В нем перед вызовом тестового метода создаем временную директорию и заполняем ее тестовыми файлами, имена которых берем из нашей аннотации Given. Для работы с файлами использую библиотеку Apache Commons IO
3. Перекрыт метод validatePublicVoidNoArgMethods. Это позволяет запускать тестовые методы с параметрами
4. Перекрыт метод methodInvoker. Этот метод вызывается JUnit фреймворком для каждого тестового метода
5. Класс ParameterizedInvoker - это наша реализация "вызывальщика" тестовых методов. Мы вызываем тестовый метод с параметром testFolder

Вот сама аннотация Given:


Что получили?


1. Тест стал более читабелным за счет того, что мы вынесли инициализацию предусловий в документирующую аннотацию Given.
2. Реализованный ранер можно легко использовать в других тестах.
3. Если развивать этот подход, то уменьшится необходимость создавать суперкласс для тестовых классов, в котором хранить общую логику для всех наследуемых тестов. Все в аннотациях.
4. Нету setUp/tearDown в тесте
5. Инициализируем только то, что нужно для теста. Если нам, например, понадобится набор папок, то мы добавим в аннотацию параметер folders. Если пользователь с именем "Вася", то - параметр users.
6. Можем ужесточать или ослаблять предусловия. Что если, например, параметр files станет обязательным? Мы уберем инициализацию по умолчанию default {}, тем самым тесты, которые не использовали обязательные параметры перестанут компилироваться и мы их сразу обнаружим
7. Если видишь, чем хорош или плох этот подход - пиши комент, дополню список

Идеи развития


Аннотированные параметры тестового метода. Если есть необходимость передавать разные параметры в тестовый метод, то мы можем их именовать с помощью анотаций, имеющих тип @Target(ElementType.PARAMETER):


Например, нам в тесте понадобился список созданных файлов и путь к корневой директории:


Полный текст исходников и проекта находится здесь качать

Thursday, March 08, 2012

Automation testing dojo - настройка проекта на Java

Ответ на вопрос "Готов ли я участвовать в Automated testing dojo?" дает следующий тест:


Given installation manual below
When I run sample tests from the template
Then I see green line


Как только этот тест PASSED, то можно присоединяться к участникам соревнования, имея большие шансы набрать наибольшее количество баллов ;). Если тест FAILED, то всегда есть у кого попросить помощи в настройке (мой email указан в профайле).

Руководство по установке


Для того, чтобы настроить проект потребуется средство сборки и управления зависимостями Maven. Скачать можно отсюда. Инструкция по установке здесь.
Проверить правильность установки мавена можно запустив из командной строки команду mvn -version. В случае успешной установки на консоль выведется версия Maven и Java.

Скачиваем шаблон проекта. Качать здесь. Распаковываем в папку на диске. В моем случае это c:\workspace\projects\template-java.
Ниже инструкции настройки проекта для Инструкция для IDE IntelliJ IDEA и Инструкция для Eclipse. Немного проще настраивать в IntelliJ IDEA, т.к. там встроена хорошая поддержка Maven проектов.

Инструкция для IDE IntelliJ IDEA


Инструкция для IntellJ IDEA 11 Community Edition, скачать которую можно здесь.
После запуска IDE выбираем File->New Project... или выбираем значок Create New Project из панели Quick Start:


Выбираем Import Project from external model и жмем Next. Обратите внимание, что если у вас версия IDEA ниже 11, то пункт "Import project from external module" будет последним в списке.


Проект Maven, Next


Указываем путь к папке, в которую распаковали шаблон проекте (в моем случае это c:\workspace\projects\template-java), нажимаем Next


Должен обнаружиться мавеновский проект:


Название проекта и расположение оставляем как есть и жмем Finish


Немного подождем, пока загрузятся нужные библиотеки и посмотрим на структуру проекта.


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


Попробуем скомпилировать и запустить тест. Запустить можно по правой кнопки мыши и выбрать Run "SampleAutomationTest" или сочетанием клавиш <ctrl>+<shift>+F10.


Вы получили ответ на вопрос "Готов ли я участвовать в Automated testing dojo?". Если тест зеленый, то готов! Приходи на dojo, регистрируйся и начинай автоматизировать! К инструкции как регистрироваться


Инструкция для Eclipse


Инструкция для Eclipse IDE for Java developers. Скачать можно здесь. Выбрана именно эта конфигурация Eclipse потому что она интегрирована с Maven.


При запуске Eclipse спросит где будет находиться наш ворскпейс. Оставляем по умолчанию.


После запуска IDE выбираем File->Import... и в появившемся окне выбираем Maven->Existing Maven Projects и жмем Next


Затем выбираем папку, в которой находитдя шаблон проекта. В моем случае это c:\workspace\projects\template-java. Нажимаем Finish


Немного подождем, пока скачаются все зависимости, после чего смотрим на структуру проекта:


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


Запустим тест. Правой кнопкой мыши Run As->JUnit Test из окна с исходным текстом или в окошке Outline.


Вы получили ответ на вопрос "Готов ли я участвовать в Automated testing dojo?". Если тест зеленый, то готов! Приходи на dojo, регистрируйся и начинай автоматизировать! К инструкции как регистрироваться

Регистрация и логи


Прежде чем зарегистрироваться нужно указать в тесте адрес сервера в анотации @ReportTo. Заменим http://127.0.0.1:8080 на реальный адрес приложения, которое будем автоматизировать. После чего укажем имя, под которым на сервер будут отсылаться отчеты о успешности выполнения теста. Заменим JohnDoe на свое уникальное имя.
Важно - имя должно быть написано латинскими буквами без пробелов и спец символов.
Важно2 - Регистр имеет значение. Так JohnDoe и johndoe - это 2 разных пользователя

Открываем браузер и вводим такой URL: http://<server address>/register. Где <server address> - это IP адрес сервера. В тест боксе Player name вводим имя игрока


Если вы ввели уникальное имя, то выведется страничка с результатами запуска тестовых сценариев

Где в столбце
  • Scenario - номер сценария
  • Score - количество очков, полученные за результат выполнения (или бездействия) автоматизированного тестового сценария
  • Test result - прошел тест или нет (true/false)
  • Description - краткое описание за что начислили (или отобрали) баллы
  • Log type - То как система распознала отчет автоматизированного теста

    Переключимся в IDE и запустим тестовый сценарий. После чего в логах должна появиться вот такая запись:


    Теперь можно автоматизировать сценарии, описание которых можно увидеть, если перейти по линку на страничке логов или ввести URL http://<server address>/scenarios