Перейти к содержимому

Фотография

Запуск в jenkins и отмена перезапуска браузера при каждом тесте

jenkins testng java

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 26 июня 2014 - 15:39

Приветствую.

 

Тесты запускаются последовательно с перезапуском браузера каждый раз. Запуск браузера через jenkins на удаленной машине делается ну очень долго, минуты две наверно точно.

 

Исходные данные: webdriver + java + pageobject + testng + ant + jenkins + удаленная тачка с jenkins и браузером вместе.

 

Вот так выглядит TestNGTestBase:

@BeforeSuite
    public void initDriver() throws IOException
    {
        driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox());
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        WebDriverRunner.setWebDriver(driver); // Передаем selenide свой драйвер. иначе selenide будет запускать свой браузер при вызове его методов
    }

@AfterMethod(alwaysRun = true)
    public void takeScreenshotOnError(ITestResult result) throws ParseException {
        if (! result.isSuccess()) {
            //КОД СНЯТИЯ СКРИНШОТА
        }
    }

    @AfterSuite (alwaysRun = true)
    public void stopBrowser() {
        WebDriverFactory.dismissDriver();
    }

Xml файл теста выглядит так:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" [ <!ENTITY lt "&#60;"> <!ENTITY gt "&#62;"> <!ENTITY quot "&#34;"> <!ENTITY amp "&#38;">]>
<suite name="ALLtest" parallel="false" thread-count="2">

    <test verbose="2" name="Авторизация" annotations="JDK">
        <parameter name= "email" value="iuz@aaa.ru"></parameter>
        <parameter name= "pass" value="123456"></parameter>
        <classes>
            <class name="Test.LoginPrTest"/>
        </classes>
    </test>

    <test verbose="2" name="Регистрация" annotations="JDK">
        <parameter name= "name" value="name"></parameter>
        <parameter name= "surname" value="sername"></parameter>
        <parameter name= "email" value="aaa@werw.ru"></parameter>
        <parameter name= "pass" value="123456"></parameter>
        <classes>
            <class name="Test.RegistrationUserTest"/>
        </classes>
    </test>

</suite>

Тесты вот так написаны:

public class LoginPrTest extends TestNGTestBase
{
    @Parameters({"email", "pass"})
    @Test(groups = "Selenium2")
    public void registrationUser(String email, String pass)
    {
        driver.get(loadprops("urlopen"));
        LoginPage loginPr = new LoginPage(driver);

        /* успешная  авторизация пользователя */
        loginPr.loginSuccess(email, pass); // глубже находятся шаги выполнения
    }
}

Файл Page вот так:

public class LoginPage
{
    private WebDriver driver;

    public LoginPage(WebDriver driver)
    {
        PageFactory.initElements(driver, this);
        this.driver = driver;
    }

    /* Успешная авторизация */
    public VacancyListPage loginSuccess(String email, String pass)
    {
        LoginUtils object = PageFactory.initElements(driver, LoginUtils.class); // инициализация
        object.login(email, pass); // проваливаемся глубже
        return new VacancyListPage(driver);
    }

}

Найти кто гасит браузер не получилось. Хоть и выставлял prinln. Грешу на WebDriverFactory:

  static {
    Runtime.getRuntime().addShutdownHook(new Thread() {

      public void run() {
        dismissDriver();
      }
    });
  }

Что можно сделать чтобы браузер стартовал быстрее на удаленной машине (ресурсов у нее много)? Jenkins виноват? Testng?

 

Как сделать чтобы можно было стартовать тесты не перезапуская браузер? Буду признателен если тыкните в файл и строчку, потому что сам уже много перепробовал. Хотя полгода назад я сделал так чтобы браузер не закрывался, а теперь ступор какой-то и не пойму как мне это сделать.

 


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 27 июня 2014 - 06:48

Что можно сделать чтобы браузер стартовал быстрее на удаленной машине (ресурсов у нее много)? Jenkins виноват? Testng?

 

поставьте другую версию Jenkins

 

Как сделать чтобы можно было стартовать тесты не перезапуская браузер?

 

http://selenium2.ru/...verfactory.html


  • 0

#3 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 27 июня 2014 - 08:34

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

 

Да видел эту ссылку. Танцы с бубном не помогли. Ну ладно, буду пробовать сам разбираться.


  • 0

#4 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 27 июня 2014 - 09:39

Я вижу здесь две проблемы:
1. браузер долго стартует
2. браузер часто перезапускается

1. Если браузер на удалённой машине стартует медленно, причина может быть не только в браузере, но ещё и в том, что на удалённую машину передаётся большой профиль.

Можно также попробовать использовать другой браузер -- Chrome или IE стартуют заметно быстрее, чем Firefox.

2. Если браузер постоянно перезапускается, значит кто-то его постоянно останавливает. Надо его найти и попросить так не делать :)

Как найти?

1) указать в конфиг-файле <suite verbose="3" , тогда будет трасса, которая показывает когда что запускается -- фикстуры, тестовые методы, может быть с ней удастся сопоставить и понять, кто закрывает браузер.
2) в среде разработки поставить точку останова на вызов метода WebDriver.quit(), а когда точка останова сработает -- изучать, откуда произошёл вызов.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#5 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 27 июня 2014 - 10:26

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

 

Подключил библиотеку WebDriverFactory. Но лучше не стало. Указал так:

DesiredCapabilities firefox = DesiredCapabilities.firefox();

    @BeforeSuite
    public void initDriver() throws IOException
    {
        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("plugin.state.java", 2);
        System.setProperty("webdriver.firefox.bin", "/usr/bin/firefox");  // нужно для jenkins

        WebDriverFactory.dismissAll();

        WebDriverFactory.setMode(WebDriverFactoryMode.SINGLETON);

        firefox.setCapability(FirefoxDriver.PROFILE, profile);
        driver = WebDriverFactory.getDriver(firefox);
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        WebDriverRunner.setWebDriver(driver); // передаем selenide свой драйвер. иначе selenide будет запускать свой браузер при вызове его методов
    }

Аннотацию @After вообще убрал.

 

Запускаю xml, см выше его. Но тесты запускаются опять одновременно. Первый тест проваливается с java.lang.NullPointerException на строчку driver.get(loadprops("urlopen")); первого теста. Второй тест отрабатывает.

Если ставлю аннотацию не @BeforeSuite , а @BeforeMethod, тогда тесты запускаются последовательно, но с перезапуском браузера.

 

<suite verbose="3" - выставил <test verbose="4". Ну да увидел трасу.

[TestRunner] Running the tests in 'Авторизация' with parallel mode:false
[RunInfo] Adding method selector: org.testng.internal.XmlMethodSelector@1a85542 priority: 10
[TestClass] Creating TestClass for [ClassImpl class=Test.LoginPrTest]
[TestClass] Adding method LoginPrTest.loginUser(java.lang.String, java.lang.String)[pri:0, instance:null] on TestClass class Test.LoginPrTest
[XmlMethodSelector] Including method config.initDriver()
[XmlMethodSelector] Including method Test.loginUser()
[TestRunner] Running the tests in 'Регистрация' with parallel mode:false
[RunInfo] Adding method selector: org.testng.internal.XmlMethodSelector@1db1314 priority: 10
[TestClass] Creating TestClass for [ClassImpl class=Test.RegistrationUserTest]
[TestClass] Adding method RegistrationUserTest.registrationUser(java.lang.String, java.lang.String, java.lang.String, java.lang.String)[pri:0, instance:null] on TestClass class Test.RegistrationUserTest
[XmlMethodSelector] Including method config.initDriver()
[XmlMethodSelector] Including method Test.registrationUser()
[TestNG] Running:
  XmlFiles/All_tests.xml

[Invoker 4388430] Invoking @BeforeSuite TestNGTestBase.initDriver()[pri:0, instance:Test.RegistrationUserTest@1b5c5b3]

[SuiteRunner] Created 2 TestRunners
[TestRunner] Running test Авторизация on 1  classes,  included groups:[] excluded groups:[]
===== Test class
Test.LoginPrTest
    @Test LoginPrTest.loginUser(java.lang.String, java.lang.String)[pri:0, instance:Test.LoginPrTest@dae665]
======
java.lang.NullPointerException
	at Test.LoginPrTest.loginUser(LoginPrTest.java:24)

===== Invoked methods
    RegistrationUserTest.registrationUser(java.lang.String, java.lang.String, java.lang.String, java.lang.String)[pri:0, instance:Test.RegistrationUserTest@1b5c5b3]name sername aaa@werw.ru 123456  28689843
=====
PASSED: registrationUser("name", "sername", "aaa@werw.ru", "123456")

Видно, что первый тест не стартует вообще, а стартует последний в списке.


  • 0

#6 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 27 июня 2014 - 11:37

Хм, все оказалось проще, чем думалось. Нужно в каждый тесты было вставить:

 

driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox());

 

И тесты начали выполняться без перезапуска браузера.


  • 0

#7 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 27 июня 2014 - 14:51

Я могу (предположительно) объяснить, откуда в логе появляется NullPointerException -- скорее всего поле driver не объявлено static. Поэтому оно, конечно, инициализируется в @BeforeSuite, но когда создаётся новый экземпляр тестового класса -- в нём поле оказывается не проинициализированным. Поэтому добавление вызова driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox()); в каждый метод решило проблему. Однако лучше было бы сделать @BeforeMethod с этим кодом, результат должен быть такой же.

Но это всё равно не объясняет, почему браузер останавливался...
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#8 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 27 июня 2014 - 20:37

И правда про static что-т не подумал тут. В понедельник попробую.

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

 

А вот по поводу jenkins. После того как сделал без перезапуска ничего не поменялось. Буду подключаться к удаленной машине через vncviewer и смотреть что же там делается.

В настройках jenkins или build.xml никаких нет настроет для убыстрения?


  • 0

#9 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 28 июня 2014 - 15:45

А вот по поводу jenkins. После того как сделал без перезапуска ничего не поменялось. Буду подключаться к удаленной машине через vncviewer и смотреть что же там делается.
В настройках jenkins или build.xml никаких нет настроет для убыстрения?

 
Нет, никаких специальных настроек для ускорения нет. Попробуйте просто вручную запустить на той же самой целевой машине файрфокс -- посмотрите, быстро ли запускается. После того, как браузер запущен при помощи webdriver, можно не останавливать его, зайти на машину по VNC и посмотреть логи браузера, может быть там будет видно, на что он тратил время при запуске.


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#10 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 11 июля 2014 - 13:48

Дело было в портах


  • 0

#11 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 14 июля 2014 - 08:40

Дело было в портах

Расскажите подробнее -- в чём именно была проблема, как удалось диагностировать и что нужно было исправить, чтобы всё заработало.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#12 BoBuS

BoBuS

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • Город:Москва


Отправлено 17 июля 2014 - 07:47

На серваке были закрыты порты на внешку. Из-за этого при загрузке страницы ждали пока НЕ догрузятся сторонние скрипты (счетчики и т.д.) из-за этого были дикие тормоза :)

Диагностика заключалась в том, что я подконектился по vncviewer к машине, открыл браузер, перешел на страницу и увидел долгую загрузку. Ну тут мне стало понятно. Попросил админа открыть внешку и все заработало.


  • 0

#13 asolntsev

asolntsev

    Новый участник

  • Members
  • Pip
  • 64 сообщений
  • ФИО:Андрей Солнцев
  • Город:Таллинн

Отправлено 03 декабря 2014 - 20:57

Привет!

Тема давно закрыта, но я только сейчас на неё наткнулся.

 

Я правильно понимаю, что вы в проекте используете библиотеку Selenide? Но при этом в вашем коде я нигде не вижу её вызовов. Зачем тогда?

 

Заодно спрошу: зачем вы сами открываете/закрываете браузер, зачем делаете скриншоты - если Selenide всё это делает автоматически из коробки? Тогда бы и мучаться не пришлось со всеми этими фабриками и NullPointerException'ами.


  • 0



Темы с аналогичным тегами jenkins, testng, java

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных