Подключение классов Selenium к PHPUnit

В продолжении статьи «Установка PEAR + PHPUnit» стоит отметить, что на русскоязычных сайтах почему-то практически нет информации о том, как же заставить выполняться тесты под Selenium. Везде пишут примерно так: «Подключите SeleniumTestCase.php, унаследуйтесь от PHPUnit_Extensions_SeleniumTestCase». А вот где взять собственно SeleniumTestCase.php ни слова. Ну да, PHPUnit мы установили, но он то не содержит такого файла! Оказывается, нужно вручную доустановить необходимое расширение:

pear install phpunit/phpunit_selenium

Теперь в папке PHPUnit\Extensions появятся необходимые файлы.

Установка PEAR + PHPUnit (Windows)

А вы думаете, что это легко? Я тоже так поначалу думал: скачал PHP 5.3 в виде инсталлера, в опциях установки отметил пункт «Установить PEAR». После установки PHP в его папке создаются два файла: go-pear.phar и go-pear.bat. Если попытаться сразу же запустить go-pear.bat, то появится ошибка о том, что файл go-pear.phar не найден (ну почему уже проблемы начинаются с самого начала?). Для того, чтобы файл был найден, необходимо подредактировать содержимое go-pear.bat, указав прямой путь до искомого файла:

%PHP_BIN% -d output_buffering=0 \path\to\PEAR\go-pear.phar

Далее можно приступать непосредственно к установки. Запускаем go-pear.bat, видим следующее:

Are you installing a system-wide PEAR or a local copy?
(system|local) [system] :

Выбираем system, далее нам предлагают либо установить элементы PEAR в указанные директории, либо указать их руками. Лучше, конечно, второй вариант:

1. Installation base ($prefix) : C:\php\PEAR
2. Temporary directory for processing : C:\php\PEAR\tmp
3. Temporary directory for downloads : C:\php\PEAR\tmp
4. Binaries directory : C:\php\PEAR
5. PHP code directory ($php_dir) : C:\php\PEAR
6. Documentation directory : C:\php\PEAR\docs
7. Data directory : C:\php\PEAR\data
8. User-modifiable configuration files directory : C:\php\PEAR\cfg
9. Public Web Files directory : C:\php\PEAR\www
10. Tests directory : C:\php\PEAR\tests
11. Name of configuration file : C:\php\PEAR\pear.ini
12. Path to CLI php.exe : C:\php\php.exe

1-12, 'all' or Enter to continue:

Однако установщик наотрез отказался видеть php.exe:

**ERROR**: not a folder, or no php.exe found in this folder.

Как я не шаманил, но научить видеть php.exe у меня не получилось. Пришлось скачивать архив с файлами PEAR. Ок, скачал, распаковал. Следовал вот этой неплохой инструкции по реанимации PEAR, если по какой-то причине установщик не работает. Пробуем получить информацию о PEAR:

pear version

Получаем:

fakeprompt PHP_PEAR_INSTALL_DIR is not set correctly.
Please fix it using your environment variable or modify

Препарирую pear.ini, комментируя часть строчек с путями к директориям, а часть снова подправляя. Добиваюсь того, что ошибка пропадает (однако остается косяк с определением версии PEAR):

PEAR Version: @pear_version@
PHP Version: 5.3.13
Zend Engine Version: 2.3.0
Running on: Windows NT 6.1 build 7601 (Windows 7 Enterprise Edition Service Pack 1) i586

Пробую установить PHPUnit, для этого командую:

pear update-channels
pear upgrade-all
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear install phpunit/PHPUnit

Получаю:

No releases available for package "pear.phpunit.de/PHPUnit"
install failed

Ну что на сей раз не так-то? Поиск по сети дал следующую подсказку:

pear clear-cache
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear install --alldeps phpunit/PHPUnit

После чего PHPUnit наконец-то установился:

phpunit/PHP_CodeCoverage can optionally use PHP extension "xdebug" (version >;= 2.0.5)
phpunit/PHPUnit_MockObject can optionally use PHP extension "soap"
phpunit/PHP_Invoker requires PHP extension "pcntl"
downloading PHPUnit-3.6.11.tgz ...
Starting to download PHPUnit-3.6.11.tgz (119,171 bytes)
.........................done: 119,171 bytes
downloading File_Iterator-1.3.1.tgz ...
Starting to download File_Iterator-1.3.1.tgz (5,157 bytes)
...done: 5,157 bytes
downloading Text_Template-1.1.1.tgz ...
Starting to download Text_Template-1.1.1.tgz (3,622 bytes)
...done: 3,622 bytes
downloading PHP_CodeCoverage-1.1.2.tgz ...
Starting to download PHP_CodeCoverage-1.1.2.tgz (132,552 bytes)
...done: 132,552 bytes
downloading PHP_Timer-1.0.2.tgz ...
Starting to download PHP_Timer-1.0.2.tgz (3,686 bytes)
...done: 3,686 bytes
downloading PHPUnit_MockObject-1.1.1.tgz ...
Starting to download PHPUnit_MockObject-1.1.1.tgz (19,897 bytes)
...done: 19,897 bytes
downloading YAML-1.0.6.tgz ...
Starting to download YAML-1.0.6.tgz (10,010 bytes)
...done: 10,010 bytes
downloading PHP_TokenStream-1.1.3.tgz ...
Starting to download PHP_TokenStream-1.1.3.tgz (9,860 bytes)
...done: 9,860 bytes
install ok: channel://pear.phpunit.de/File_Iterator-1.3.1
install ok: channel://pear.phpunit.de/Text_Template-1.1.1
install ok: channel://pear.phpunit.de/PHP_Timer-1.0.2
install ok: channel://pear.symfony-project.com/YAML-1.0.6
install ok: channel://pear.phpunit.de/PHP_TokenStream-1.1.3
install ok: channel://pear.phpunit.de/PHP_CodeCoverage-1.1.2
install ok: channel://pear.phpunit.de/PHPUnit_MockObject-1.1.1
install ok: channel://pear.phpunit.de/PHPUnit-3.6.11

Проверяем:

phpunit --version

Получаем:

PHPUnit 3.6.11 by Sebastian Bergmann.

Список каналов обновления для Google Chrome

Официальный список ссылок для загрузки различных веток браузера Google Chrome: stable, beta, dev и canary.

Кстати, о существовании Canary я узнал только сейчас, хотя данной ветки уже более двух лет. Данную сборку можно использовать совместно с уже существующим Chrome (что несомненно  поможет в тестировании). Canary является dev-сборкой, но с более частыми обновлениями.

Тестирование Android-приложения с помощью Eclipse + Testdroid Recorder

1. Создайте учетную запись на сайте «Testdroid«.
2. Установите плагин «Testdroid» в Eclipse: «Help» -> «Eclipse Marketplace», в поле «Find» вписываем «Testdroid Recorder». После того, как плагин будет найден, жмите «Install».
3. В качестве примера создайте Android-проект из sample: «File» -> «New» -> «Other» -> «Android Project». В окне «New Android Project» задать имя проекта и выбрать «Create project from existing samples», нажать кнопку «Next». В следующем окне выберите нужную версию Android, которая имеет примеры. В окне «Select Sample» выберите «NotePad» и нажмите кнопку «Finish».
4. Выделите созданный проект и вызовите контекстное меню. Затем «Android Tools» -> «New Test Project». Задайте имя проекта <AddNoteTest> и сохраните проект.
5. Выделите созданный проект и вызовите контекстное меню. Затем «Build Path» -> «Configure Build Path…». В открывшемся окне перейдите на вкладку «Libraries», нажмите кнопку «Add External JARs» и выберите файл robotium-solo-<version>.jar (последнюю версию можно скачать на оф.сайте). Перейдите на вкладку «Order and Export» и отметьте чек-бокс напротив robotium-solo-<version>.jar. Нажмите кнопку «ОК».
6. В пакете com.example.android.notepad.test создайте новый класс с именем <AddNoteTest> и со следующим содержанием:

package com.example.android.notepad.test;
 
import android.test.ActivityInstrumentationTestCase2;
import com.example.android.notepad.NotesList;
import com.jayway.android.robotium.solo.Solo;
 
public class AddNoteTest extends ActivityInstrumentationTestCase2{
 
	private static final String APP_PACKAGE_NAME = "com.example.android.notepad";
	protected Solo solo;
	protected Integer screenWidth = null;
	protected Integer screenHeight = null;
 
	public AddNoteTest() {
		super(APP_PACKAGE_NAME, NotesList.class);
	}
 
	public void setUp() throws Exception {
		solo = new Solo(getInstrumentation(), getActivity());
	}
 
	public void testAddNote() throws Exception {
		solo.waitForActivity("NotesList", 500);
		solo.sleep(2500);
		solo.clickOnMenuItem("Add note", true);
		solo.waitForActivity("NoteEditor", 500);
		solo.sleep(2500);
		solo.clearEditText(0);
		solo.enterText(0, "Hello world!");
		solo.sleep(2500);
		solo.goBack();
		solo.waitForActivity("NotesList", 500);
		solo.sleep(2500);
		solo.clickOnMenuItem("Add note", true);
		solo.waitForActivity("NoteEditor", 500);
		solo.sleep(2500);
		solo.clearEditText(0);
		solo.enterText(0, "New");
		solo.sleep(2500);
		solo.goBack();
		solo.waitForActivity("NotesList", 500);
		solo.sleep(2500);
		solo.clickInList(1);
	}
 
	@Override
	public void tearDown() throws Exception {
		//Robotium will finish all the activities that have been opened
		solo.finishOpenedActivities();
	}
}

7. Выделите созданный проект и вызовите контекстное меню. Затем «Run As…» -> «Android JUnit Test». В зависимости от того, где вы тестируете приложение (эмулятор или телефон), на экране устройства запуститься приложение, в котором начнут автоматически происходить действия, описанные в тесте.

В следующей заметке я расскажу, как с помощью Testdroid Recorder создавать Record/Play тесты.

Cвязка Selenium + JUnit + Maven в NetBeans IDE

В этой заметке я расскажу, как создать связку Selenium RC + JUnit (фреймворк для тестирования) + Maven (сборщик проектов) на примере NetBeans IDE.

  1. В NetBeans из списка доступных подключаемых модулей («Сервис» -> «Подключаемые модули») необходимо выбрать и установить «Selenium Module for Maven».
  2. Создать новый проект «Maven» -> «Приложение Java». Дождаться загрузки всех файлов для работы с Maven. Когда проект будет построен, в папке тестовых зависимостей появится JUnit.
  3. Добавить в проект «Selenium Test Case for Maven project» («Создать» -> «Другое», в категории выбрать «Selenium»). В папке тестовых зависимостей появится Selenium.
  4. Выделить папку «Тестовые зависимости», вызвать контекстно меню и выбрать «Загрузить объявленные зависимости».
  5. Попытаться построить проект с зависимостями (выделить проект, вызвать контекстно меню и выбрать «Построить с зависимостями»). Если появится сообщение ошибке «error: package org.junit does not exist», то переходим к шагу 6, иначе к шагу 7.
  6. Загрузить последнюю версию JUnit с официальной страницы проекта. На текущий момент актуальной версией является 4.10. В папке тестовых зависимостей выделить JUnit, вызвать контекстно меню и выбрать «Установить артефакт вручную». Выбрать загруженные JUnit и нажать на кнопку «Локальная установка». После этого ошибка «error: package org.junit does not exist» должна пропасть.
  7. Чтобы проводить тесты, необходимо загрузить загрузить последний Selenium RC с официальной страницы проекта. На текущий момент актуальной версией является 2.19.0. После чего нужно запустить загруженный файл: java -jar selenium-server-standalone-2.19.0.jar
  8. Убедиться, что все работает — выделить созданный класс в пункте 3, вызвать контекстно меню и выбрать «Тестировать файл». После чего должен запуститься указанный в конструкторе браузер.

Дальше уже все по своему усмотрению. К примеру, тесты, написанные в Selenium IDE можно перенести на Selenium RC / WebDriver. Для этого в Selenium IDE есть функция «Формат», которая позволяет автоматически конвертировать текущий формат представления теста в выбранный.

PHP скрипт для POST запросов

Каркас рабочего php-скрипта, который может помочь при тестировании API — отправляет POST-запросы через curl на сервер. В дальнейшем может быть модифицирован исходя из поставленной задачи. В частности, в примере используется аутентификация пользователя с помощью его логина и пароля путем передачи этих параметров на сервер.

/*
 * Autentification test script
*/
 
$postURL = "http://api.site.com/";
$username = 'UserName';
$password = 'UserPassword';
$postVars = "&amp;username=$UserName&amp;password=$UserPassword";
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postURL);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postVars);
$result = curl_exec($ch);
curl_close($ch);
 
if(!$result)
{
    $error = curl_error($curl).'('.curl_errno($curl).')';
    echo $error;
}
else
{
    echo $result;
}

С башогра про тестирование

Суровые российские монтажники получили задание от начальника установить лампу освещения на входе в здание с автоматом выключения. Есть такие, вырубающие ток в светлое время суток. Собрали, подключили, а так как на дворе светлый день, то проверка прошла на ура. Закрыли датчик шапкой — темно. Лампа включается. Сняли шапку с датчика — светло. Лампа выключается. И с чувством выполненного долга ушли домой.

Самый цирк начался поздно вечером, потому что датчик монтажники закрепили прямо над лампой. Всю ночь у дежурного была дискотека: стемнело — датчик лампу зажег, лампа зажглась и стало светло, а стало светло — датчик лампу гасит, ой опять темно — датчик лампу зажигает …. и так от заката до рассвета.

Плагин User Agent Switcher для Firefox

Существует отличный плагин для браузера Firefox, который позволяет эмулировать различные user-agent’ы браузеров, будь то Internet Explorer, Opera, Safari и т.п. Первоначально в плагине имеется совсем небольшая поддержка  user-agent’ов, но это не беда. Достаточно импортировать вот этот xml-файл, который содержит в себе огромное количество user-agent’ов, удобно сгруппированных по категориям.

Так, к примеру, на скриншоте ниже, я выбрал в качестве user-agent’а iPad, и сайт Google автоматически переключился на версию для планшетных ПК.

Плагин можно загрузить через менеджер расширений в браузере Firefox, набрав в поисковой строке расширений «User Agent Switcher».