PHPUnitManual:17.4

From 흡혈양파의 번역工房
Jump to navigation Jump to search
17.4 PHPUnit_Extensions_SeleniumTestCase

PHPUnit_Extensions_SeleniumTestCase test case 는, Selenium Server 와 통신하기 위한 클라이언트 / 서버 프로토콜을 구현한 것입니다. 또, 웹 테스트에 특화된 검증 메소드를 제공합니다.


예17.2 "PHPUnit_Extensions_SeleniumTestCase" 의 사용예 는, 웹사이트 http://www.example.com/ 의 <title> element 의 내용을 테스트하는 방법입니다.


예17.2 PHPUnit_Extensions_SeleniumTestCase 의 사용예

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitle('Example WWW Page');
    }
}
?>
phpunit WebTest
PHPUnit 3.7.0 by Sebastian Bergmann.

F

Time: 9 seconds, Memory: 6.00Mb

There was 1 failure:

1) WebTest::testTitle
Current URL: http://www.iana.org/domains/example/

Failed asserting that 'IANA — Example domains' matches PCRE pattern "/Example WWW Page/".


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.


PHPUnit_Framework_TestCase 클래스와는 달리, PHPUnit_Extensions_SeleniumTestCase 를 계승하는 test case 클래스는 setUp() 메소드를 필히 가지고 있어야 합니다. 이 메소드 안에서, Selenium Server session 이 설정됩니다. 표17.1 "Selenium Server API : Setup" 는 설정을 위해 사용 가능한 메소드의 리스트입니다.


PHPUnit 은 Selenium 테스트가 실패할 경우, screenshot 을 저장할 수 있습니다. 이 기능을 사용하기 위해서는, $captureScreenshotOnFailure, $screenshotPath, 그리고 $screenshotUrl 를 test case 클래스 안에서 지정합니다 (예17.3 "테스트에 실패한 경우의 screenshot 취득".


예17.3 테스트에 실패한 경우의 screenshot 취득

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected $captureScreenshotOnFailure = TRUE;
    protected $screenshotPath = '/var/www/localhost/htdocs/screenshots';
    protected $screenshotUrl = 'http://localhost/screenshots';
 
    protected function setUp()
    {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitle('Example WWW Page');
    }
}
?>
phpunit WebTest
PHPUnit 3.7.0 by Sebastian Bergmann.

F

Time: 7 seconds, Memory: 6.00Mb

There was 1 failure:

1) WebTest::testTitle
Current URL: http://www.iana.org/domains/example/
Screenshot: http://localhost/screenshots/334b080f2364b5f11568ee1c7f6742c9.png

Failed asserting that 'IANA — Example domains' matches PCRE pattern "/Example WWW Page/".


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.


여러 브라우저를 대상으로 테스트할 수도 있습니다. 이 경우, setBrowser() 를 사용하여 설정하는 것이 아니라, test case 클래스에 public static 배열 $browsers 을 만들어야 합니다. 이 배열의 각 항목이 각각의 브라우저를 나타냅니다. 이 브라우저들은, 각각 별개의 Selenium Server 로 관리할 수 있습니다. 예17.4 "복수의 브라우저 설정 관리" 는 그 예입니다.


예17.4 복수의 브라우저 설정 관리

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox',
        '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->assertTitle('Example Web Page');
    }
}
?>


PHPUnit_Extensions_SeleniumTestCase 로 Selenium 에서 실행한 테스트의 coverage 정보를 얻을 수 있습니다.

  1. PHPUnit/Extensions/SeleniumCommon/phpunit_coverage.php 를 웹서버의 document root directory 에 복사합니다.
  2. 웹서버의 php.ini 설정 파일에, PHPUnit/Extensions/SeleniumCommon/prepend.php 와 PHPUnit/Extensions/SeleniumCommon/append.php 를 각각 auto_prepend_file 와 auto_append_file 로 설정합니다.
  3. PHPUnit_Extensions_SeleniumTestCase 를 계승한 test case 클래스를,
    protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
    
    처럼 phpunit_coverage.php 스크립트의 URL 을 지정합니다.


표17.2 "검증" 은 PHPUnit_Extensions_SeleniumTestCase 가 제공하는 다영한 검증 메소드의 리스트입니다.


표17.3 "templete 메서드" 는 PHPUnit_Extensions_SeleniumTestCase 의 templete 메서드를 정리한 것입니다.


사용 가능한 명령어 레퍼런스 및 실제 사용법은, Selenium 명령어 문서[1] 를 참조하세요.


Selenium 1 의 명령어는 __call 을 통해 동적으로 구현되어 있습니다. PHPUnit_Extensions_SeleniumTestCase_Driver::__call() 의 API 문서[2] 에, PHP 에 대응하는 모든 메소드의 리스트가 나와 있습니다. 이 문서를 통해 인수와 반환값의 type 도 확인할 수 있습니다.


runSelenese($filename) 메소드를 사용하여, Selenese/HTML 설정을 사용한 Selenium 테스트를 실행할 수 있습니다. 또한, 정적 속성인 $seleneseDirectory 를 사용하여, Selenese/HTML 파일이 들어 있는 디렉토리 안에서 자동적으로 테스트 오브젝트를 작성할 수 있습니다. 지정한 디렉토리의 하위 구조를 재귀적으로 탐색하여 .htm 파일을 찾습니다. 이 파일에는 Selenese/HTML 이 포함되어 있습니다. 예17.5 "Selenium/HTML 파일 디렉토리를 테스트에 사용하기" 가 그 예입니다.


예17.5 Selenium/HTML 파일 디렉토리를 테스트에 사용하기

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


Selenium 1.1.1 이후에 추가된 실용적인 기능을 사용하여 유저가 다수의 테스트 간에 session 을 공유할 수 있게 되었습니다. 현재 서포트되는 것은, 하나의 브라우저를 사용한 모든 테스트 간에 session 을 공유하는 것 뿐입니다. Session 공유 기능을 사용하기 위해서는, bootstrap 파일 안에서 PHPUnit_Extensions_SeleniumTestCase::shareSession(true) 을 호출하여야 합니다. 테스트에 성공하지 않은 (실패 혹은 불완전) 경우 공유 session 이 리셋됩니다. Cookie 를 리셋하거나, (tearDown() 메소드를 사용하여) 테스트 대상 어플리케이션에서 로그아웃하거나, 테스트 간에 간섭이 발생하지 않도록 하는 등의 일은 유저가 책임지고 관리해야 합니다.


Notes