Selenium RC

Selenium RC是一款測試工具,允許你為web應用編寫自動化的用戶接口測試,支持任何程序設計語言、任何HTTP站點以及任何主流瀏覽器。它使用Selenium Core,這是個利用JavaScript執行自動瀏覽器任務的庫。Selenium測試直接運行于瀏覽器中,就像真實做的那樣。這些測試既可用于驗收測試(通過在集成系統上執行更高級的測試而不是只獨立地測試系統的各個單元),又可用于瀏覽器兼容性測試(通過測試不同操作系統和瀏覽器上的web應用)。

我看看下Selenium RC是如何安裝的:

  1. 下載一個Selenium RC分發包存檔。
  2. 分發包存檔并拷貝server/selenium-server.jar/usr/local/bin(例如)。
  3. 通過運行java -jar /usr/local/bin/selenium-server.jar啟動Selenium RC服務器。

現在我們可以利用它的客戶/服務器協議向Selenium RC服務器發送命令了。

PHPUnit_Extensions_SeleniumTestCase

PHPUnit_Extensions_SeleniumTestCase測試用例擴展將同Selenium RC通話的客戶/服務器協議實現為專門用于web測試的斷言方法。

范例 19.1顯示如何測試http://www.example.com/站點的<title>元素的內容。

范例 19.1: PHPUnit_Extensions_SeleniumTestCase使用舉例

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox /usr/lib/firefox/firefox-bin');
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitleEquals('Example Web Page');
    }
}
?>

不同于PHPUnit_Framework_TestCase類,擴展了PHPUnit_Extensions_SeleniumTestCase的測試用例類必須提供setUp()方法。該方法用于配置Selenium RC會話。可用于此的方法列表見表 19.1

表 19.1. Selenium RC API:裝配

方法含義
void setBrowser(string $browser)Selenium RC服務器使用的瀏覽器。
void setBrowserUrl(string $browserUrl)設置用于測試的基址URL。
void setHost(string $host)設置連接到Selenium RC服務器的主機名。
void setPort(int $port)設置連接到Selenium RC服務器的端口號。
void setTimeout(int $timeout)設置連接到Selenium RC服務器的超時時間。
void setSleep(int $seconds)設置Selenium RC客戶端向Selenium RC服務器發送動作指令之間睡眠的秒數。

你也可以使用一組瀏覽器運行每一個測試:在你的測試用例類中聲明一個名為$browserspublic static數組代替使用setBrowser()設置一個瀏覽器。該數組中的每一項都描述一個瀏覽器配置。這些瀏覽器中的每一個都能被不同的Selenium RC服務器接待:

范例 19.2: 設置多瀏覽器配置

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox /usr/lib/firefox/firefox-bin',
        'host'    => 'my.linux.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on MacOS X',
        'browser' => '*safari',
        'host'    => 'my.macosx.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on Windows XP',
        'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Internet Explorer on Windows XP',
        'browser' => '*iexplore',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      )
    );
 
    protected function setUp()
    {
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitleEquals('Example Web Page');
    }
}
?>

PHPUnit_Extensions_SeleniumTestCase能夠收集測試經由Selenium運行時的代碼覆蓋率信息:

  1. 拷貝PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php到你的web服務器的文件根目錄中。
  2. 在你的web服務器的php.ini配置文件中,配置PHPUnit/Extensions/SeleniumTestCase/prepend.phpPHPUnit/Extensions/SeleniumTestCase/append.php分別作為auto_prepend_fileauto_append_file
  3. 在你的擴展了PHPUnit_Extensions_SeleniumTestCase的測試用例類中,使用
    protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
    配置用于phpunit_coverage.php腳本的URL。

表 19.2列出PHPUnit_Extensions_SeleniumTestCase提供的各種斷言方法。

表 19.2. 斷言

斷言含義
void assertAlertPresent()如果不存在警告(對話框)則報錯。
void assertNoAlertPresent()如果存在警告(對話框)則報錯。
void assertChecked(string $locator)如果$locator標識的元素未選中則報錯。
void assertNotChecked(string $locator)如果$locator標識的元素被選中則報錯。
void assertConfirmationPresent()如果不存在確認(對話框)則報錯。
void assertNoConfirmationPresent()如果存在確認(對話框)則報錯。
void assertEditable(string $locator)如果$locator標識的元素不可編輯則報錯。
void assertNotEditable(string $locator)如果$locator標識的元素可編輯則報錯。
void assertElementValueEquals(string $locator, string $text)如果$locator標識的元素的值不等于給定的$text則報錯。
void assertElementValueNotEquals(string $locator, string $text)如果$locator標識的元素的值等于給定的$text則報錯。
void assertElementContainsText(string $locator, string $text)如果$locator標識的元素不含給定的$text則報錯。
void assertElementNotContainsText(string $locator, string $text)如果$locator標識的元素包含給定的$text則報錯。
void assertElementPresent(string $locator)如果$locator標識的元素不存在則報錯。
void assertElementNotPresent(string $locator)如果$locator標識的元素存在則報錯。
void assertLocationEquals(string $location)如果當前位置(location)不等于給定的$location則報錯。
void assertLocationNotEquals(string $location)如果當前位置(location)等于給定的$location則報錯。
void assertPromptPresent()如果不存在提示(對話框)則報錯。
void assertNoPromptPresent()如果存在提示(對話框)則報錯。
void assertSelectHasOption(string $selectLocator, string $option)如果給定的選項不可用則報錯。
void assertSelectNotHasOption(string $selectLocator, string $option)如果給定的選項可用則報錯。
void assertSelected($selectLocator, $option)如果給定的標簽未選中則報錯。
void assertNotSelected($selectLocator, $option)如果給定的標簽被選中則報錯。
void assertIsSelected(string $selectLocator, string $value)如果給定的值未選中則報錯。
void assertIsNotSelected(string $selectLocator, string $value)如果給定的值被選中則報錯。
void assertSomethingSelected(string $selectLocator)如果$selectLocator標識的選項未選中則報錯。
void assertNothingSelected(string $selectLocator)如果$selectLocator標識的選項被選中則報錯。
void assertTextPresent(string $pattern)如果給定的$pattern不存在則報錯。
void assertTextNotPresent(string $pattern)如果給定的$pattern存在則報錯。
void assertTitleEquals(string $title)如果當前標題不等于給定的$title則報錯。
void assertTitleNotEquals(string $title)如果當前標題等于給定的$title則報錯。
void assertVisible(string $locator)如果$locator標識的元素不可見則報錯。
void assertNotVisible(string $locator)如果$locator標識的元素可見則報錯。

表 19.3顯示PHPUnit_Extensions_SeleniumTestCase的兩個模板方法:

表 19.3. 模板方法

方法含義
void defaultAssertions()重寫以執行一個測試用例中的所有測試共享的斷言。該方法在發送給Selenium RC服務器的每個命令之后被調用。
void sharedAssertions()重寫以執行一個測試用例中的所有測試共享的斷言。該方法在一個測試執行結束之前被調用。

請查閱Selenium Core的文檔獲得關于可用的命令以及如何使用的參考。

利用runSelenese($filename)方法,你也能從它的Selenese/HTML規范運行一個Selenium測試。此外,利用靜態屬性$seleneseDirectory,你能從一個包含Selenese/HTML文件的目錄自動地創建測試對象。指定的目錄被遞歸地搜索預期包含Selenese/HTML的.htm文件。 范例 19.3顯示一個例子。

范例 19.3: 使用Selenese/HTML文件的目錄作為測試

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class SeleneseTests extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $seleneseDirectory = '/path/to/files';
}
?>