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

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

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

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

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

<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 теста
как с этим бороться и или это у меня что-то не настроено ??

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

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

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

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

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

вот сначала

@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);

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

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

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

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

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;
    }
}
if (CHROME.equals(browser)) {
    webDriver = new ChromeDriver();
public Application() {
    driver = Util_WebDriver_Factory.getInstance(gridHubUrl, browser, username, password);

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

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

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;
    }

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

@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>

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

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

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

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

По делу:

private static  WebDriver webDriver = null;

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

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

1 Симпатия

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

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

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;
    }
}

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

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

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

1 Симпатия