fest + selenium進行In-browser Applet自動化測試

festselenium項目背景:

基於瀏覽器的Applet使用開源方法進行自動化測試一直是一個難題。希望這篇文章能夠爲你提供一個開源的參考方案。

如果你使用Java Swing進行Applet或者GUI開發,你就可能使用過fest進行單元測試或者Acceptance測試。fest簡單易用,它的用戶包括:Google, Square, Eclipse Foundation, Oracle, IBM, Guidewire等等。同時許多公司都在使用Selenium進行網頁方面的測試。如何能夠把兩者結合起來,就是我們討論的話題。有老外開發了一個.net 的FEST-Selenium,能從一定程度上解決這個問題,他有以下不足之處:

1,不支持java,只能使用.net

2,我們不能重用fest簡單的語法。

這個festselenium項目就是能夠重用以前fest的測試代碼,差不多不要修改就能通過selenium進行遠端控制。festselenium自動實現client<->selenium<->fixture<->SUT的最終交互。

這是我以前寫的一個自動測試框架,通過http://code.google.com/p/festselenium/ 能訪問源代碼。

Fest和Festselenium testcase代碼比較

Fest示例:

dialog.comboBox("domain").select("Users");
dialog.textBox("username").enterText("alex.ruiz");
dialog.button("ok").click();

festselenium示例:

除了要新建一個selenium連接,用戶幾乎感覺不到中間已經多了selenium這一層

// selenium setup
selenium = new DefaultJavaSelenium("localhost",4444, browserString , url);
selenium.start();
selenium.open(url);

// get the appletfixure to control fest JAppletFixture
AppletFixture dialog = selenium.applet(LIST_APPLET_ID)

// fest similar API for autmation testing
dialog.comboBox("domain").select("Users");
dialog.textBox("username").enterText("alex.ruiz");
dialog.button("ok").click();

完整流程Demo

step1~3和6和以前fest進行applet一樣。4除了要新建一個selenium連接之外和fest測試代碼是一樣的。4到5就是這個項目的核心,完成festselenium測試代碼-〉selenium調用-〉fest fixture的自動轉換。

1, 被測Applet代碼:

package com.nemo.festselenium.demo;

import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

import javax.swing.*;
import javax.swing.text.JTextComponent;

public class DemoApplet extends JApplet implements AdjustmentListener{

        private static final long serialVersionUID = 1L;
        JScrollBar slider;              
        JTextComponent text;            
        JPanel panel;
        
        public void adjustmentValueChanged(AdjustmentEvent e) {
                text.setText(new Integer(slider.getValue()).toString());
        } 
        
        public DemoApplet(){
                slider = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 100);
                text = new JTextArea("0");
                panel = new JPanel();
                panel.add(text);
                panel.add(slider);
                add(panel);
                slider.addAdjustmentListener(this);
        }
}

2, 被測試對象fixture

package com.nemo.festselenium.demo;

import org.fest.swing.fixture.JAppletFixture;

public class JTestFixture extends DemoApplet {
        JAppletFixture fixture;
        
        public JTestFixture() {
                super();
                
                setName("demo_applet");
                fixture=new JAppletFixture(this);
        }
          public JAppletFixture getTestFixture() {
                  return fixture;
          }
}

3, 新建一個HTML,ID=demo_applet

<html>
<head>
<title>Test</title>
</head>
<body>
<div>
<object id="demo_applet" width="300" height="150" type="application/x-java-applet">
    <param name="java_code" value="com.nemo.festselenium.demo.JTestFixture.class" />
    <param name="java_archive" value="fest-swing-1.2a3.jar,fest-assert-1.1.jar,fest-util-1.1.jar,fest-reflect-1.2-SNAPSHOT.jar" />
</object>
</div>
</body>
</html>

4,festselenium驅動selenium進行單元測試代碼:

package com.nemo.festselenium.demo;

import static org.junit.Assert.*;

import org.junit.*;
import com.nemo.festselenium.fixture.*;
import com.nemo.festselenium.selenium.*;

public class DemoTest {
        DefaultJavaSelenium selenium;
        
        @Before
        public void setUp() {
                selenium = new DefaultJavaSelenium("localhost",4444, "*iexplore" , "http://localhost:8080");            
        }
        
        @After
        public void tearDown() {
                selenium.stop();
        }
        @Test
        public void test() {

                selenium.start();
                selenium.open("demo_applet.html");
                selenium.windowMaximize();
                AppletFixture fixture = selenium.applet("demo_applet");
                ScrollBarFixture scrollbar = fixture.scrollBar();
                TextComponentFixture text = fixture.textBox();
                scrollbar.scrollUnitUp();
                assertEquals(text.text(), "1");         
        }       

}

5,把遠端對象請求轉化爲Selenium的調用:

15:19:56.179 INFO - Command request: getNewBrowserSession[*iexplore, http://loca
15:20:04.659 INFO - Command request: open[demo_applet.html, ] on session a84fc32
15:20:08.223 INFO - Command request: windowMaximize[, ] on session a84fc3216d6c4
1f1865ab7a710189814
15:20:08.847 INFO - Command request: getEval[navigator.userAgent, ] on session a
84fc3216d6c41f1865ab7a710189814
15:20:09.378 INFO - Command request: getEval[window.document.getElementById("dem
o_applet").getTestFixture().scrollBar().scrollUnitUp(), ] on session a84fc3216d6
c41f1865ab7a710189814
15:20:10.205 INFO - Command request: getEval[window.document.getElementById("dem
o_applet").getTestFixture().textBox().text(), ] on session a84fc3216d6c41f1865ab
7a710189814

6,fest fixture繼續完成後面的工作



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章