t.me/atinfo_chat Telegram группа по автоматизации тестирования

Selenide Gradle TestNG и лишние незакрытые инстансы драйвера

Теги: #<Tag:0x00007f9b025707c0>

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="SomeTests" parallel="classes" thread-count="3">
    <test name="Tests">
        <classes>
            <class name="SomeOneTest"/>
            <class name="SomeTwoTest"/>
            <class name="ApiTest"/>
        </classes>
    </test>
</suite>

build.gradle

plugins {
    id "java"
    id "com.github.ben-manes.versions" version "0.11.3"
}

group 'com.tests'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    agent
}

ext {
     aspectjVersion="1.8.6"
     allureVersion="1.4.16"
}


dependencies {
    compile "org.testng:testng:6.9.6"
    compile "org.seleniumhq.selenium:selenium-server:2.47.1"
    compile "com.codeborne:selenide:2.21"
    compile "ru.yandex.qatools.allure:allure-report-data:${allureVersion}"
    compile "ru.yandex.qatools.allure:allure-testng-adaptor:${allureVersion}"
    compile "com.jayway.restassured:rest-assured:2.4.1"
    compile "com.google.code.gson:gson:2.3.1"
    compile "com.typesafe:config:1.3.0"
    agent   "org.aspectj:aspectjweaver:${aspectjVersion}"
}

test.doFirst {
    jvmArgs "-javaagent:${configurations.agent.singleFile}"
}

test {
    useTestNG() {
        suiteXmlFiles << new File(rootDir, "testng.xml")

        systemProperties = [
                browser: System.getProperty('browser', 'firefox'),
        ]
    }
}

Три тестовых класса

import com.jayway.restassured.RestAssured;
import org.testng.annotations.Test;

public class ApiTest {

    @Test
    public void apiTest1() {
        RestAssured
                .get("http://google.com")
                .then()
                .statusCode(200);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void apiTest2() {
        RestAssured
                .get("http://google.com")
                .then()
                .statusCode(200);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

второй

import com.codeborne.selenide.Selenide;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import ru.yandex.qatools.allure.annotations.Description;
import ru.yandex.qatools.allure.annotations.Title;

import static com.codeborne.selenide.Selenide.$;

public class SomeOneTest {

    @Test
    @Title("Test 1 Class 1")
    @Description("Description to test 1")
    public void test1() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("honda").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    @Title("Test 2 Class 1")
    @Description("Description to test 1")
    public void test2() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("toyota").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

третий

import com.codeborne.selenide.Selenide;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import ru.yandex.qatools.allure.annotations.Description;
import ru.yandex.qatools.allure.annotations.Title;

import static com.codeborne.selenide.Selenide.$;

public class SomeTwoTest {

    @Test
    @Title("Test 1 Class 2")
    @Description("Description to test 1")
    public void test1() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("nissan").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    @Title("Test 2 Class 2")
    @Description("Description to test 1")
    public void test2() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("subaru").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Вот ссылкана архив с проектом который четко воспроизводит проблему - https://www.dropbox.com/s/mdjop59z0pihtr3/mps-tests.zip?dl=0

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

Все совету и соображения по поводу приветствуются

Удалось методом тыка локализовать проблему - если отключить алур - то проблема пропадает

@vania_pooh @asolntsev не хотите взглянуть?

Ух ты, это интересно. Это полезная информация, поможет. Взгляну обязательно!

У меня нормально запускается и все заканчивается корректно, инстансов браузера не остается, что я делаю не так? :slight_smile:

Запускаешь из IDE?
Консоль и clean test - удивишься )))

Как раз из консоли

предельно странно :frowning:
Давайте тыкать пальцем в воздух - какая версия грейдла у вас установлена?

------------------------------------------------------------
Gradle 2.6
------------------------------------------------------------

Build time:   2015-08-10 13:15:06 UTC
Build number: none
Revision:     233bbf8e47c82f72cb898b3e0a96b85d0aad166e

Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Linux 3.16.0-45-generic amd64

Уф, разобрался. В версии Selenide 2.20 было сделано такое изменение, что вебдрайверы теперь закрываются в отдельных потоках, чтобы побороть такую проблему, когда операция закрытия вебдрайвера зависает и подвешивает весь тест. Эти потоки - демоны, поэтому при остановке JVM они убиваются сразу и могут не успеть завершить свою работу.

Думаю, это можно исправить в selenide 2.22

Откатился до 2.19, проблема в создание лишних драйверов отпала только для Firefox, Chrome же при запуске штамповал себя в таком количестве что у меня в док столько окон не влазило :frowning:

Хм, значит, проблема в чём-то ещё. А если оставить selenide 2.19 и отключить Allure?

Отключение Allure убирает все проблемы и на 2.21
Но мне конечно сейчас выпиливать весь алюр из проекта, будет очень весело :slight_smile:

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

Мне кажется, что проблему надо искать на уровне testng. Вы подключаете самую последнюю версию, selenide также ее использует. Но вот allure-testng-adaptor подключает версию 6.8. Я не знаю, как gradle резолвит конфликт версий, но исходя из того, что при отключении allure проблема пропадает, я бы рекомендовал начать именно отсюда. Можете попробовать пересобрать адаптер с последней версией.

Я зарелизил Selenide 2.22, там проблема с открытыми браузерами должна быть решена. Попробуй?