셀레늄IDE는 레코딩된 html 테스트케이스를 자바 코드로 변환해주는 놀라운 기능을 제공합니다.

그러나 이렇게 자동으로 만들어진 JUnit3 기반 테스트케이스 코드는 약간 아쉬운 점이 있습니다.

  • 테스트케이스 실행전 먼저 셀레늄 RC 서버를 별도로 띄워놓아야 한다.
  • 셀레늄IDE에서 제공하는 clickAndWait와 같은 xxxAndWait 류의 커맨드에 해당하는 메소드가 없다.
  • JUnit 4 나온지가 언젠데 아직도 JUnit 3 이냐. -.-
  • 하나의 테스트메소드 실행시마다 브라우저 열기/닫기를 반복하기 때문에 테스트 수행시간이 오래걸린다. (테스트케이스의 setUp과 tearDown에 브라우저를 띄우고 종료하는 코드가 있음)

다행히 누가 시킨것도 아닌데 이런 아쉬움을 극복하는 방법을 정리해서 올리신 분들이 계십니다.

먼저 http://ajesse.wordpress.com/category/selenium 사이트.

위 사이트에는 셀레늄RC서버 자동시작/종료, clickAndWait류의 메소드제공, JUnit4기반코드, 테스트케이스 단위로 브라우저를 열고닫는 등 모든 해법이 설명되어 있습니다.

테스트스위트에서는 셀레늄RC서버를 관리합니다.

  1. import org.junit.AfterClass;
    import org.junit.BeforeClass;

  2. public abstract class SeleniumTestSuite {

  3.     @BeforeClass
        public static void setUpBeforeClass() throws Exception {
            SeleniumServerControl.getInstance().startSeleniumServer();
        }

  4.     @AfterClass
        public static void tearDownAfterClass() throws Exception {
            SeleniumServerControl.getInstance().stopSeleniumServer();
        }
    }

 

공통 테스트케이스 클래스는 브라우저를 콘트롤하는 기능과 xxxAndWait 유틸리티 메소드를 제공합니다.

  1. import org.junit.AfterClass;
    import org.junit.BeforeClass;

  2. import com.thoughtworks.selenium.DefaultSelenium;
    import com.thoughtworks.selenium.Selenium;

  3. public abstract class SeleniumTestCase {

  4.     public static final String BROWSER = "*iexploreproxy";

  5.     public static final int SELENIUM_SERVER_PORT = 4444;

  6.     public static final String PAGE_LOAD_TIMEOUT = "3000";

  7.     public static final String START_URL = http://myserver.com:xxxx;

  8.     protected static Selenium seleniumStatic;

  9.     protected Selenium browser = null;

  10.     public SeleniumTestCase() {
            this.browser = seleniumStatic;
        }

  11.     @BeforeClass
        public static void setUpBeforeClass() throws Exception {
            seleniumStatic = new DefaultSelenium("localhost", SELENIUM_SERVER_PORT, BROWSER, START_URL);
            seleniumStatic.start();
        }

  12.     @AfterClass
        public static void tearDownAfterClass() throws Exception {
            seleniumStatic.stop();
        }

  13.     public void submitAndWait(String formLocator) {
            browser.submit(formLocator);
            browser.waitForPageToLoad(PAGE_LOAD_TIMEOUT);
        }

  14.     public void clickAndWait(String elementLocator) {
            browser.click(elementLocator);
            browser.waitForPageToLoad(PAGE_LOAD_TIMEOUT);
        }

  15.     public void openAndWait(String url) {
            browser.open(url);
            browser.waitForPageToLoad(PAGE_LOAD_TIMEOUT);
        }

추가로 JUnit4 사용환경에서 테스트 실패시 자동으로 화면을 캡쳐하는 방법에 대한 힌트가 http://rockhoppertech.com/blogs/archives/45 여기에 언급되어 있습니다. JUnit4에 org.junit.runner.notification.RunListener 클래스가 있네요.

 

ps. 이 글을 정리하면서 Simplium 이라는 것을 발견했습니다. Simple test framework for Selenium의 약자이군요. 사이트에 소개된 코드를 대략 보니 일단 맘에 듭니다. 시간나면 Simplium을 좀더 테스트해봐야겠습니다.

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

입문자로써 셀레늄을 처음 접했을 때, 셀레늄은 뭐랄까 사람을 좀 헷갈리게 만드는 것같습니다.

셀레늄 다운로드 사이트에 나열된 Selenium Core, Selenium RC, Selenium IDE, Selenium Grid 등등을 보면서 뭐부터 다운받아야하는지 고민이 됩니다. 저는 다행히 이 단계는 지났습니다. ^^;

또하나 아리까리한 것이 있습니다. html로 테스트할지, java 코드로 테스트할지.

셀레늄 IDE는 테스트케이스를 HTML로도 만들어주고 Java 코드로도 만들어줄 수 있습니다. 그래서 어떤 포맷으로 테스트케이스를 만들지 또 고민해야합니다.

좀 고민하다가 HTML기반 테스트케이스와 Java(JUnit) 기반 테스트케이스를 간단히(정말 간단히) 비교해봤습니다.


HTML 기반 테스트

  • 일반 사용자가 이해하기가 쉽다.
  • 약간의 교육으로 테스트케이스를 쉽게 작성할 수 있다.
  • 컴파일이 필요없다.
  • 특별한 툴없이 HTML을 직접 수정할 수 있다. 그러나 셀레늄IDE를 통해 편집하는게 편하다.
  • 조건에 따라 명령어를 동적으로 수행하는 등의 프로그램적 요소가 부족하다.
  • FireFox를 지원하지 않는 웹사이트의 경우 테스트케이스 작성이 어렵다.(셀레늄IDE는 firefox만 지원)
  • selenese Ant 타스크를 통해 자동으로 테스트스위트를 실행할 수 있다.

 

자바(JUnit) 기반 테스트

  • 이클립스와 같은 개발도구의 기능을 충분히 이용할 수 있다.
  • 조건에 따라 동적으로 테스트 흐름을 조작할 수 있다.
  • 공통적인 부분을 뽑아내기가 좋다.
  • 컴파일이 필요하다.
  • 이클립스에서 바로 실행가능하다. 초록막대.
    셀레늄IDE가 생성해주는 자바코드의 품질이 떨어진다.
  • 셀레늄IDE가 생성해준 자바코드는 JUnit 3.x 기반이다.
  • verify나 assert 실패시 자동으로 화면을 캡쳐하는 등 기능을 추가할 수 있다.
  • 테스트 메소드 하나씩 실행시마다 브라우저 open/ close를 반복하므로 상대적으로 느릴 수 있다.(개선방법 있음)
  • junit Ant 타스크를 통해 자동으로 실행할 수 있다.

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

셀레늄에서 자바스크립트 alert 상자가 떴는지 판단하는 명령어에는 verifyAlert, verifyAlertPresent, assertAlert, assertAlertPresent 등이 있습니다.

셀레늄은 이들 명령어를 통해 alert 상자가 뜬 것을 확인하고(실제로 뜨지는 않습니다) 자동으로 확인버튼을 눌러줍니다.

셀레늄 IDE에서 명령어(command) 항목에는 assertAlert 를,  타겟(target) 항목에는 "저장하였습니다."를 입력하면, 실제로 "저장하였습니다." alert 상자가 뜰 경우에 테스트가 성공하게 됩니다.

b.jpg 

그런데 제가 테스트하는 화면에서는 alert의 메시지가 중요하지 않아서 단순히 alert가 발생했는지 여부만 알고 싶을 때가 있습니다. 그래서 assertAlert 명령어 대신 assertAlertPresent 명령어를 사용해봤는데, 아래처럼 에러가 납니다. verifyAlertPresent 명령도 마찬가지였습니다.

[error] Error: There was an unexpected Alert! [저장하였습니다.]

뭐가 잘못된 건지 구글신께 물어봐도 잘 안가르쳐 주네요... -.-;

이리저리 삽질하다가 assertAlert 명령에서 메시지 지정할 때 * 패턴을 사용할 수 있다는 사실을 알아냈습니다. 그래서 찾아낸 방법은 아래 그림처럼 assertAlert 명령의 target 값으로 * 를 쓰는 것입니다. 잘 작동합니다. ^^

a.jpg 

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

셀레늄에는 assert 뿐만 아니라 이와 유사한 verify 명령어가 있습니다.

 

  • verify : 중간에 실패해도 나머지 테스트는 계속 수행된다. 마지막에 실패가 표시된다.
  • assert : 중간에 실패하면 테스트는 즉시 중단된다.

 

verify는 실패하더라도 그 다음 테스트명령 실행에 영향을 주지 않으면서 무언가를 확인하고 싶을 때 사용하면 되겠고,

assert는 실패하면 다음 명령을 수행하는게 의미가 없어서 바로 테스트를 실패로 단정짓고 싶을 때 사용하면 되겠습니다.

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

최신 셀레늄 RC 베타2에서 브라우저 별칭이 바뀐 모양입니다.

갑자기 셀레늄으로 테스트해 볼일이 생겨 최신버전으로 설치하고 매뉴얼/블로그 따라해보니 잘 안되네요.

삽질 끝에 브라우저 별칭을 잘못 지정한 것을 알게되었습니다.

이전 버전의 *iexplore는 *iexploreproxy로, *firefox는 *firefoxproxy로 바뀌었습니다.

 

 

LAUNCHER NAME          DESCRIPTION                    CROSS-DOMAIN

--------------------------------------------------------------------
*iexplore, *iehta  =>  Internet Explorer in HTA mode  YES
*iexploreproxy     =>  Internet Explorer normal           NO
*firefox, *chrome  =>  Firefox in Chrome mode         YES
*firefoxproxy        =>  Firefox normal                        NO

 

더 자세한 내용은 다음 사이트를 참조하세요.

http://clearspace.openqa.org/community/selenium/blog/2009/01/13/selenium-rc-beta-2-goodies-and-gotchas

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,