phpunit, структура, selenium

Kirill

Новичок
phpunit, структура, selenium

Задача: Тесты селениума должны работать в разных браузерах, браузеры должны задаваться из конфига.

Решение: из мануала phpunit:
PHP:
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox',
        'host'    => 'my.linux.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on MacOS X',
        'browser' => '*safari',
        'host'    => 'my.macosx.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on Windows XP',
        'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Internet Explorer on Windows XP',
        'browser' => '*iexplore',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      )
    );
Так работает, но конфиг со списоком браузеров можно считать только в setUp, крайний случай в __construct, но тесты не работают если браузеры задаются не как статичное св-во:

PHP:
    protected function setUp()
    {
        $this->setupConfig();

        self::$browsers = array(array('name'    => 'Firefox',
                                          'browser' => '*firefox'),
                                    array('name'    => 'Safari',
                                          'browser' => '*safari'));
}
получаю ошибку: Browser not supported. Судя по консоли RC сервера видно, что параметр браузера для старта пустой.
Пробовал задавать переменную self::$browsers в конструкторе - тотже эффект.

Why?

Копаться в структуре phpunit не хочется
 

StUV

Rotaredom
Kirill
не совсем понятно - что у тебя есть (код), что ты хочешь получить и что получаешь.

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

Kirill

Новичок
если браузеры определять так:
PHP:
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox',
        'host'    => 'my.linux.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on MacOS X',
        'browser' => '*safari',
        'host'    => 'my.macosx.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on Windows XP',
        'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Internet Explorer on Windows XP',
        'browser' => '*iexplore',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      )
    );
- тесты запускаются

Если браузеры определять так:
PHP:
protected function setUp()
    {
        $this->setupConfig();

        self::$browsers = array(array('name'    => 'Firefox',
                                          'browser' => '*firefox'),
                                    array('name'    => 'Safari',
                                          'browser' => '*safari'));
}
не работает
 

Alexandre

PHPПенсионер
мы долго трахались с PHPUnit и решили тесты написать на java
по техники написания тестам мало отличается от PHP

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

StUV

Rotaredom
Kirill
т.е. - если так
PHP:
require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 
  
class WebTest extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    public static $browsers = array(...);
    ...
}
то "работает", а если так:
PHP:
require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 
  
class WebTest extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    protected function setUp() 
    { 
        $this->setupConfig(); 
        self::$browsers = array(...);
        ...
    }
    ...
}
то "не работает"

я ничего не пропустил ? ;)

-~{}~ 08.07.09 17:41:

зы:
напиши полностью "значимый код" - реальный и без ненужных подробностей (типа атрибутов браузеров и т.п...)
 

Kirill

Новичок
StUV, да, ты прав.
Тот код, что ты привел - "значимы код"
 

iceman

говнокодер
а так?
PHP:
class WebTest extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    public static $browsers;
    protected function setUp() 
    { 
        $this->setupConfig(); 
        self::$browsers = array(...);
        ...
    }
    ...
}
 

Kirill

Новичок
не важно, если $browser задается не как public static $browsers = array(...); - не работает. Я и конструктор пробовал выносить, и в конструкторе задавать - не помогало.

-~{}~ 08.07.09 18:34:

phpunit как то хитро объект создает, нужно в структуре разбираться
 

zerkms

TDD infected
Команда форума
и почему-то до сих пор никто не догадался, что список браузеров может читаться лишь единожды в конструкторе, например. а не каждый раз перед запуском кейса

(просто предположение)
 

Gorynych

Посетитель PHP-Клуба
сакс, тесты должны работать в разных браузерах - логика представления (выбор css) логика выплнения (бизнес логика) в этом примать участия не должна (имхо)
 

Raziel[SD]

untitled00
Автор оригинала: Kirill
не важно, если $browser задается не как public static $browsers = array(...); - не работает. Я и конструктор пробовал выносить, и в конструкторе задавать - не помогало.

-~{}~ 08.07.09 18:34:

phpunit как то хитро объект создает, нужно в структуре разбираться
Потому что PHPUnit сначала считывает настройки браузеров, и только потом создает объект, обрати внимание public static $browsers

Самый простой способ с этим бороться:
conf.php
PHP:
PHPUnit_Extensions_SeleniumTestCase::$browsers = array(...);
и потом phpunit --bootstrap conf.php ...

до выхода пхпюнит 3.3 проще было пропатчить самому пхпюнит.


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

З.Ы. селениум только 30 мая перестал быть бетой, и сейчас вроде пока не вылетает, хотя и раньше это было не часто, а главное не фатально, достаточно было зациклить запуск селениума.
 

Gorynych

Посетитель PHP-Клуба
Если Вам больше нравиться использовать сложноподчиненные, но красивые, патеррны, вместо выбора инструмента под конкретную задау - вопрос бессмесленен. Вы уже все решили.
 
Сверху