the_norn (the_norn) wrote,
the_norn
the_norn

Category:

Мультибраузерные тесты

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

selenium = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort(), "*chrome", url);

 

например на InternetExplorer
selenium = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort(), "*iexplorer", url);

 

или на оперу,сафари,

конкверор, также основанные на вышеперечисленных(например Avant или GreenBrowser) и даже нестандартные (обязательна поддержка javaScript). Например запустить тесты под Netscape можно заменив идентификатор браузера в параметрах на следующий

*custom c:\Program Files\Netscape\Netscape\Netscp.exe
только необходимо помнить, что в используемом браузере должен быть установлен, в качестве прокси, адрес селениум сервера.

Это все конечно удобно и просто - поменял строку запуска и уже тесты запускаются в другом браузере, но остается еще несколько проблем



  1. Чтобы провести тестирование в n браузерах нужно поменять строку запуска n раз и запустить это все вручную

  2. Необходимо наблюдать за процессом тестирования с целью выявления проблем несовместимости теста с браузером и проблем верстки приложения или несовместимости приложения и браузера

  3. Проведение мультибраузерных тестов на одной машине займет очень много времени и ресурсов.

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


<junit haltonfailure="yes" haltonerror="yes" printsummary="yes" maxmemory="512m">
<sysproperty key="SELENIUM_SERVER_HOST" value="localhost"/>
<sysproperty key="SELENIUM_SERVER_PORT" value="4444"/>
<sysproperty key="SELENIUM_BROWSER_STARTCOMMAND" value="*chrome"/>
<classpath refid="WebTestsclasspath"/>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<batchtest todir="output/test-result">
<fileset dir="output" includes="**/Test.class"/>
</batchtest>
</junit>

как видно из скрипта помимо стандартной процедуры запуска JUnit добавились команды для передачи в тестируемый скрипт параметров - sysproperty, скрипт теста изменился следующим образом



 selenium = new DefaultSelenium(System.getProperty(SELENIUM_SERVER_HOST),
Integer.parseInt(System.getProperty(SELENIUM_SERVER_PORT)),
System.getProperty(SELENIUM_BROWSER_STARTCOMMAND),
url);

 


В итоге у нас получился один параметризованный тест, который мы запускаем и передаем параметры из анта, помимо браузера мы также можем задавать папку для складывания логов (для дальнейшего разбора в каком браузере и как глючит)


Для решения второй проблемы можно использовать возможности языка Java и интеграционного сервера, итак для базовой сверки отображения верстки в браузере мы,создав класс наследник, перегрузим базовые методы селениума, такие как Click и Type и Open


    public void click(String locator) {
super.click(locator);
ScreenShot();
}

public void open(String url) {
super.open(url);
ScreenShot();
}

public void type(String locator, String value) {
super.type(locator, value);
ScreenShot();
}

private void ScreenShot()
{
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-mm-dd-hh-mm");
java.util.Date date = new java.util.Date();
String dd = formatter.format(date);
selenium.captureScreenshot(dd + ".png");
}

 


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


Третью проблему мы можем разрешить при помощи одного из проектов создателей селениума - Selenium Grid, который позволяет распределенно запускать тесты на различного рода платформах и различных браузерах, при этом процедура запуска нисколько не меняется. Принцип работы с SeleniumGrid следующий - запускается хаб, рапределяющий нагрузку между распределенными серверами, затем запускаются седениум сервера с настройками браузеров, в которых может тестировать данный сервер, подключение клиента осуществляется к хабу, который уже перенаправляет на свободный/подходящий селениум сервер (причем названия браузеров мы можем менять - например FirefoxOnLinux, в скрипте инициализации селениума нужно в качестве браузера указать то же самое).Также при запуске тестов на SeleniumGrid необходимо выставлять у junit параметр forked=true а forkmode=pertest, но это только при условии не связанности тестов! В противном случае возможны race condition. Этот параметр позволяет запускать различные тесты параллельно на нескольких машинах одновременно, что позволяет разгрузить интеграционную машину и ускорить проведение тестов.


В качестве минусов мультибраузерных тестов хочу заметить что не все тесты будут проходить на различных браузерах (например загрузка файлов) но это больше не ограничение селениума а ограничения безопасности по выполнению java script.


Удачного тестирования веб приложений!

 

Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 12 comments