반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


Selenium WebDriver 와 TestNG 를 같이 사용하는 방법을 정리하겠습니다. 그리고 xml을 이용해서 parallel 하게 같은 테스트를 여러 브라우저에서 같이 테스트 하는 방법도 알아보구요.


우선 실제 Test를 하는 클래스부터 봅니다.


public class WebDriverTest extends SelTestCase {
    @Test
    public void testWiki() {
        driver.get("http://www.wikipedia.org/");
        driver.findElement(By.id("searchInput")).sendKeys("Selenium Software");
        driver.findElement(By.name("go")).click();
        driver.findElement(By.cssSelector(".mw-search-results li:nth-of-type(1) a")).click();
        Assert.assertTrue(
                driver.findElement(
                        By.cssSelector("img[src='//upload.wikimedia.org/wikipedia/en/5/5c/Seleniumlogo.png']")).
                        isDisplayed());
        Reporter.log("My test Passed");
    }
}


이 WebDriverTest는 SelTestCase를 extends 했습니다. 이 SelTestCase는 나중에 보고 이 소스부터 분석하겠습니다.

@Test 는 annotation 인데요. jUnit 이랑 똑같습니다. 그런데 여기서는 TestNG를 사용할 거니까 TestNG를 import 해야 합니다.


import org.testng.annotations.Test;


다음은 testWiki()라는 테스트 메소드를 만듭니다.

여기서는 wikipedia.org 페이지를 열고 id 가 searchInput 인 element를 찾아서 거기에 Selenium Software 를 입력합니다. 아마 이 element는 textfield나 textarea 일 겁니다.

그 다음엔 name 이 go 인 엘리먼트를 click 합니다.

그 다음엔 cssSelector를 사용하는데요. class 가 mw-search-results 인것을 찾고 그 안에 li 인 것 중에 가장 첫번째 li에 있는 a 링크를 찾아서 그 링크를 클릭합니다.

그 다음에 테스트 문이 들어가는데요. 링크를 클릭해서 나온 페이지에 해당 이미지가 있으면 테스트가 Success 될 것이고 이 이미지가 없으면 fail 될 겁니다.

그 다음에는 TestNG에서 자동으로 생성해 주는 Report 에 log가 찍히도록 해 줍니다.


그런데 여기서 driver라는 객체가 있는데 이 객체를 선언해 주는 부분이 없습니다.

이 driver 객체는 상속받은 SelTestCase 클래스에서 선언해 주었을 겁니다.


public class SelTestCase {
    WebDriver driver;
   
    @BeforeMethod()
    @Parameters("browser")
    public void launchBrowser(String browser) {
        String path = System.getProperty("user.dir"); // current path of project

        if(browser.equalsIgnoreCase("FF")){
            driver = new FirefoxDriver();
        }else if(browser.equalsIgnoreCase("Chrome")){
            System.setProperty("webdriver.chrome.driver",path + "\\chromedrive\\chromedriver.exe");
            driver = new ChromeDriver();
        }else if (browser.equalsIgnoreCase("IE")) {
            System.setProperty("webdriver.ie.driver",path + "\\iedrive\\IEDriverServer.exe");
            driver = new InternetExplorerDriver();
        }
    }
   
    @AfterMethod
    public void closeBrowser() {
        driver.close();
        driver.quit();
    }
}

이 SelTestCase 클래스에서는 맨 먼저 WebDriver 를 초기화 시킵니다. 여기서 초기화 


그 다음에 @BeforeMethod() annotation이 있는데요. 이것은 테스트 메소드가 실행되기 전에 실행하라는 의미 입니다.

그러니까 WebDriverTest 클래스에 있는 testWiki() 라는 테스트 메소드가 시작되기 전에 이 메소드가 시작 됩니다.


그 다음에 있는 annotation은 파라미터로서 browser를 받겠다는 건데요. 이 파라미터는 다음에 볼 xml 파일에서 던져 줄 겁니다.


해당 메소드를 보면은요. launchBrowser() 라는 메소드인데요 스트링을 input 파라미터로 받습니다.

그 안을 보면 path라는 스트링에 이 프로젝트의 현재 위치를 대입합니다.


그리고 if 문이 나오는데요. input 파라미터가 FF 이면 FirefoxDriver() 를 driver 객체에 대입하고 Chrome인 경우는 ChromeDriver()를 그리고 IE인 경우에는 인터넷 익스플로러 드라이버를 drive 객체에 대입합니다.


그러니까 저 위에 있는 WebDriverTest 클래스의 testWiki() 테스트 메소드가 시작되기 전에 조건에 맞게 driver 객체를 세팅한 후 그 테스트 메소드가 실행될 겁니다.


다음에 나오는 건 @AfterMethod 가 있는 걸로 봐서 저 testWiki() 테스트 메소드가 실행되고 난 다음에 실행되는 메소드 입니다.

이름이 closeBrower() 이고 그 안에는 브라우저를 close하고 메모리로부터 driver 객체를 완전히 없애는 quit을 해주는 메소드 입니다.


이 두 클래스에서는 TestNG와 Selenium WebDriver를 같이 사용하고 있습니다.


여기에서 이 한개의 테스트를 여러 웹 브라우저에서 테스트할 수 있도록 하는 작업을 하겠습니다.

그러면 해당 프로젝트에 xml 파일을 만들어야 합니다.


testng.xml 이라는 파일을 아래와 같이 만듭니다.


<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Widipedia Test" verbose="3" parallel="methods">
    <test name="Wiki in FF">
    <parameter name="browser" value="FF"></parameter>
        <classes>
            <class name="WebDriverTest"/>
        </classes>
    </test>
   
    <test name="Wiki in Chrome">
    <parameter name="browser" value="Chrome"></parameter>
        <classes>
            <class name="WebDriverTest"/>
        </classes>
    </test>
    <!--
    <test name="Wiki in IE">
    <parameter name="browser" value="IE"></parameter>
        <classes>
            <class name="WebDriverTest"/>
        </classes>
    </test>   
     -->
</suite>

<suite> 태그를 써서 여러 테스트를 한개의 suite에 담겠다는 것을 알립니다.

그리고 <test> 태그 안에 각각의 테스트들을 정의 합니다.

첫번째는 <parameter> 태그안에 name 이 browser이고 value 는 FF 를 설정합니다.

이 것이 SelTestCase 클래스에 있는 launchBrowser()메소드에 전달될 파라미터 입니다.

그 다음에 <classes> 태그 안에는 name 에  WebDriverTest 를 넣습니다.

이 클래스를 run 하라는 겁니다.


그 다음에는 Chrome 과 IE 에 대한 <test> 태그들을 같은 방식으로 만듭니다.


여기서 IE는 주석처리를 했습니다.

제가 해 보니까 에러가 나더라구요.

혹시 이 IE는 왜 에러가 나는지 아시는 분은 좀 알려 주세요.


이 test suite를 실행하려면 Run-run configurations 를 선택합니다.




여기서 보시다시피 프로젝트를 선택하고 Suite를 선택한 다음에 아까 만들었던 xml 을 세팅합니다.


그러면 이 xml에서 정의된 대로 테스트가 여러 브라우저에서 실행될 겁니다.



반응형

Comment

  1. 즐거운 주말이 되세요.