Тестирование веб-приложений основано не только на модульных и функциональных тестах для компонентов на стороне сервера (PHP, Java) и на стороне клиента (JavaScript), но и на сквозных тестах, подобных тем, которые выполняются с Selenium. Selenium способен управлять реальным браузером, таким как Firefox, так же, как и пользователь, позволяя вам выразить тест с последовательностью загрузки страницы, выбором элементов, щелчками и набранными символами.
Selenium 2 предоставляет API WebDriver, который может быть реализован многими различными серверами: с ним можно управлять не только браузерами для настольных компьютеров, но и браузерами на мобильных устройствах, такими как стандартный браузер Android.
В этом руководстве мы поэкспериментируем с драйвером Android и настроим пару тестов для запуска на виртуальном устройстве Android.
Настройка Android
Лучшим выбором для запуска тестов является эмулятор, так как он более универсален, чем реальный мобильный терминал, и его можно легко обновить с помощью различных версий (хотя, например, у меня нет реального устройства Android 4.x, крайне рекомендуемой версии).
Если у вас уже есть настройка виртуального устройства, вы можете пропустить этот шаг. Если нет, перед запуском эмулятора убедитесь, что вы установили все необходимые пакеты, перечисленные здесь, вместе с Android SDK .
Для продолжения вы должны иметь в своем распоряжении команды android , emulator и adb .
$ android create avd -n my_android -t 12 -c 100M
создаст виртуальное устройство с именем my_android . Чтобы получить список возможных целей для опции -t, выполните:
$ android list targets
Теперь вы можете запустить эмулятор с:
$ emulator -avd my_android
С помощью android avd вы можете открыть окно конфигурации и добавить директиву ускорения Gpu в качестве новой аппаратной опции (со значением yes). Я не видел никакой разницы в тестах после добавления опции.
Установка
$ adb devices List of devices attached emulator-5554 device
отобразит список доступных устройств: вам следует подождать, пока не появится «устройство» вместо «офлайн».
$ adb -s emulator-5554 -e install -r android-server.apk
установит приложение WebDriver, которое можно загрузить с сайта Selenium .
Запустите драйвер Android с помощью:
$ adb -s emulator-5554 shell am start -a android.intent.action.MAIN -n org.openqa.selenium.android.app/.MainActivity
и подождите пару секунд, пока он вернет управление оболочке.
Поскольку эмулятор не имеет IP-адреса, мы должны перенаправить порт хоста 4000 на устройство 8080 (4000 — просто пример) с помощью:
adb -s emulator-5554 forward tcp:4000 tcp:8080
В случае любой ошибки, отобразите журналы с:
adb logcat
Написание теста
Тесты, которые хотят запускать внутри Android, будут использовать протокол Json Wire Protocol, который принимает запросы от привязок, написанных на любом языке. Фактически, тесты будут взаимодействовать с localhost: 4000, REST-подобным API WebDriver, который, в свою очередь, перенаправляется на порт 8080 эмулятора.
Разумеется, браузер для запроса — это Android. Даже из кода Java, который обычно взаимодействует с WebDriver напрямую, доступен класс RemoteWebDriver .
пример
В этом примере я также настроил крошечный веб-сервер на 192.168.0.2 (локальный компьютер) для обслуживания некоторых HTML-страниц, которые используются в тестах. В реальном сценарии вы будете обслуживать свое веб-приложение.
Поскольку я нацеливаюсь на веб-сервер приложения с его IP-адресом, этот тест может также работать с реальными телефонами, которые подключаются к беспроводной локальной сети.
<?php class AndroidTest extends PHPUnit_Extensions_Selenium2TestCase { public function setUp() { $this->setHost('localhost'); $this->setPort(4000); $this->setBrowser('android'); $this->setBrowserUrl('http://192.168.0.2:8080'); } public function testLoadsAnHtmlPage() { $this->url('html/test_open.html'); $this->assertEquals('Test open', $this->title()); } public function testTypingViaTheKeyboard() { $this->url('html/test_type_page1.html'); $usernameInput = $this->byName('username'); $usernameInput->value('giorgio'); $this->assertEquals('giorgio', $usernameInput->value()); $passwordInput = $this->byName('password'); $passwordInput->value('password'); $this->assertEquals('password', $passwordInput->value()); $this->clickOnElement('submitButton'); $h2 = $this->byCssSelector('h2'); $this->assertRegExp('/Welcome, giorgio!/', $h2->text()); } }
Это результат тестов (HTML-страницы взяты из набора тестов PHPUnit_Selenium):
$ phpunit --colors AndroidTest.php PHPUnit 3.6.10 by Sebastian Bergmann. .. Time: 02:22, Memory: 3.75Mb OK (2 tests, 4 assertions)
Выводы
Эти тесты медленные, и мы не проводили никакой оптимизации. Не только запуск браузера через WebDriver медленнее, чем выполнение модульных тестов, но мы также находимся внутри эмулятора, который переводит инструкции, предназначенные для другого семейства процессоров. Эти обычные тесты Selenium могут занять всего несколько секунд в настольном браузере.
Как и во всех тестах Selenium, вы можете увидеть (если оставить приложение WebDriver на переднем плане) тесты, выполняемые в экземпляре браузера Android. Тем не менее, все команды доступны из оболочки, и автоматизация выполнения эмулятора, и тестовый запуск находится всего в одном шаге.