PHPUnitManual:17.4

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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