Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Maven падает из-за падения одного теста в сюте

maven
Теги: #<Tag:0x00007f7b68c19608>

#1

Добрый день
Спасибо за помощь в борьбе моей с мавеном

Ситуация такая запускаю набор сютов в которых описаны тестовые классы вот
в помфайле

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <suiteXmlFiles>
            <suiteXmlFile> src/test/resources/suite_for_test_dev.xml</suiteXmlFile>
        </suiteXmlFiles>
    </configuration>
</plugin>

сам сьюит

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="SuiteforDev">
    <suite-files>
        <suite-file path="prod_service_019_smoke_test_other_functions.xml"/>
        <suite-file path="prod_service_test_for_devide_test.xml"/>


    </suite-files>
</suite>

дальше смотрим хмл файл

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="SuiteMainFunction">

    <parameter name="path" value="/"/>

    <test name="Test">
        <classes>

            <class name="SMOKE_TEST_BY_STEP.SM_03_Delete_All_new"/>
            <class name="SMOKE_TEST_BY_STEP.SM_05_Login"/>
            <class name="SMOKE_TEST_BY_STEP.SM_06_Tab_Log_Set_Row_Number"/>
            <class name="SMOKE_TEST_BY_STEP.SM_07_Location_Add"/>
            <class name="SMOKE_TEST_BY_STEP.SM_08_Gateway_Add"/>
            <class name="SMOKE_TEST_BY_STEP.SM_09_SIM_Bank_Add"/>
            <class name="SMOKE_TEST_BY_STEP.SM_10_Carriers_Add"/>
            <class name="SMOKE_TEST_BY_STEP.SM_11_Tariffs_Add_New"/>
            <class name="SMOKE_TEST_BY_STEP.SM_20_Add_Options_Tariffs"/>
            <class name="SMOKE_TEST_BY_STEP.SM_24_ADD_Schedule"/>
            <class name="SMOKE_TEST_BY_STEP.SM_21_Tariffs_Limit_Add_new"/>
            <class name="SMOKE_TEST_BY_STEP.SM_13_Color_Add"/>
            <class name="SMOKE_TEST_BY_STEP.SM_22_Tab_SIM_View_new"/>
            <class name="SMOKE_TEST_BY_STEP.SM_23_Tab_Channel_View_new"/>
            <class name="SMOKE_TEST_BY_STEP.SM_16_Tab_SIM_Set_Color"/>
            <class name="SMOKE_TEST_BY_STEP.SM_17_Tab_Channel_Set_Color"/>
            <class name="SMOKE_TEST_BY_STEP.SM_18_SIM_Options_Set_Pin_And_Get_ScreenShot"/>
            <class name="Test_SIM_Panel.Test_Sim_Call"/>


        </classes>
    </test>
    <!-- Test -->
</suite> <!-- Suite -->

так вот если упал 1 класс из этого сюта мавен падает и выдает ошибку к примеру

RunSuite(SMOKE_TEST_BY_STEP.SM_16_Tab_SIM_Set_Color)  Time elapsed: 110.225 sec  <<< FAILURE!
org.openqa.selenium.remote.SessionNotFoundException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: '2.43.0', revision: 'accb3003b9fb8f7cae30f9669b4c594a065396a6', time: '2014-09-09 22:22:51'

Driver info: driver.version: RemoteWebDriver
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
        at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:66)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572)
        at org.openqa.selenium.remote.RemoteWebDriver$RemoteWebDriverOptions$RemoteWindow.maximize(RemoteWebDriver.java:829)
        at logic.init.Initialize.RunSuite(Initialize.java:34)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
        at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:517)
        at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
        at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:140)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:296)
        at org.testng.SuiteRunner.run(SuiteRunner.java:259)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1195)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1124)
        at org.testng.TestNG.run(TestNG.java:1032)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:295)
        at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:84)
        at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:90)
        at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

это ж не нормально ??? останавливать все тесты из=за падения 1 теста
как с этим бороться и или это у меня что-то не настроено ??


#2

Читайте ошибку. Похоже, есть попытка переиспользовать закрытый браузер, т.е. дело в логике самого фреймворка. Падает при инициализации очередного тестового класса (например, в конструкторе или при инициализации полей). Ошибка ведь идет из logic.init.Initialize.RunSuite(Initialize.java:34).

Дело не в настройках плагина точно. Наоборот, есть запрос на добавление такой фичи в Maven, и он не закрыт.


#3

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

@AfterSuite
    public void stopSuite() {
        app.stop();
    }
реализация стоп метода 
public void stop() {
        if (driver != null) {
            driver.quit();
        }

(Sergey Korol) #4

Как объявляете и инициализируете драйвер?


#5

вот сначала

@BeforeSuite
public void RunSuite() throws InterruptedException {
    app.getWebDriver().manage().window().maximize();
}

@BeforeClass
public void RunClass() throws InterruptedException {
    app.getNavigator().openMainPage();
}

есть такой метод

public WebDriver getWebDriver() {
   return driver;

}

сам драйвер получаем отсюда
driver = Util_WebDriver_Factory.getInstance(gridHubUrl, browser, username, password);


(Sergey Korol) #6

По этим кускам совершенно не видна общая картина. Код фабрики и app?


(Ok Tober) #7

А это где прописано?

может нужно в getWebDriver() возвращать new?


#8

вот место где мы возвращаем драйвер

if (CHROME.equals(browser)) {

    System.setProperty(webdriverpath, path);

    webDriver = new ChromeDriver();

а арр это у нас объект класса апликейшен во тсам класс

public class Application {
    protected WebDriver driver;
    private Util_Navigation navigator;
    private String baseUrl;
String username;

    public Application() {

        baseUrl = Util_Property_Loader.loadProperty("site.url");


        String gridHubUrl = Util_Property_Loader.loadProperty("grid2.hub");

        Util_Browser browser = new Util_Browser();

        browser.setName(Util_Property_Loader.loadProperty("browser.name"));


        browser.setVersion(Util_Property_Loader.loadProperty("browser.version"));
        browser.setPlatform(Util_Property_Loader.loadProperty("browser.platform"));

      username = Util_Property_Loader.loadProperty("user.username");
        String password = Util_Property_Loader.loadProperty("user.password");



        driver = Util_WebDriver_Factory.getInstance(gridHubUrl, browser, username, password);

        navigator = new Util_Navigation(this);
    }

    public  String getUserName(){
        return  username;

    }

    public Util_Navigation getNavigator() {
        return navigator;
    }

    public void stop() {
        if (driver != null) {
            driver.quit();
        }


    }

    public WebDriver getWebDriver() {

      // return new FirefoxDriver();
       return driver;

    }

    public String getBaseUrl() {
        return baseUrl;
    }
}

(Sergey Korol) #9
if (CHROME.equals(browser)) {
    webDriver = new ChromeDriver();
public Application() {
    driver = Util_WebDriver_Factory.getInstance(gridHubUrl, browser, username, password);

Ничего вас тут не смущает? Мне лично не совсем понятно, что у вас там в getInstance происходит. Может все же покажите код целиком, или будем продолжать собирать пазл?


#10

Думаю проблема в статиках

public class Util_WebDriver_Factory {
    /* Browsers constants */
    public static final String CHROME = "chrome";
    public static final String FIREFOX = "firefox";
    public static final String SAFARI = "safari";
    public static final String OPERA = "opera";
    public static final String IE = "ie";
    public static final String HtmlUnit = "htmlunit";
    public static final String IPHONE = "iphone";

    /* Platform constants */
    public static final String WINDOWS = "windows";
    public static final String ANDROID = "android";
    public static final String XP = "xp";
    public static final String VISTA = "vista";
    public static final String MAC = "mac";
    public static final String LINUX = "linux";
    // windows
   // public static String path = "property\\drivers\\chromedriver.exe";
    public static String path ="D:\\GoAntiFraudMavenProject\\src\\main\\java\\property\\drivers\\chromedriver.exe";

    /* Chrome driver path */
    // linux
    //public static String path = "/home/ooo/Documents/developmnet_workspace/Idea_my_projects/gofraud-tests/property/drivers/chromedriver";
    public static String webdriverpath = "webdriver.chrome.driver";
    /* IE driver path */
    public static String pathIE = "property\\drivers.ie\\";

    /* Opera driver path WINDOWS */
    //public static String pathOpera = "\\Idea_my_projects\\gofraud-tests\\property\\drivers.chrome\\operadriver-v1.1.jar";
    //public static String webdriverpathOpera = "webdriver.opera.driver";
    public static String webdriverpathIE = "webdriver.ie.driver";
    private static  WebDriver webDriver = null;
 public static WebDriver   getInstance(String gridHubUrl, Util_Browser browser, String username, String password) {
        WebDriver webDriver = null;

        DesiredCapabilities capability = new DesiredCapabilities();


        String browserName = browser.getName();

        //String browserName="firefox";
        capability.setJavascriptEnabled(true);

        // In case there is no Hub
        if (gridHubUrl == null || gridHubUrl.length() == 0) {
            return getInstance(browserName, username, password);
        }
        if (CHROME.equals(browserName)) {
            capability = DesiredCapabilities.chrome();
        } else if (FIREFOX.equals(browserName)) {

            capability = DesiredCapabilities.firefox();
            FirefoxProfile ffProfile = new FirefoxProfile();}
else{
capability = DesiredCapabilities.htmlUnit();
            // HTMLunit Check
            //if (username != null && password != null)	{	webDriver = (HtmlUnitDriver) HtmlUnitDriver_Authenticated.create(username, password);	}
            //else {	webDriver = new HtmlUnitDriver(true);	}
            return webDriver;
        }

        capability = setVersionAndPlatform(capability, browser.getVersion(), browser.getPlatform());

        // Create Remote WebDriver
        try {
            webDriver = new RemoteWebDriver(new URL(gridHubUrl), capability);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return webDriver;
    }

    public static  WebDriver getInstance(String browser, String username, String password) {
        if (webDriver != null) {
            return webDriver;
        }
        if (CHROME.equals(browser)) {

            System.setProperty(webdriverpath, path);

            webDriver = new ChromeDriver();
        } else if (FIREFOX.equals(browser)) {

            FirefoxProfile ffProfile = new FirefoxProfile();
            // Authenication Hack for Firefox

            if (username != null && password != null) {
                ffProfile.setPreference("network.http.phishy-userpass-length", 255);
            }

            webDriver = new FirefoxDriver();
 } else if (IE.equals(browser)) {
            System.setProperty(webdriverpathIE, pathIE);
            webDriver = new InternetExplorerDriver();

        } else if (OPERA.equals(browser)) {
            webDriver = new OperaDriver();
        } else if (SAFARI.equals(browser)) {
            webDriver = new SafariDriver();
        } else if (IPHONE.equals(browser)) {
            try {	/* webDriver = new IPhoneDriver();	*/ } catch (Exception e) {
                e.printStackTrace();
            }

        } else if (ANDROID.equals(browser)) {	/* webDriver = new AndroidDriver();	*/ } else {
            // HTMLunit Check
            //if (username != null && password != null) {	webDriver = (HtmlUnitDriver) HtmlUnitDriver_Authenticated.create(username, password);	}
            //else {	webDriver = new HtmlUnitDriver(true);	}
        }
        return webDriver;
    }

#11

В общем я понял почему падает сьюит но это не решает общей проблемы вот как я писал

@AfterSuite
public void stopSuite() {
    app.stop();
}
 где 
public void stop() {
    if (driver != null) {

        driver.quit();
    }

а так как в профиле задано

<suiteXmlFiles>
    <suiteXmlFile> src/test/resources/suite_for_test_dev.xml</suiteXmlFile>
</suiteXmlFiles>

где

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="SuiteforDev">
    <suite-files>
        <suite-file path="prod_service_test_for_devide_test.xml"/>
        <suite-file path="prod_service_019_smoke_test_other_functions.xml"/>

    </suite-files>
</suite>

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


(Sergey Korol) #12

Вообщем, я бы рекомендовал вам заняться рефакторингом вашей фабрики. У вас полная каша с instance / local переменными. Посмотрите на готовые реализации, либо поищите на форуме похожие темы, коих было достаточно много.


#13

Да спасибо что сказали думаю нужно пересмотреть но не могли бы высказать что именно вам не нравится в реализации тем более эта реализация взята с гитхаба тем кто делал это фреймворк
собственно покопался в коде погуглиг оказалось это код господина Баранцева


(Sergey Korol) #14

Я видел код фабрики господина Баранцева, и уж поверьте, она выглядит немного иначе. :wink:

По делу:

private static  WebDriver webDriver = null;

public static WebDriver getInstance(String gridHubUrl, Util_Browser browser, String username, String password) {
        WebDriver webDriver = null;

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


#15

Не очень хочу спорит с спецами которые имеют опыт поболее меня в этой сфере вот сылка на гитхаб баранцева введите описание ссылки

вот фабрика в фрейморке которым я пользуюсь

public class Util_WebDriver_Factory {
    /* Browsers constants */
    public static final String CHROME = "chrome";
    public static final String FIREFOX = "firefox";
    public static final String SAFARI = "safari";
    public static final String OPERA = "opera";
    public static final String IE = "ie";
    public static final String HtmlUnit = "htmlunit";
    public static final String IPHONE = "iphone";

    /* Platform constants */
    public static final String WINDOWS = "windows";
    public static final String ANDROID = "android";
    public static final String XP = "xp";
    public static final String VISTA = "vista";
    public static final String MAC = "mac";
    public static final String LINUX = "linux";
    // windows
   // public static String path = "property\\drivers\\chromedriver.exe";
    public static String path ="D:\\GoAntiFraudMavenProject\\src\\main\\java\\property\\drivers\\chromedriver.exe";

    /* Chrome driver path */
    // linux
    //public static String path = "/home/ooo/Documents/developmnet_workspace/Idea_my_projects/gofraud-tests/property/drivers/chromedriver";
    public static String webdriverpath = "webdriver.chrome.driver";
    /* IE driver path */
    public static String pathIE = "property\\drivers.ie\\";

    /* Opera driver path WINDOWS */
    //public static String pathOpera = "\\Idea_my_projects\\gofraud-tests\\property\\drivers.chrome\\operadriver-v1.1.jar";
    //public static String webdriverpathOpera = "webdriver.opera.driver";
    public static String webdriverpathIE = "webdriver.ie.driver";
    private static  WebDriver webDriver = null;

    public static WebDriver   getInstance(String gridHubUrl, Util_Browser browser, String username, String password) {
        WebDriver webDriver = null;

        DesiredCapabilities capability = new DesiredCapabilities();


        String browserName = browser.getName();

        //String browserName="firefox";
        capability.setJavascriptEnabled(true);

        // In case there is no Hub
        if (gridHubUrl == null || gridHubUrl.length() == 0) {
            return getInstance(browserName, username, password);
        }
        if (CHROME.equals(browserName)) {
            capability = DesiredCapabilities.chrome();
        } else if (FIREFOX.equals(browserName)) {

            capability = DesiredCapabilities.firefox();
            FirefoxProfile ffProfile = new FirefoxProfile();
           // Authenication Hack for Firefox
           if (username != null && password != null) {
               ffProfile.setPreference("network.http.phishy-userpass-length", 255);
                capability.setCapability(FirefoxDriver.PROFILE, ffProfile);
            }
            capability.setCapability(CapabilityType.TAKES_SCREENSHOT, true);

        //    WebDriver driver1 = new FirefoxDriver();
         //   webDriver=driver1;
        //    return webDriver;

        } else if (IE.equals(browserName)) {
            capability = DesiredCapabilities.internetExplorer();
            capability.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
        } else if (SAFARI.equals(browserName)) {
            capability = DesiredCapabilities.safari();
        } else if (OPERA.equals(browserName)) {
            capability = DesiredCapabilities.opera();
        } else if (ANDROID.equals(browserName)) {
            capability = DesiredCapabilities.android();
        } else if (IPHONE.equals(browserName)) {
            capability = DesiredCapabilities.iphone();
        } else {
                        capability = DesiredCapabilities.htmlUnit();
            // HTMLunit Check
            //if (username != null && password != null)	{	webDriver = (HtmlUnitDriver) HtmlUnitDriver_Authenticated.create(username, password);	}
            //else {	webDriver = new HtmlUnitDriver(true);	}
            return webDriver;
        }

        capability = setVersionAndPlatform(capability, browser.getVersion(), browser.getPlatform());

        // Create Remote WebDriver
        try {
            webDriver = new RemoteWebDriver(new URL(gridHubUrl), capability);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return webDriver;
    }

    public static  WebDriver getInstance(String browser, String username, String password) {
        if (webDriver != null) {
            return webDriver;
        }
        if (CHROME.equals(browser)) {

            System.setProperty(webdriverpath, path);

            webDriver = new ChromeDriver();
        } else if (FIREFOX.equals(browser)) {

            FirefoxProfile ffProfile = new FirefoxProfile();
            // Authenication Hack for Firefox

            if (username != null && password != null) {
                ffProfile.setPreference("network.http.phishy-userpass-length", 255);
            }

            webDriver = new FirefoxDriver();

            // WebDriver driver2=  new FirefoxDriver();
            //      return driver2;


        } else if (IE.equals(browser)) {
            System.setProperty(webdriverpathIE, pathIE);
            webDriver = new InternetExplorerDriver();

        } else if (OPERA.equals(browser)) {
            webDriver = new OperaDriver();
        } else if (SAFARI.equals(browser)) {
            webDriver = new SafariDriver();
        } else if (IPHONE.equals(browser)) {
            try {	/* webDriver = new IPhoneDriver();	*/ } catch (Exception e) {
                e.printStackTrace();
            }

        } else if (ANDROID.equals(browser)) {	/* webDriver = new AndroidDriver();	*/ } else {
            // HTMLunit Check
            //if (username != null && password != null) {	webDriver = (HtmlUnitDriver) HtmlUnitDriver_Authenticated.create(username, password);	}
            //else {	webDriver = new HtmlUnitDriver(true);	}
        }
        return webDriver;
    }

    private static DesiredCapabilities setVersionAndPlatform(DesiredCapabilities capability, String version, String platform) {
        if (MAC.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.MAC);
        } else if (LINUX.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.LINUX);
        } else if (XP.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.XP);
        } else if (VISTA.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.VISTA);
        } else if (WINDOWS.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.WINDOWS);
        } else if (ANDROID.equalsIgnoreCase(platform)) {
            capability.setPlatform(Platform.ANDROID);
        } else {
            capability.setPlatform(Platform.ANY);
        }
        if (version != null) {
            capability.setVersion(version);
        }
        return capability;
    }
}

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


#16

окей более чем согласен что отличаются я даже и не спорил


(Sergey Korol) #17

Да, давайте поищем отличия в официальной фабрике и той, которая подписана, как selenium-java-training-barancev (к слову, созданную в марте 2013). Вам не приходило в голову, что во время тренингов обычно создаются драфт варианты с нуля, чтобы просто показать общую концепцию? Такие варианты могут быть не закончены, не причесаны, не заточены под суровую реальность… :wink: Ну и дата собственно говорит за себя.