[arquillian-issues] [JBoss JIRA] (ARQ-1340) Drone webdriver is not created during @BeforeClass

Alex Okrushko (JIRA) jira-events at lists.jboss.org
Thu Mar 7 10:30:42 EST 2013


    [ https://issues.jboss.org/browse/ARQ-1340?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12759491#comment-12759491 ] 

Alex Okrushko commented on ARQ-1340:
------------------------------------

Lukáš Fryč, Karel Piwko, thanks guys for the quick response on the issue.

In regards with "anti-pattern", I had a similar discussion [here|http://stackoverflow.com/questions/12411431/pytest-how-to-skip-the-rest-of-tests-in-the-class-if-one-has-failed] when I was creating my test framework in Python. 

The main point is that WebDriver tests are not "Unit-Test-like", they are "Functional tests".

I got the framework running in the following pattern, which (ideally) I'm trying to use in Java:

- Each *Class* is a *Test Case*
- Each *@Test* is a *Test Step*
- *@BeforeClass* is the *Prerequisites*

with the following logic is in effect:
# All the "Test Steps" within a "Class" are executed @InSequence
# In Class if the "Test Step" *{color:red}Fails{color}* -> the other "test steps" are not run and are marked as *{color:gold}Skipped{color}* (since that would be a *false positive*)
# *Finalizer* object is launched in @AfterClass and executes the "cleanup" to get the web-app to the initial state:
#- If the "Test Step" modifies the "State" of the web-app, then it should "add" extra "cleanup" to the *Finalizer* (just in case if the next "Test Step" fails)

With those rules in mind here is the simple "Test Case": _"Username of the existing User can be changed"_.

the structure that I have in mind (and that was successfully implemented in Python):

{code:java}
Class TestUserNameCanBeChanged{
    
    @Drone
    WebDriver driver;
   
    @Page
    Login login;

    @Page
    Main main;

    @BeforeClass
    void setup(){
        //Prerequisites:
        //navigate to the login page
        driver.navigate().to(login.URL);

        //login
        login.login(Username, Password);
    
        //create user
        main.createUser(NewUserName);
 
        //add to remove the user at the end
        finalizer.add(main.deleteUser, NewUserName);
    }

    @Test
    @InSequence(1)
    void testChangeName(){
        //navigate to "edit" username
        main.user_profile.edit();

        //change the name
        main.user.username = "Edited User Name";
        
        //verify that the name was changed
        Assert.assertTrue(main.user.getName().equals("Edited User Name"));

        //remove cleanup function for NewUserName and replace it with cleanup for "Edited User Name"
        finalizer.remove(main.deleteUser, NewUserName);
        finalizer.add(main.deleteUser, "Edited User Name");
    }

    @Test
    @InSequence(2)
    void testSomeOtherTestRelatedToEditedName(){
        //verify some other places where the newly edited username appears
    }

    @AfterClass
    void cleanup(){
       //Get the web-app to the initial state (e.g. execute the chain of "cleanup" that Finalizer has collected and logout)
       finalizer.execute();

       main.logout();
    }
}
{code}

This is just a quick example that I got out of my head, hope you see the idea.

I might be wrong and Java has other implementation that are well-used/recognized in Selenium Web-Testing then I would appreciate if you can point me in the right direction :) 
                
> Drone webdriver is not created during @BeforeClass
> --------------------------------------------------
>
>                 Key: ARQ-1340
>                 URL: https://issues.jboss.org/browse/ARQ-1340
>             Project: Arquillian
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: Extension - Drone
>    Affects Versions: drone_1.1.1.Final
>         Environment: Arquillian JUnit Container 1.0.3.Final
> Arquillian Graphene Webdriver 2.0.0.Alpha3
> Arquillian Drone dependencies and Selenium dependencies 1.1.1.Final
> Arquillian Core dependencies 1.0.3.Final
> junit 4.8.1
> jdk 1.6
>            Reporter: Alex Okrushko
>            Assignee: Karel Piwko
>
> Drone webdriver is not created during @BeforeClass, however *is created during @Before or if called by GrapheneContext.getProxy()*
> The following does NOT work:
> {code:java} 
> @RunWith(Arquillian.class)
> public class TestDroneLogin {
> 	@Drone
> 	private static WebDriver driver;
> 	
> 	@BeforeClass
> 	public static void setup(){
> //GrapheneContext.getProxy().navigate().to("http://google.com");
> 		driver.navigate().to("http://google.com");
> 	}
> 	
> 	@Test
> 	public void testInput(){
> 		driver.findElement(By.cssSelector("input#gbqfq"));
> 	}
> }
> {code} 
> However, if I use {{GrapheneContext.getProxy()}} instead of {{driver}}, everything works as expected:
> {code:java} 
> @BeforeClass
> 	public static void setup(){
> 		GrapheneContext.getProxy().navigate().to("http://google.com");
> 	}
> {code}
> ALSO, if {{@Before}} is used then Drone webdriver is created as expected, so this problem is specific to {{@BeforeClass}}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira



More information about the arquillian-issues mailing list