如何減少自動化測試執行時間50%
這篇文章主要說明如何讓網站自動化測試程式跑得更快!
Selenium網站自動化測試程式由於是真正的 End to End 測試,
Selenium實際啟動瀏覽器,檢查瀏覽器上面的元件與網頁呈現是否異常。
另外一方面,缺點是啟動瀏覽器與檢查畫面都需要額外的啟動與畫面呈現時間。
往往一個網站的自動化測試就需要上小時才能夠整個執行完畢。
因此,這邊介紹另外一個方法可以大幅縮減測試的時間。
工具主角
為了縮短Selenium測試時間並且達到”相當”的測試效果,我們要介紹的工具主角就是 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]