Ne TestNG garantir @BeforeSuite méthodes sont exécutées avant @BeforeTest méthodes?

CONTEXTE: Mon but est de coder un TestNG-Sélénium système qui exécute autonome
(pas de cordes à maven ou ant plugins; il suffit de java). Il doit permettre des cas de test à accepter
y compris les paramètres du navigateur et de l'url de domaine. Lorsque le Lanceur de instancie
ces cas de test, le navigateur et le domaine sont utilisés pour obtenir une Sélénium objet pour effectuer
c'est le test.

PROBLÈME: une Seule classe de test par suite des progrès dans le domaine de paramètre (dans un
@BeforeSuite méthode) avant de tenter d'obtenir une Sélénium objet (dans un @BeforeTest).
Les classes de test qui ne reçoivent pas le domaine ont une valeur null sélénium objet b/c il ne peut pas
être instancié.

CODE: Le XmlClasses sont chacune à leur propre XmlTest et tous les trois
sont dans un seul XmlSuite. La suite contient les dans l'ordre de TestClass1,
TestClass2, puis TestClass3. Les classes de test eux-mêmes sont des sous-classes de 2 couches de
les classes de base abstraites qui inclut des fonctionnalités pour initialiser les variables et injecté
par la suite obtenir une instance de Sélénium. Le but est de tester un ou plusieurs
applications (dans plusieurs domaines) avec un peu de code à répétition que possible (c'est à dire: le Sélénium
l'instanciation est à la racine de la classe de base, car il est commun à tous les tests). Consultez les modes
ci-dessous pour plus de détails.

//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...
}
}

De SORTIE: TestCase3 s'exécute correctement. TestCase1 et TestCase2 échoue. Trace de la pile est généré...

 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)

J'apprécie toute information que vous pourriez avoir à ce sujet.

OriginalL'auteur Aaron | 2010-08-04