Does TestNG Garantie @BeforeSuite Methoden werden vor @BeforeTest Methoden ausgeführt?

StackOverflow https://stackoverflow.com/questions/3407514

  •  25-09-2019
  •  | 
  •  

Frage

HINTERGRUND: Mein Ziel ist es, Code ein TestNG-Selen-System, das läuft in sich geschlossenes (No strings Maven oder Ant-Plugins, nur Java). Es muss erlauben, Testfälle zu akzeptieren Parameter einschließlich dem Browser und die Domain-URL. Wenn die Testrunner instanziiert Diese Testfälle werden der Browser und Domain verwendet, um ein Selen-Objekt zu erhalten auszuführen es testen.

PROBLEM: Nur eine Testklasse pro Suite gelingt es, die Domain-Parameter erhalten (in einem @BeforeSuite Verfahren), bevor Sie ein Selen-Objekt (in einer @BeforeTest zu bekommen). Die Testklassen, die die Domäne nicht über ein Null-Selen-Objekt b empfangen / c es kippt instanziiert werden.

CODE: Die XmlClasses sind jeweils in ihrem eigenen XMLTest enthalten und alle drei in einem einzigen XmlSuite ist. Die Suite enthält die in der Reihenfolge der TestClass1, TestClass2, dann TestClass3. Die Testklassen selbst sind Subklassen von 2 Schichten abstrakte Basisklassen, die Funktionalität injiziert Variablen zu initialisieren, enthält und anschließend eine Instanz von Selen bekommen. Der Zweck dafür ist, zu Test ein oder mehr Anwendungen (auf mehreren Domänen) mit so wenig wie möglich wiederholt Code (dh: Selenium Instanziierung ist in der Wurzel Basisklasse, weil es zu allen Tests üblich ist). Siehe die Methoden unten.

// Top-most custom base class
abstract public class WebAppTestBase extends SeleneseTestBase
{
        private static Logger logger = Logger.getLogger(WebAppTestBase.class);
        protected static Selenium selenium = null;
        protected String domain = null;
        protected String browser = null;

        @BeforeTest(alwaysRun = true)
        @Parameters({ "selenium.browser" })
        public void setupTest(String browser)
        {
                this.browser = browser;
                logger.debug(this.getClass().getName()
                                + " acquiring Selenium instance ('" + this.browser + " : " + domain + "').");
                selenium = new DefaultSelenium("localhost", 4444, browser, domain);
                selenium.start();
        }

}

// Second level base class.
public abstract class App1TestBase extends WebAppTestBase
{

        @BeforeSuite(alwaysRun = true)
        @Parameters({"app1.domain" })
        public void setupSelenium(String domain)
        {
                // This should execute for each test case prior to instantiating any Selenium objects in @BeforeTest
                logger.debug(this.getClass().getName() + " starting selenium on domain '" + domain+ "'.");
                this.domain = domain;
        }
}

// Leaf level test class
public class TestClass1 extends App1TestBase
{
        @Test
        public void validateFunctionality() throws Exception
        {
                // Code for tests go here...
        }
}

// Leaf level test class
public class TestClass2 extends App1TestBase
{
        @Test
        public void validateFunctionality() throws Exception
        {
                selenium.isElementPresent( ...
                // Rest of code for tests go here...
                // ....
        }
}


// Leaf level test class
public class TestClass3 extends App1TestBase
{
        @Test
        public void validateFunctionality() throws Exception
        {
                // Code for tests go here...
        }
}

OUTPUT: TestCase3 richtig läuft. TestCase1 und TestCase2 ausfällt. Stack-Trace wird ...

erzeugt
 10:08:23 [DEBUG RunTestCommand.java:63] - Running Tests.
 10:08:23 [Parser] Running:
  Command line suite
  Command line suite

[DEBUG App1TestBase.java:49] - TestClass3 starting selenium on domain 'http://localhost:8080'.
 10:08:24 [DEBUG WebAppTestBase.java:46] - TestClass2 acquiring Selenium instance ('*firefox : null').
 10:08:24 [ERROR SeleniumCoreCommand.java:40] - Exception running 'isElementPresent 'command on session null
 10:08:24 java.lang.NullPointerException: sessionId should not be null; has this session been started yet?
        at org.openqa.selenium.server.FrameGroupCommandQueueSet.getQueueSet(FrameGroupCommandQueueSet.java:216)
        at org.openqa.selenium.server.commands.SeleniumCoreCommand.execute(SeleniumCoreCommand.java:34)
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.doCommand(SeleniumDriverResourceHandler.java:562)
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.handleCommandRequest(SeleniumDriverResourceHandler.java:370)
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.handle(SeleniumDriverResourceHandler.java:129)
        at org.openqa.jetty.http.HttpContext.handle(HttpContext.java:1530)
        at org.openqa.jetty.http.HttpContext.handle(HttpContext.java:1482)
        at org.openqa.jetty.http.HttpServer.service(HttpServer.java:909)
        at org.openqa.jetty.http.HttpConnection.service(HttpConnection.java:820)
        at org.openqa.jetty.http.HttpConnection.handleNext(HttpConnection.java:986)
        at org.openqa.jetty.http.HttpConnection.handle(HttpConnection.java:837)
        at org.openqa.jetty.http.SocketListener.handleConnection(SocketListener.java:245)
        at org.openqa.jetty.util.ThreadedServer.handle(ThreadedServer.java:357)
        at org.openqa.jetty.util.ThreadPool$PoolThread.run(ThreadPool.java:534)

Ich schätze Informationen, die Sie zu diesem Thema haben.

War es hilfreich?

Lösung

Ich denke, das Problem ist, dass Ihr @BeforeSuite Methode einen Wert zu einem Feld zuweisen, aber Sie haben drei verschiedene Instanzen, so dass die anderen beiden nicht initialisiert erhalten.

Beachten Sie, dass @BeforeSuite nur einmal ausgeführt wird, unabhängig davon, welche Klasse es gehört. Als solches @ Vorher / AfterSuite Methoden sind in der Regel auf Klassen definiert, die außerhalb der gesamte Testumgebung sind. Diese Verfahren sollten wirklich statisch sein, aber ich beschlossen, diese Anforderung nicht zu erzwingen, weil es manchmal unpraktisch ist.

ich glaube, ein besserer Weg, um Ihr Problem zu nähern, ist als injizierten Ressource in Ihrer Domain Feld zu sehen, dass jeder Ihres Tests von Guice oder anderer Dependency Injection-Framework erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top