在JUnit Test Class中设计依赖项

时间:2013-12-06 21:04:36

标签: java testing junit dependency-injection selenium-webdriver

我是Junit的新手并且测试框架一般,这是我的问题。

我有以下代码:

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();
    }
}

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;
    }
}

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;
    }
}

正如你在WebsiteTestClass中看到的,我正在硬编码当前的登录用户名和密码,而baseURL对于我的测试来说非常合适。但是如果我想“以编程方式”设置一个测试环境(可能针对不同的程序员使用不同的登录名,密码,不同的baseurl,例如:“http://Bob.dev.website.com”),那么我希望能够创建一个实例WebsiteTestCase具有不同的登录凭据属性,带有构造函数。

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

而不是

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

我在上面的代码中理解我没有将Login的实例传递给junit.run,那么我将如何在这种情况下设计代码来完成这些事情呢?

1 个答案:

答案 0 :(得分:2)

您可以在项目中拥有属性文件,例如webdriver-test-dev.properties并拥有登录凭据&其中定义的URL。您可以在测试期间加载该属性文件并注入属性。

环境可以像-Denv = dev一样作为命令行参数传递,并且使用此值可以考虑文件名来选择正确的属性文件,如果是webdriver-<env>.properties这样的预定义格式。

另外,对于测试用例,最好使用一个常见的测试登录,而不是让每个程序员使用他或她自己的登录。