2011年10月23日日曜日

Selenium with JUnit

今回は, Selenium と Java の Unit テスト JUnit を使ってWebアプリケーションをテストする方法についてです。(Selenium のJUnit テストは, client のドライバを使うことから, WebDriverという言葉がしばし用いられます, 今後WebDriverによるテストと何度か使うかもしれません)

環境   MacOS X   Windows7   Firefox はいずれも7.0.1
(プログラムの動作はMacで確認いたしましたが,普段Windows7でもプログラムを作成して動作しているので問題ありません)

WebDriver によるプログラミングは, Javaのほかにも C#, Python, Ruby, Perl, PHPなどでも可能です。 ブラウザは, Defualt で Firefox , そのほか拡張Driverを利用すれば, IE, Chrome, Safari, Opera, などでも可能です。(今回は, Firefoxで試してみます, Chromeもいずれの機会に)


Selenium は, すでに予備知識がある前提といたします。また, JUnit の設定も同様とします。 Selenium に関しては,  筆者のIDEに関する記述をご覧ください。

Selenium IDE その1
Selenium IDEその2(コマンド)
Selenium IDEその3(Locators)
Selenium IDEその4(Ajax)

では,さっそく準備をしましょう。

1. Selenium のライブラリのダウンロード
2. JUnit のコードを書く


SeleniumのWebページより, Selenium Client Drivers の項目から, JavaのClientライブラリ一式を
ダウンロードします。(2011/10/23時点でVersion2.9)


このフォルダを解凍すると,  selenium の中に, core である selenium-java-.x.x.x.jar があります。
依存ライブラリは, lib の中にあります。

筆者が確認したところ, WebDriverのプログラムに必要な, Minium Requirements は以下になります。
commons-logging-1.1.1.jar
guava-r09.jar
httpclient-4.1.2.jar
httpcore-4.1.3.jar
json-20080701.jar
selenium-java-2.9.0.jar


※バージョン 2.13.0 では, さらに commons-exec-1.1.jar が必要なようです 
2.20 でも2.13と同じことを確認いたしました(2012/03/22)

です。 これらをJUnit のプログラムの Build Path に入れていただく必要があります。

次に, JUnit4 を使ってプログラムを書きましょう。今回はSelenium IDEその1でも利用した, Googleのサーチを使ったテストです。

テスト手順
1.  Google のWebサイト(http://www.google.co.jp)を開く
2.  検索Box に "AKB48" と入力
3.  自動検索を待ち, AKB48公式サイトの文字が出るまで待機
4.  AKB48公式サイトのリンクをクリックしてページを表示
5.  Web ページのタイトルが 「AKB48公式サイト」であることを確かめる


プログラムを動かすと, 自動的に Firefox を立ちあげ, テストを行います。
JUnit のプログラムなので, Breakpointを追加して止めることも可能です。
Selenium IDEと違って, verify, assert 系の関数はないので,  JUnit の Assert.assertXxxx 系の関数を使用しましょう。

プログラムは  WebDriver interface と Selenium class を利用して, テストを書きます(これらの説明は次回)

WebDriver を使用して立ち上がったFirefox には, 右下に, WebDriverと表記しています。


今回使用したプログラムは以下です。詳しいコードの解説は次回に
●Test のメインクラス   SearchTest.java

package com.atmarkplant.test.selenium.sample;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverBackedSelenium;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

import com.thoughtworks.selenium.Selenium;

public class SearchTestCase
{
WebDriver driver;

Selenium selenium;

private static String TIMEOUT = "5000";

private static String SEARCHTEXT = "AKB48";

@Before
public void setup()
{
FirefoxProfile profile = new FirefoxProfile();
driver = new FirefoxDriver(profile);
String baseURL = "http://www.google.co.jp";
selenium = new WebDriverBackedSelenium(driver, baseURL);
}

@After
public void tearDown()
{
if ( selenium != null )
{
selenium.close();
}
if ( driver != null )
{
driver.close();
}
}

@Test
public void searchTest() throws InterruptedException
{
// Open base URL
selenium.open("/");
selenium.waitForPageToLoad(TIMEOUT);

// Input something in search text box
selenium.type("id=lst-ib", SEARCHTEXT);
WaitUtils.waitText(selenium, SEARCHTEXT, 5000);

// Click link
selenium.click("link=AKB48公式サイト");
selenium.waitForPageToLoad(TIMEOUT);

         
Assert.assertEquals("AKB48公式サイト", driver.getTitle());
Thread.sleep(4000);  // For testing
}
}


●Ajax 対策用  Textが出現するまで待つ用途のクラス
TextWait.java


package com.atmarkplant.test.selenium.sample;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.Wait;

public class TextWait extends Wait
{
Selenium selenium;
String text;

public TextWait(Selenium selenium, String text)
{
this.selenium = selenium;
this.text = text;
}
@Override
public boolean until()
{
return selenium.isTextPresent(text);
}
}

● 上記のクラスを利用するためのUtility関数のためのクラス
WaitUitls.java

package com.atmarkplant.test.selenium.sample;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.Wait;

public class WaitUtils
{
public static void waitText(Selenium selenium, String text, long timeout) throws InterruptedException
{
Wait wait = new TextWait(selenium, text);
synchronized(wait)
{
wait.wait(timeout);
}

}
}











0 件のコメント:

コメントを投稿