Переход из Selenium IDE на SeleniumRC+PHPUnit+NetBeans
#1
Отправлено 01 ноября 2010 - 18:38
Возникла необходимость осуществить переход из Selenium IDE на связку SeleniumRC+PHPUnit+NetBeans в связи с нарастающей сложностью проектов и соответственно тестов.
К этому времени у меня уже есть набор тестов на Selenium IDE. Я их конвертирую в формат для связки и добавляю в проект. И тут начинаются проблемы...
1. Как правильно организовать структуру тестов сейчас? У мене есть ряд действий таких как залогиневание клиента, редактирование данных клиента, создание компаний, для клиента, их настройка, и т.д. Все эти действия в Selenium IDE у меня были в отдельных тест-кейсах объединенных в тест-сюит. Нужно ли сейчас в PHPUnit объединять их в одном файле з набором тестов, или же оставить по одному тесту в каждом файле?
2. Если оставлять все как есть то как организовать тест-сюит. Негде не нашел хорошей информации с примерами по создание тест-сюитов NetBeans+PHPUnit.
3. Если же объеденить все в один файл, то после каждого выполнения теста браузер закрывается и теряются некоторые настройки в проекте + приходется заново залогиниватся. Так же й при первом варианте.
4. При входе на сайт нужно пройти залогинивание. В Selenium IDE это был мой первый шаг в тест-сюите. Как сейчас организувать это дело. Если вызывать tearDown() то браузер закриваэться и нужно перезалогиниватся...
Общем, буду рад любой помощи здесь или хорошим ссилкам по теме.
#2
Отправлено 02 ноября 2010 - 08:39
А раньше позвольте спросить у вас как было?Помогите новичку в SeleniumRC+PHPUnit+NetBeans.
Возникла необходимость осуществить переход из Selenium IDE на связку SeleniumRC+PHPUnit+NetBeans в связи с нарастающей сложностью проектов и соответственно тестов.
К этому времени у меня уже есть набор тестов на Selenium IDE. Я их конвертирую в формат для связки и добавляю в проект. И тут начинаются проблемы...
1. Как правильно организовать структуру тестов сейчас? У мене есть ряд действий таких как залогиневание клиента, редактирование данных клиента, создание компаний, для клиента, их настройка, и т.д. Все эти действия в Selenium IDE у меня были в отдельных тест-кейсах объединенных в тест-сюит. Нужно ли сейчас в PHPUnit объединять их в одном файле з набором тестов, или же оставить по одному тесту в каждом файле?
2. Если оставлять все как есть то как организовать тест-сюит. Негде не нашел хорошей информации с примерами по создание тест-сюитов NetBeans+PHPUnit.
3. Если же объеденить все в один файл, то после каждого выполнения теста браузер закрывается и теряются некоторые настройки в проекте + приходется заново залогиниватся. Так же й при первом варианте.
4. При входе на сайт нужно пройти залогинивание. В Selenium IDE это был мой первый шаг в тест-сюите. Как сейчас организувать это дело. Если вызывать tearDown() то браузер закриваэться и нужно перезалогиниватся...
Общем, буду рад любой помощи здесь или хорошим ссилкам по теме.
По идее проще сделать несколько процедур, в которых есть проверки, далее вызывать в одной все эти процедуры... Это и будет один тест
#3
Отправлено 02 ноября 2010 - 13:12
Сейчас так:
Да, можно сделать так как вы написали, но тогда придется объединить все файлы в один... Может есть еще какие-то подходы?
+ Поясните мне как создавать тест-кейси (желательно на примере).
#4
Отправлено 02 ноября 2010 - 14:12
protected function tearDown () { parent::tearDown(); }
Расскажите плз для в чём смысл в функции tearDown обращатся к parent::tearDown(); ?
#5
Отправлено 02 ноября 2010 - 15:24
protected function tearDown () { parent::tearDown(); }
Расскажите плз для в чём смысл в функции tearDown обращатся к parent::tearDown(); ?
Без этого обращения у меня не закрывается браузер после завершения теста.
P.S. Я второй день пробую работать на этой связке, так что если что не то говорите.
#6
Отправлено 02 ноября 2010 - 15:59
вот так я запускаю скрипт,
s1.php
<?php $output = shell_exec('phpunit c:\\www_pub\\suite.php'); echo "<pre>$output</pre>"; ?>
в командную строку через shell_exec передаю вот этот файл:
suite.php
<?php require_once './sel_s2.php'; class MySuite extends PHPUnit_Framework_TestSuite { public static function Suite() { return new MySuite('ext1'); } protected function SetUp() { print "\MySuite::setUp()"; } protected function tearDown() { print "\MySuite::tearDown()"; } } ?>
а вот файл непосредственно тестов:
sel_s2.php
<?php require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; class ext1 extends PHPUnit_Extensions_SeleniumTestCase { protected function setUp() { $this->setBrowser('*firefox3'); $this->setBrowserUrl('http://google.com/'); print "\next1::setUp()"; } public function test_1 () { $this->open('/'); print "\next1::test_1()"; } public function test_2 () { $this->open('/'); print "\next1::test_2()"; } protected function teardown() { print "\next1::teardown()"; } } ?>
вот это вывод в броузер:
(как-то коробит меня через NetBeans запускать - shift+F6 не не не... лучше так: http://localhost:8080/s1.php)
PHPUnit 3.5.3 by Sebastian Bergmann. \MySuite::setUp() ext1::setUp() ext1::test_1() ext1::teardown(). ext1::setUp() ext1::test_2() ext1::teardown().\MySuite::tearDown() Time: 21 seconds, Memory: 4.25Mb OK (2 tests, 0 assertions)
вот примерно так... Пока сам до конца не разобрался....
#7
Отправлено 02 ноября 2010 - 16:38
Если ваши тесты работают не минуту-две, а подольше, то вот в таком виде лучше не запускать. Лучше просто запускать из командной строки.Если коротко, то прочитав сегодня ваш пост с утра (сам где то 3 недели на NetBeans и PHPUnit сижу) попробовал чего-нибудь выгуглить. Нашёл на сайте http://www.phpunit.d...zing-tests.html и http://www.slideshar...selenium-156187 (начиная где-то со 110 салйда). Для использования suite у меня получилась такая конструкция:
вот так я запускаю скрипт,
s1.php<?php $output = shell_exec('phpunit c:\\www_pub\\suite.php'); echo "<pre>$output</pre>"; ?>
У веб-серверов зачастую есть ограничение на время загрузки страницы (где-то в районе минуты).
Но если все-таки надо сделать именно в таком виде, в котором статус выполнения отображается именно в окне браузера, то лучше отдельно сделать страницу, которая запустит тесты (причем вывод перенаправить в файл), а затем делает редирект на страницу, которая отображает содержимое файла, куда осуществляется вывод (с обновлением через каждые 10-15 секунд). Это всё настраивается заголовками страницы.
Но все-таки лучше остановиться на запуске тестов из командной строки. В этом случае проще прикручивать тот же Continuous Integration.
#8
Отправлено 02 ноября 2010 - 18:11
#9
Отправлено 03 ноября 2010 - 08:21
#10
Отправлено 03 ноября 2010 - 09:30
Заморачиваться точно не имеет смысла. Но если есть варианты, то можно и поработать над этим. Но при этом я бы все-таки сосредоточился на основном способе запуска тестов, который мог бы быть использован для выполнения всего набора тестов. Пока что для phpunit это лучше всего делается обычной командной строкой.А как на счет запуска из среды NetBeans? Стоит ли над етим заморачиватса?
#11
Отправлено 03 ноября 2010 - 09:41
Но все-таки лучше остановиться на запуске тестов из командной строки. В этом случае проще прикручивать тот же Continuous Integration.
Вот пришёл пациент на приём к доктору, говорит, у меня голова болит - дайте волшебную таблетку чтобы прошло. Аспирина например. А вы ему - голова болит потому что образ жизни у вас не правильный - курите пьёте, спать вовремя не ложитесь - соблюдайте режим, переселитесь за город, начните медитировать и голова болеть не будет.
Вот тоже самое с Continuous Integration.
#12
Отправлено 03 ноября 2010 - 10:24
называете свои файлы с тестами как *Test.php и складываете их в одну папку.
Потом вызываете из командной строки phpunit и указываете папку с файлами.
phpunit обходит эту папку и выполняет все файлы.
пример команды -
$output = shell_exec('phpunit c:\\www_pub\\tests\\');либо
меню старт - Выполнить - cmd - копируете туда что-то вроде phpunit path_to_dir и enter...
У меня в примере соответственно папка www_pub на диски C с вложенной папкой test в которой лежит файл - в аттаче.
Попробуйте.
Никакого NetBeanse. Хотя папки создавались и файлы писались именно в нём.
напишите, сработает или нет...
Прикрепленные файлы
#13
Отправлено 04 ноября 2010 - 07:31
protected function tearDown () { parent::tearDown(); }
Расскажите плз для в чём смысл в функции tearDown обращатся к parent::tearDown(); ?
Без этого обращения у меня не закрывается браузер после завершения теста.
P.S. Я второй день пробую работать на этой связке, так что если что не то говорите.
Немножко не так... Думал что родительская функция класса SeleniumTestCase имеет какое-то описания метода tearDown которое закрывает браузер. Оказывается нету. Почему это в определенный момент помогало закрывать браузер после завершения теста - непонятно. Здесь мне помог переход из версии Selenium RC 2 a6 на a7. В данном примере вызов этого метода не нужен.
#14
Отправлено 04 ноября 2010 - 07:57
Если коротко, то прочитав сегодня ваш пост с утра (сам где то 3 недели на NetBeans и PHPUnit сижу) попробовал чего-нибудь выгуглить. Нашёл на сайте http://www.phpunit.d...zing-tests.html и http://www.slideshar...selenium-156187 (начиная где-то со 110 салйда). Для использования suite у меня получилась такая конструкция:
Пожалуй так и буду делать. Единственное что запускать буду если не из NetBeans, то напрямую из командной строки.
На счет разобраться из PHPUnit я и не спорю. Собственно это и делая сейчас. ООП... По роду деятельности приходится каждый день разбиратся и усовершенствовать знания.Пока что ощущаю только лишь одно. Если вы выбрали связку php (phpunit) + SeleniumRC - вам придётся разобратся с phpunit. Или обновить свои знания о ООП и разобратся с phpunit. Иначе дальше "чижик пыжик" - вы не продвинетесь... Любая пробелма сложнее "залогинится - кликнуть - сверить - начать заново" - будет ставить в тупик, выходом из которого - разобратся с phpunit, или обновить воспоимнания о ООП и разобратся с phpunit. NetBeans тут вовсе не при чём.
#15
Отправлено 04 ноября 2010 - 08:23
Ну есть ещё одни простой способ организовать suite:
называете свои файлы с тестами как *Test.php и складываете их в одну папку.
Потом вызываете из командной строки phpunit и указываете папку с файлами.
phpunit обходит эту папку и выполняет все файлы.
Это в данном проекте не вариант... Здесь важна последовательность запуска тестов, поскольку все последующие тесты зависят от результатов выполнения предыдущих.
По структуре. Решил сделать класс из необходимыми конфигурационными действиями (залогинивание, и т.п.) и собственно класс из тестами. В одном классе тестов буду проверять один функционал. Все тесты из Selenium IDE пока-что идут в один класс теста (работа из клиентом). В каждом тесте вызываю нужные функции из конфигурационного класса. В последствии еще нужно будит проверить два или три функционала (репорты1, репорты2, пользователи, ...), которые пойдут в своем классе тестов, соответственно в отдельном файле. Ну и потом все файлы объединяю в тест-сюит с помощью класса PHPUnit_Framework_TestSuite. Вот как-то так...
Если где-то просчитался подсказывайте)
#16
Отправлено 04 ноября 2010 - 11:37
А вот этого лучше не допускать. Со временем может возникнуть проблема с разруливанием всех зависимостей. Либо тесты превратятся в бесформенное "спагетти", которое с каждым разом всё труднее будет поддерживать. Так что попробуйте все-таки делать независимые тесты.
Ну есть ещё одни простой способ организовать suite:
называете свои файлы с тестами как *Test.php и складываете их в одну папку.
Потом вызываете из командной строки phpunit и указываете папку с файлами.
phpunit обходит эту папку и выполняет все файлы.
Это в данном проекте не вариант... Здесь важна последовательность запуска тестов, поскольку все последующие тесты зависят от результатов выполнения предыдущих.
#17
Отправлено 04 ноября 2010 - 11:45
первый - функция залогинится -
втророй тест - зайти в меню.
третий (дата драйвен) - перебор данных
public function testlogin () {} public function testnavigatetomodule () { self::testlogin () ... } /** * @dataProvider provider */ public function testcase() { self::testnavigatetomodule () ... }
Более назвисимы тетсты сделать даже не знаю как.
До сих пор не разобрался с @depends...
#18
Отправлено 04 ноября 2010 - 15:25
Например, залогинивание - это скорее общий функционал, который имеет смысл реализовать отдельной функцией или методом. А уже в нужном тесте перед тем, как выполнять основные операции, вызывать эту функцию/метод. То же залогинивание нужно практически во всех тестах.
То есть в вашем примере это не сколько зависимость между тестами, а скорее вы просто смешиваете тесты и вспомогательный функционал воедино. А надо как раз разделять. Тогда многие вещи окажутся проще.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных