QTP, RFT(Rational Functional Tester), Selenium 및 Webdrive는 웹 애플리케이션의 자동화된 테스트를 위한 수많은 상용 도구와 오픈 소스 프레임워크의 몇 가지 예에 불과하다. 이 기사에서는 자동화된 테스트의 영역에서 인기를 얻고 있는 Sahi라는 도구에 대해 알아본다. Sahi는 여러 브라우저 간의 기록 및 재생을 위한 강력한 기능, 테스트 스크립트를 쓰기 위한 다양한 언어 드라이버(Java, Ruby), Ajax 및 매우 동적인 웹 애플리케이션을 위한 지원을 제공하는 오픈 소스 도구이다. Sahi는 https 및 NTLM 인증도 지원한다. 그림 1에서는 Sahi가 시뮬레이션된 사용자 조작에 적합한 이유를 보여준다.
그림 1. 시뮬레이션된 사용자 조작
Sahi에는 다음과 같은 여러 가지 강력한 기능이 있다.
- Sahi 제어기(IDE)
- 여러 브라우저에 걸쳐 작동하고 Sahi 또는 Java 형식의 두 가지 모드에서 스크립트를 기록한다.
- 강력한 오브젝트 식별
- HTML 구조와는 무관하다.
near및in method와 같은 Sahi의 직관적 API는 페이지가 약간만 변경되어도 브라우저 요소를 찾는 데 도움이 될 수 있으므로, (이해하기 어려울 수 있는) XPath의 요구사항이 제거된다. - 암시적 대기
- AJAX 및 페이지 로드에 대해서도 대기 구현 문제를 다룰 필요가 없다. 테스터가 애플리케이션의 내부 정보를 알 필요가 없다.
이 기사의 나머지 부분에서는 샘플 애플리케이션을 살펴보면서 Sahi를 사용하여 테스트하는 방법을 보여준다. 따라서 실습할 수 있는 샘플 애플리케이션과 테스트 사례를 다운로드할 수 있다.
Sahi를 설치하고 구성하려면 다음을 수행한다.
- 최신 빌드(참고자료 참조)를 다운로드하고 파일의 압축을 푼다. Sahi에는 Java 1.5 이상이 필요하다.
- Sahi의 프록시 서버를 시작한다. 시작 스크립트는 <sahi_root>\userdata\bin에 있다.
- Windows: start_dashboard.bat
- Linux: start_dashboad.sh
그림 2. Sahi 대시보드
이 예제의 경우, 브라우저 구성에 대해 걱정할 필요가 없다. 다른 방법으로 Sahi에서 브라우저를 시작할 수 있는 GUI 도구를 제공하기도 한다.start_sahi.bat/start_sahi.sh를 실행하여 Sahi를 시작한 다음, 브라우저 아이콘을 클릭하여 프록시 서버와 브라우저 프로세스를 시작한다. - Ant와 같은 빌드 도구의 도움을 받아 자동 실행하는 데 필요한
start_sahi.bat/start_sahi.sh를 입력한다.참고: IE(Internet Explorer)의 경우 Sahi의 프록시를 사용하려면 브라우저를 수동으로 구성해야 한다. 또는 Sahi에서 제공하는 도구를 사용하여 Sahi 프록시 서버를 시작하면서 브라우저의 프록시를 설정할 수 있다. 프록시 호스트와 포트는 localhost:9999이다. (<sahi_root>\config\sahi.properties를 통해 포트를 수정할 수 있다.)
Sahi는 Sahi와 Java의 두 가지 스크립트 형식을 기본 제공한다. <sahi_root>\config\sahi.properties에서 기본 옵션인 Sahi를 수정할 수 있다. Sahi 형식은 Sahi Java 스크립트 엔진 내부에서만 작동하는 Java 스크립트 같은 형식이다. 이런 스크립트는 대형 테스트 프로젝트를 위한 다른 테스트 도구 및 프레임워크와 손쉽게 통합할 수 있기 때문에, 이 기사의 예제에서는 더욱 일반적인 Java 형식을 사용한다. Java 형식에는 Junit 및 TestNG와 같은 도구와 통합될 수 있는 공통 Java 코드 스니펫이 포함된다.
간단한 테스트를 실행하려면 다음을 수행한다.
- 테스트할 웹 애플리케이션을 연다. ALT 키를 누르고 페이지를 두 번 클릭한다. (데모에는 Firefox 3이 사용되었다.)
- 그림 3에 표시된 것처럼 Record를 선택한다.
그림 3. 기록을 위한 Sahi 제어기
그러면 Stop 단추로 바뀐다. - 웹 애플리케이션에서 몇 가지 조작을 수행한 다음, Stop을 선택한다. 그림 4에 표시된 것처럼, 애플리케이션에서 실행한
모든 단계가 기록된다.
그림 4. 제어기에 의해 기록된 스크립트
실행한 조작에서 기록 중인 동안 원한다면 몇몇 어설션을 삽입할 수 있다. 또한, 도구에서 삽입을 위한 몇 가지 옵션이 제공되지만, 수동으로 추가하는 것이 좋다.
단위 테스트 프레임워크인 JUnit은 테스트를 바탕으로 한 개발을 설정하는 데 매우 중요하다. 많은 경우, 편리성과 보고를 위해 Junit 형식의 테스트 스크립트를 작성할 수 있다. 이전 예제에서는 Java 형식으로 테스트 스크립트를 기록했다.
위 스크립트를 Junit 스타일로 형식화하려면 Eclipse에서 Java 프로젝트를 작성한 다음, <sahi_root>\lib에 있는 junit4 library 및 sahi.jar를 추가한다. Junit4 형식 테스트 스크립트를 작성할 때, Sahi 환경에 필요한 몇 가지 변수를 초기화해야 한다. 이 기사의 예제에서는 이 클래스를 확장하여 다른 모든 테스트 사례를 실행할 수 있도록 BaseTestCase.java를 확장한다.
demo4sahi 클래스는 BaseTestCase 클래스를 확장하여 Sahi 프록시와 관련된 모든
초기화 태스크를 구현한 후, 다음 두 가지 사항을 확인한다.
- 이메일 형식이 올바른 경우
OK가 표시된다. - 이메일 형식이 틀린 경우
Error가 표시된다.
목록 1은 Junit4 형식으로 된 전형적인 테스트 스크립트를 나타낸 것이다.
리스트 1. Junit4 형식의 테스트 스크립트
public class test4demo extends BaseTestCase {
@Before
public void setUp() {
login();
}
@After
public void tearDown() {
logout();
}
@Test
public void testDemo1() {
browser.textbox("email").setValue("demo for sahi");
browser.submit("Submit").click();
assertTrue(browser.label("error").exists());
}
@Test
public void testDemo2() {
browser.textbox("email").setValue("demo@sahi.com");
browser.submit("Submit").click();
assertTrue(browser.label("ok").exists());
}
}
|
테스트 스크립트를 자동으로 실행하려면 Sahi 런타임에 대한 모든 초기화 및 종료 프로세스를 구현해야 한다. 표 1에서 보는 바와 같이, 4가지의 기본적인 초기화 파트가 있다.
표 1. Sahi 환경 초기화
| BaseTestCase의 메소드 | 설명 |
|---|---|
createConn() | SAHI_BASE_PATH, USER_DATA_PATH 및 브라우저 유형을 초기화하고 브라우저
프로세스를 작성한다. |
delConn() | 브라우저 프로세스를 정리하고 시스템을 최초 상태로 되돌린다. |
setIEProxy() | 테스트를 실행하기 전에 IE 프록시를 설정한다. 이 메소드는 IE에 대해서만 사용한다. |
login(),
logout() 및 상위 레벨 유틸리티에 공통적으로 사용되는 다른 메소드 | 모든 스크립트에 대한 공용 메소드 |
BaseTestCase는 모든 테스트 스크립트의 상위 클래스로서, 브라우저를 열어 사용자의 조작을 시뮬레이션할
수 있도록 다른 모든 메소드에 앞서 런타임 중에 createConn 메소드를 호출한다. 목록 2에는 BaseTestCase에
대한 코드 중 일부가 표시되어 있다.
리스트 2.
BaseTestCase
public class BaseTestCase {
protected Browser browser;
protected Proxy proxy;
protected boolean isProxyInSameProcess = false;
protected String browserType = "firefox";
@Before
public void createConn() throws Exception {
Configuration.initJava("f://Program/sahi", "f://Program/sahi/userdata/");
if (isProxyInSameProcess) {
proxy = new Proxy();
proxy.start(true);
}
browser = new Browser(this.browserType);
browser.open();
}
@After
public void delConn() throws Exception {
browser.setSpeed(100);
browser.close();
if (isProxyInSameProcess) {
proxy.stop();
}
}
public void login(){
browser.navigateTo("http://localhost:8080/demo");
browser.textbox("username").setValue("ligang");
browser.password("password").setValue("welcome");
browser.submit("Login").click();
}
/**
* Setting IE's proxy during testing environment initialization
*
* @param enable
*/
public void setIEProxy(boolean enable) {
try {
Runtime.getRuntime().exec(
new String[] {
SetEnv.sahiBasePath
+ "\\tools\\toggle_IE_proxy.exe",
(enable ? "enable" : "disable") });
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
......
}
|
공통 빌드 도구인 Apache Ant는 특히 Java 기반 프로젝트에 사용된다. Sahi 프레임워크에는 build.xml 파일에서 사용할 수 있는 Ant용 JAR 파일이 포함된다. 하지만, 기본 제공되는 이 컴포넌트는 Sahi의 구조에 적합하게 설계되었다. Junit을 사용하여 전체 인프라를 설정하고 싶을 수도 있겠지만, 이런 방법은 유연성이 떨어지거나 그다지 좋은 방법이 아니다. 예제 프로젝트의 회귀 테스트를 위해, 다음을 포함하는 build.xml이 작성되었다.
- 목록 3과 4는 Sahi 프록시 서버를 시작하고 중지하는 방법을 나타낸 것이다.
리스트 3. Sahi 프록시 서버 시작<target name="start_sahiserver"> <echo message="starting sahi server" /> <java fork="true" spawn="true" classname="net.sf.sahi.Proxy"> <classpath> <fileset dir="${sahi.dir}"> <include name="**/*.jar" /> </fileset> </classpath> <arg value="${sahihome.dir}" /> <arg value="${sahiuser.dir}" /> </java> <antcall target="proxyon" /> </target>
리스트 4. Sahi 프록시 서버 중지<target name="stop_sahiserver"> <echo message="going to stop Sahi server" /> <sahi stop="true" sahihost="localhost" sahiport="9999" /v <antcall target="proxyoff" /> </target>
- 목록 5는 IE 프록시 설정을 열고 닫는 방법을 나타낸 것이다.
리스트 5. IE 프록시 열기/닫기<target name="proxyon"> <exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe"> <arg value="enable" /> </exec> </target> <target name="proxyoff"> <exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe"> <arg value="disable" /> </exec> </target>
- 보고.
Eclipse IDE에서의 손쉬운 디버깅을 위해 별도로 조치를 실행할 수 있다.
웹 애플리케이션 테스트에서는 오브젝트를 효과적으로 식별하는 것이 매우 중요하다. 다른 많은 테스트 도구와 달리, Sahi에는 웹 페이지에 있는 오브젝트를 찾기 위한 몇 가지 강력한 API가 있다. 표 2 에 몇 가지 예를 제시한다. 전체 목록을 포함한 온라인 문서를 볼 수 있는 링크는 참고자료 섹션을 참조한다.
표 2. 특수한 찾기 메소드
| 기능 | 메소드 | 샘플 코드 |
|---|---|---|
| 정규식 지원 | 거의 모든 요소 ID | browser.link(/Link to .*/) |
| DOM 관계를 기반으로 한 찾기 | near, in |
browser.button("delete").in(browser.cell("item1")).click()
|
| 위치 관계를 기반으로 한 찾기 | under | browser.button("delete").under(browser.cell("item1")) |
이 기사에서는 웹 애플리케이션 테스트를 자동화하기 위한 도구인 Sahi에 대해 살펴보았다. Sahi는 여러 브라우저 간의 기록 및 재생을 허용하는 오픈 소스 도구이다. 이 기사에서는 테스트 스크립트를 쓰기 위한 다양한 언어 드라이버에 대해 학습했다. 샘플 애플리케이션과 테스트 사례를 통해 Junit에 대한 스크립트를 형식화하고 Apache Ant로 테스트하는 방법을 보여주었다. Sahi의 고급 API에 대해서도 개술했다.
| 설명 | 이름 | 크기 | 다운로드 방식 |
|---|---|---|---|
| Sample web application | webapp4sahi.zip | 7KB | HTTP |
| A Sahi test example | Demo4SahiTest.zip | 287KB | HTTP |
교육
- Sahi: 웹 애플리케이션 테스트의 자동화를 위한 비즈니스용 도구인
Sahi에 대한 모든 것을 알아보자. 각종 문서, 튜토리얼 및 지원 포럼에 액세스할 수 있다.
- Sahi: Sahi에 대한 추가 정보를 읽어보자.
- developerWorks 웹 개발 영역: 다양한 웹 기반 솔루션을 다루고 있는 기사를 찾아보자.
-
developerWorks technical events and webcasts: developerWorks 기술 행사 및 웹 캐스트를 통해
최신 정보를 얻을 수 있다.
제품 및 기술
- Sahi: Sahi를
다운로드할 수 있는 웹 페이지이다.
- IBM 시험판 소프트웨어: 다운로드하거나 DVD로 제공받을 수 있는 IBM 시험판 소프트웨어를 사용하여 후속 개발 프로젝트를 구현해 보자.
토론
- 포럼에 참여하기.
- 지금 developerWorks 프로파일을 작성하고 Sahi에 대한 관심목록을 설정하자. developerWorks 커뮤니티에서 최신 정보를 확인하자.
- 웹 개발에 관심이 있는 다른 developerWorks 멤버를 찾아보자.
- 웹 주제를 중점적으로 다루는 developerWorks 그룹 중 하나에 참여하자: 지식을 공유하자.
- Roland Barcia는 자신의 블로그에서 Web 2.0 및 미들웨어에 대해 설명했다.
- developerWorks의 멤버들이 공유하고
있는 웹 주제에 대한 즐겨찾기를 살펴보자.
- Web 2.0 Apps 포럼 방문: 신속하게 답변을 얻을 수 있다.
- Ajax 포럼 방문: 신속하게 답변을 얻을 수 있다.
