如何減少自動化測試執行時間50%

如何減少自動化測試執行時間50%

這篇文章主要說明如何讓網站自動化測試程式跑得更快!

Selenium網站自動化測試程式由於是真正的 End to End 測試,

Selenium實際啟動瀏覽器,檢查瀏覽器上面的元件與網頁呈現是否異常。

另外一方面,缺點是啟動瀏覽器與檢查畫面都需要額外的啟動與畫面呈現時間。

往往一個網站的自動化測試就需要上小時才能夠整個執行完畢。

因此,這邊介紹另外一個方法可以大幅縮減測試的時間。

工具主角

為了縮短Selenium測試時間並且達到”相當”的測試效果,我們要介紹的工具主角就是 PhantomJS

PhantomJS

PhantomJS可以提供什麼?

PhantomJS與Selenium整合之後,可以提供模擬瀏覽器的功能

之所以說”模擬”是因為用PhantomJS取代瀏覽器FireFox or Chrome時,

Selenium自動化測試程式並不會真的啟動一個瀏覽器,而是針對網站的HTML/JavaScript的做背景執行,

因此沒有畫面、不需要啟動瀏覽器的狀況下作網站的操作與驗證

也因為省去瀏覽器呈現畫面的時間,所以PhantomJS執行的測試程式很快就會完成知道結果。

跟Selenium內建提供的HTMLUnit有什麼不同?

同樣都是不需要啟動瀏覽器就可以執行的測試方法。但是PhantomJS與HTMLUnit最大的不同在於JavaScript Engine

我們希望”模擬”瀏覽器的執行結果跟真實瀏覽器 FireFox, Chrome or IE.會比較接近

因為JavaScript Engine 在於關鍵。HTMLUnit 的JavaScript Engine為 Selenium自家的。沒有市面上瀏覽器使用。

相對的,PhantomJS的JavaScript Engine主要使用QtWebKit。至少Safari 與Chrome 也是使用這樣的JavaScript Engine 。

因此,PhantomJS在執行結果上會更接近真實瀏覽器的執行結果。

http://trac.webkit.org/wiki/QtWebKitFeatures22

PhantomJS目前並不支援 plugins (such as Flash)

實務執行建議

先用PhantomJS 測試為輔,後用Selenium真實瀏覽器測試為主

由於PhantomJS的執行速度較快,讓我們可以很快地知道測試結果。

所以,通常我們會挑選一個測試個案先用PhantomJS執行,知道初步測試的結果。

接著,再利用Selenium啟動正常瀏覽器做細部的每一個畫面呈現的驗證。

為什麼不能完全信賴PhantomJS呢?

因為畢竟真實瀏覽器畫面執行與呈現的結果還是有可能會與PhantomJS有細微的落差。

好處是我們不需要等到幾個小時候才知道測試結果。如果有嚴重的錯誤,用PhantomJS就可以預先早一些知道測試結果。

安裝與設定 PhantomJS

1. 下載 PhantomJS Driver JAR.  here

2. 下載 phantomjs-2.0.0-windows.zip (19.4 MB)並解壓縮。如果是其他平台可以參考 http://phantomjs.org/download.html

其中 phantomjs.exe 就是主要我們用來模擬瀏覽器的重要檔案。

測試情境

接著我們用一個實作的範例說明如何使用PhantomJS

1. 瀏覽www.google.com

2. 搜尋 “Selenium PhantomJS”

3. 印出搜尋結果Title

程式範例

特別說明的是,整個程式跟原本Selenium 99%幾乎都相同。唯一不同的地方:

  • WebDriver driver = new PhantomJSDriver();  其中必須設定phantomjs.exe所在位置

 

Java 範例程式

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

import java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;   
 
public class PhantomTest {              
        public static void main(String[] args) {
                    File file = new File("D:\\tools\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe");             
                    System.setProperty("phantomjs.binary.path", file.getAbsolutePath());        
                    WebDriver driver = new PhantomJSDriver();   
                    driver.get("http://www.google.com");         
                    WebElement element = driver.findElement(By.name("q"));  
                    element.sendKeys("Selenium PhantomJS");                 
                    element.submit();     
                    System.out.println("Page title is: " + driver.getTitle());      
                    driver.quit();          
           }        
}

[/pastacode]

Python 範例程式

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get("https://duckduckgo.com/")
print driver.current_url
driver.find_element_by_id('search_form_input_homepage').send_keys("realpython")
driver.find_element_by_id("search_button_homepage").click()
print driver.current_url
driver.quit()

[/pastacode]

Python unitTest範例程式

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

import unittest
from selenium import webdriver


class TestOne(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.PhantomJS()
        self.driver.set_window_size(1120, 550)

    def test_url(self):
        self.driver.get("http://duckduckgo.com/")
        self.driver.find_element_by_id(
            'search_form_input_homepage').send_keys("realpython")
        self.driver.find_element_by_id("search_button_homepage").click()
        self.assertIn(
            "https://duckduckgo.com/?q=realpython", self.driver.current_url
        )

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

[/pastacode]

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *