Chapter 4 在 Java 中進行各種單元測試
Lession 16 : HTMLUnit
* Category: Test
* Project Name: HTMLUnit
* WebSite: https://htmlunit.sourceforge.net/
* License: Apache-like https://htmlunit.sourceforge.net/license.html
* Last version: 1.11 (2007/04)
我們在開發 Web 的時候,必要時,對於網頁的操作,總不能每次都以人工點選操控瀏覽器,進行部署後的測試,所以我們需要 HTMLUnit 來解決這個問題。 其實也有一個很雷同的 opensource,名叫 HttpUnit,只是 HttpUnit 著重於 Http 通訊協定的運用,如果要針對 form 與 table 等網頁元件處理,使用 HTMLUnit 會比較輕鬆。
例如我們要確認網頁的標題<title>是否正確,首先先建立一個 WebClient 就是視為一個瀏覽器,接著透過 WebClient 進行遠端 URL 存取取得一個頁面,再針對該頁面 getTitleText() 取得標題,最後利用 assertEquals 來判斷字串是否如同預期。
package com.softleader.unittest.htmlunit;
import java.net.URL;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.Assert;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HtmlUnitSample extends TestCase {
@Test
public void testSoftleaderTitle() throws Exception{
final WebClient webClient = new WebClient();
final URL url = new URL("https://www.softleader.com.tw");
final HtmlPage page = (HtmlPage)webClient.getPage(url);
assertEquals( "::::::::::::松凌科技::::::::::::", page.getTitleText() );
}
}
當 test 出現綠燈,那麼就算是正確。
{mosimage}
主要來說,HTMLUnit 還可以模擬各種不同的瀏覽器,如果要專測某種瀏覽器,就是在建立 WebClient 之時,利用 new WebClient(BrowserVersion.MOZILLA_1_0),或是BrowserVersion.NETSCAPE 等等的方式進行。
當然,HTMLUnit 也可以設定 proxy Server,因為畢竟有些公司內部一定要透過 proxy 才能存取網頁,此外,也支援 keyboard 的操控,例如 tab 在 HTML 之中是以 tabindex 來進行順序排列,就可以用 call HtmlPage.tabToNextElement() 或是 HtmlPage.tabToPreviousElement() 來進行前後控制。或是使用HtmlPage.pressAccessKey(char)。直接透過 html accesskey 的屬性來測試控制的。
有時候,我會利用 HTMLUnit 來設計抓網頁欄位數值的內容,只需要利用 HTMLTable 與 HtmlTableRow 加上 HtmlTableCell,就可以把一個表格之中的某個數值抓取出來作其他判斷。不過,雖然現在也有內建 mozilla 的 js.jar,但是在 javascript 運作,IE 與 firefox 也有所不同,所以往往會發生 javascript 無法解析。這部分的情況,我通常會移除 js.jar,讓 javascript disabled ,否則衍生性的問題將會更多。當然,如果都利用標準 javascript 語法撰寫的網頁,可以利用之來處理 javascript 事件,甚至監控 alert 的訊息,倒是蠻方便的。