2017-10-11 3 views
0

laufen lasse Ich versuche, meine automatisierten Tests (Selenium webdriver) unter Verwendung von testng parallel zu laufen. dies ist der Knoten, bei mir läuft:wie ich meine selen Testmethoden parallel unter Verwendung von testg

java -Dwebdriver.gecko.driver=chromedriver.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=2 -maxSession 2 

dies ist mein Test-Klasse:

public class TestParallel { 

Login login; 

//@BeforeMethod(alwaysRun = true) 
public SeleniumDriverCore testSetup() throws FileNotFoundException, IOException{ 
    SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig"); 
    Properties config = new Properties(); 
    config.load(new FileInputStream("config/testConfig")); 
    this.login = new Login(driver); 
    driver.browser.open("https://test.test.xyz"); 

    driver.browser.maximize(); 
    driver.waits.waitForPageToLoad(); 
    return driver; 
} 

@Test(groups={"parallel"}) 
public void test_one() throws FileNotFoundException, IOException{ 
    SeleniumDriverCore driver=testSetup(); 
    login.navigateToPage(Pages.LOGIN); 
    login.assertion.verifyLoginPopupAndTitleDisplayed(); 
    testCleanup(driver); 
} 

@Test(groups={"parallel"}) 
public void test_two() throws FileNotFoundException, IOException{ 
    SeleniumDriverCore driver=testSetup(); 
    login.navigateToPage(Pages.LOGIN); 
    login.assertion.verifyLoginPopupAndTitleDisplayed(); 
    testCleanup(driver); 
} 

@Test(groups={"parallel"}) 
public void test_three() throws FileNotFoundException, IOException{ 
    SeleniumDriverCore driver=testSetup(); 
    login.navigateToPage(Pages.LOGIN); 
    login.assertion.verifyLoginPopupAndTitleDisplayed(); 
    testCleanup(driver); 
} 

@Test(groups={"parallel"}) 
public void test_four() throws FileNotFoundException, IOException{ 
    SeleniumDriverCore driver=testSetup(); 
    login.navigateToPage(Pages.LOGIN); 
    login.assertion.verifyLoginPopupAndTitleDisplayed(); 
    testCleanup(driver); 
} 


public void testCleanup(SeleniumDriverCore driver){ 
    driver.close(); 
    driver.quit(); 
} 

}

und hier ist mein xml:

<suite name="Ontega - All Tests Mobile" parallel="methods" thread-count="2"> 
    <test name="Ontega - All Tests Mobile"> 
     <groups> 
      <run> 
       <include name="parallel"/> 
       <exclude name="open-defects"/> 
      </run> 
     </groups> 
     <packages> 
      <package name="tests.*"/> 
     </packages> 
    </test> 
</suite> 

wenn ich laufe das XML, ich erwarte, dass meine Tests auf zwei Browsern in zwei Threads gleichzeitig ausgeführt werden, wenn ich das XML ausführe, bekomme ich zwei Browser inst Wenn Sie zum ersten Mal laufen und dann inkrementiert werden und 50% der Tests fehlschlagen, sehen Sie, dass ich versuche, den Treiber in jeder meiner Methoden zu instanziieren, obwohl mein Framework nicht funktioniert, aber ich versuche es um den Engpass dieses Problems zu erreichen. Jede Hilfe wäre sehr willkommen Vielen Dank im Voraus

+1

Sie erstellen zwei Fahrer pro Testmethodenaufruf, auch müssen Sie einfach anrufen Beenden Sie, wenn Sie abreißen –

+0

Ich habe meinen Code behoben, Das Problem ist jetzt, dass Chrome-Seiten eine leere Seite öffnen und das war's. –

Antwort

2

Hier sind einige Möglichkeiten, dies in TestNG zu tun. Sie verwalten im Grunde Ihre Webdriver Instanziierung und Bereinigung über eine @BeforeMethod und eine @AfterMethod Config-Methoden. Dann müssten Sie entscheiden, wie Sie die erstellte Webdriver-Instanz mit Ihrer @Test-Methode teilen möchten. Dafür haben Sie drei Möglichkeiten:

  1. Sie Verwendung einer ThreadLocal Variante machen, weil TestNG garantiert Ihnen, dass es @BeforeMethod ausgeführt wird, @Test und @AfterMethod alle im selben Thread.

Hier ist ein Beispiel, das Sie diese in Aktion zeigt

import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import org.testng.ITestResult; 
import org.testng.Reporter; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

public class TestClassSampleUsingThreadLocal { 
    private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>(); 

    @BeforeMethod 
    public void instantiateBrowser(ITestResult testResult) { 
     RemoteWebDriver driver = new ChromeDriver(); 
     drivers.set(driver); 
    } 

    @Test(dataProvider = "dp") 
    public void testMethod(String url) { 
     Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true); 
     driver().get(url); 
     Reporter.log("Page Title :" + driver().getTitle(), true); 
    } 

    @DataProvider(name = "dp", parallel = true) 
    public Object[][] getData() { 
     return new Object[][]{ 
       {"http://www.google.com"}, {"http://www.stackoverflow.com"}, {"http://facebook.com"} 
     }; 
    } 

    @AfterMethod 
    public void cleanupBrowser() { 
     RemoteWebDriver driver = driver(); 
     driver.quit(); 
    } 

    private RemoteWebDriver driver() { 
     RemoteWebDriver driver = drivers.get(); 
     if (driver == null) { 
      throw new IllegalStateException("Driver should have not been null."); 
     } 
     return driver; 
    } 

} 
  1. Sie können über das ITestResult Objekt die WebDriver Instanz teilen. Hier ist ein Beispiel, das das in Aktion zeigt.
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import org.testng.ITestResult; 
import org.testng.Reporter; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

public class TestClassSample { 
    private static final String WEBDRIVER = "driver"; 

    @BeforeMethod 
    public void instantiateBrowser(ITestResult testResult) { 
     RemoteWebDriver driver = new ChromeDriver(); 
     testResult.setAttribute(WEBDRIVER, driver); 
    } 

    @Test(dataProvider = "dp") 
    public void testMethod(String url) { 
     Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true); 
     driver().get(url); 
     Reporter.log("Page Title :" + driver().getTitle(), true); 
    } 

    @DataProvider(name = "dp", parallel = true) 
    public Object[][] getData() { 
     return new Object[][]{ 
       {"http://www.google.com"}, 
       {"http://www.stackoverflow.com"}, 
       {"http://facebook.com"} 
     }; 
    } 

    @AfterMethod 
    public void cleanupBrowser(ITestResult testResult) { 
     RemoteWebDriver driver = driver(testResult); 
     driver.quit(); 
    } 

    private RemoteWebDriver driver() { 
     return driver(Reporter.getCurrentTestResult()); 
    } 

    private RemoteWebDriver driver(ITestResult testResult) { 
     if (testResult == null) { 
      throw new IllegalStateException("testResult should have not been null."); 
     } 
     Object driverObject = testResult.getAttribute(WEBDRIVER); 
     if (driverObject == null) { 
      throw new IllegalStateException("Driver should have not been null."); 
     } 
     if (!(driverObject instanceof RemoteWebDriver)) { 
      throw new IllegalStateException("Driver is not a valid webdriver object"); 
     } 
     return (RemoteWebDriver) driverObject; 
    } 
} 
  1. Sie die WebDriver Instanziierung extrahieren und Bereinigung in einen TestNG Hörer (eine, die eine org.testng.IInvokedMethodListener implementiert, die die WebDriver in die ITestResult erstellt setzt (wie in 2 Option gezeigt zusammen mit Code-Schnipsel in meinem blog post) oder in ein ThreadLocal (wie in Option 1). Sie können weitere Informationen zu dieser Option finden.
+0

vielen Dank für Ihre Antwort! –

0

Es scheint, Sie erstellen mehrere Treiber pro Test. Ich denke, Sie müssen einen Teil des Codes außerhalb testSetup halten() -Methode

SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig"); 
Properties config = new Properties(); 
config.load(new FileInputStream("config/testConfig")) 

ich einen Teil meiner Code teilen bin, die ich für das parallele Testen verwende, kann sein, dass in Ihrem Fall helfen enter image description here

Mein xml enter image description here

+0

Vielen Dank für Ihren Kommentar @Shoaib, das Problem mit dem Ausführen des Tests in parallelen Methoden, und erklären den Treiber außerhalb der Testmethoden, ist, dass der Treiber Instanzstatus während der Testausführung überschrieben werden kann –

Verwandte Themen