简体   繁体   中英

Design dependencies in JUnit Test Class

I am new to Junit and testing frameworks in general, here is my question.

I have the following code:

public class Login extends WebsiteTestCase
{   
    @Test
    public void testChromeLogin()
    {
        setDriver( getChromeDriver() );
        login( getDriver() );
    }

    public void login( WebDriver driver )
    {
        driver.get( getBaseURL() );

        WebElement username = driver.findElement( By.name("login_username") );
        WebElement password = driver.findElement( By.name("login_password") );
        WebElement submit = driver.findElement( By.cssSelector( "form#login input" ) ); 

        username.sendKeys( getUsername() );
        password.sendKeys( getPassword() );
        submit.submit();

        assertEquals( "Website HomePage", driver.getTitle() );
    }

    @After
    public void tearDown() throws Exception
    {
        getDriver().quit();
    }
}

and

public class WebsiteTestCase extends StockholmTestCase
{
    public String username = "login", password_login = "password";
    private String baseURL = "http://website.com";

    public String getUsername()
    {
        return this.username;
    }

    public String getPassword()
    {
        return this.password_login;
    }

    public String getBaseURL()
    {
        return this.baseURL;
    }
}

and

public class StockholmTestCase extends TestCase
{
    private WebDriver driver;

    public WebDriver getChromeDriver()
    {
        return new RemoteWebDriver( DesiredCapabilities.chrome() );
    }

    public WebDriver getFireFoxDriver()
    {
        return new RemoteWebDriver( DesiredCapabilities.firefox() );
    }

    public WebDriver getDriver()
    {
        return this.driver;
    }

    public void setDriver( WebDriver driver )
    {
        this.driver = driver;
    }
}

As you can see in the WebsiteTestClass, I am hard-coding the current login username and password, and baseURL which works perfectly fine for my tests. But if I want to "programatically" set an environment for testing (perhaps for different programmers different login, password, different baseurl, ex: " http://Bob.dev.website.com "), then instead, I would like to be able to create an instance of WebsiteTestCase with different properties for login credentials, with a constructor.

like

public class Stockholm
{
    public static void main( String args[] )
    {
        JUnitCore junit = new JUnitCore();
        Result result = junit.run( new Login( /* credentials here, settings */ ) );
    }
}

as opposed to

public class Stockholm
{
    public static void main( String args[] )
    {
        JUnitCore junit = new JUnitCore();
        Result result = junit.run( Login.class );
    }
}

I understand in the above code that I am not passing an instance of Login to junit.run, so how would I design code to accomplish those things in this context?

You can have property file in the project, like webdriver-test-dev.properties and have the login credentials & URL defined in it. You can load that property file and inject properties during the test.

Environment can be passed as command line argument like -Denv=dev and using this value the right property file can be picked considering the file name if of a predefined format like webdriver-<env>.properties .

Also on a related not, for a test case it is better to use one common test login instead of having each programmer use his or her own login.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM