PHPUnitManual:17.4
- 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" 는 설정을 위해 사용 가능한 메소드의 리스트입니다.
Method | 의미 |
void setBrowser(string $browser) | Selenium Server 가 사용하는 브라우저를 설정합니다. |
void setBrowserUrl(string $browserUrl) | 테스트할 base URL 을 설정합니다. |
void setHost(string $host) | Selenium Server 에 접속하기 위한 HOST 이름을 설정합니다. |
void setPort(int $port) | Selenium Server 에 접속하기 위한 port 번호를 설정합니다. |
void setTimeout(int $timeout) | Selenium Server 접속의 timeout 값을 설정합니다. |
void setSleep(int $seconds) | Selenium Server client 가 Selenium Server 에 액션 명령을 송신한 후의 대기시간 (초) 를 설정합니다. |
표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 정보를 얻을 수 있습니다.
- PHPUnit/Extensions/SeleniumCommon/phpunit_coverage.php 를 웹서버의 document root directory 에 복사합니다.
- 웹서버의 php.ini 설정 파일에, PHPUnit/Extensions/SeleniumCommon/prepend.php 와 PHPUnit/Extensions/SeleniumCommon/append.php 를 각각 auto_prepend_file 와 auto_append_file 로 설정합니다.
- PHPUnit_Extensions_SeleniumTestCase 를 계승한 test case 클래스를,처럼 phpunit_coverage.php 스크립트의 URL 을 지정합니다.
protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
표17.2 "검증" 은 PHPUnit_Extensions_SeleniumTestCase 가 제공하는 다영한 검증 메소드의 리스트입니다.
Assertion | 의미 |
void assertElementValueEquals(string $locator, string $text) | $locator 로 지정된 element 의 값이 $text 와 다를 경우 에러를 보고합니다. |
void assertElementValueNotEquals(string $locator, string $text) | $locator 로 지정된 element 의 값이 $text 와 같을 경우 에러를 보고합니다. |
void assertElementValueContains(string $locator, string $text) | $locator 로 지정된 element 의 값이 $text 를 포함하지 않을 경우 에러를 보고합니다. |
void assertElementValueNotContains(string $locator, string $text) | $locator 로 지정된 element 의 값이 $text 를 포함할 경우 에러를 보고합니다. |
void assertElementContainsText(string $locator, string $text) | $locator 로 지정된 element 가 $text 를 포함하지 않을 경우 에러를 보고합니다. |
void assertElementNotContainsText(string $locator, string $text) | $locator 로 지정된 element 가 $text 를 포함할 경우 에러를 보고합니다. |
void assertSelectHasOption(string $selectLocator, string $option) | 지정된 옵션이 사용 불가능할 경우 에러를 보고합니다. |
void assertSelectNotHasOption(string $selectLocator, string $option) | 지정된 옵션이 사용 가능할 경우 에러를 보고합니다. |
void assertSelected($selectLocator, $option) | 지정된 label 이 선택되지 않은 경우 에러를 보고합니다. |
void assertNotSelected($selectLocator, $option) | 지정된 label 이 선택된 경우 에러를 보고합니다. |
void assertIsSelected(string $selectLocator, string $value) | 지정한 값이 선택되지 않은 경우 에러를 보고합니다 |
void assertIsNotSelected(string $selectLocator, string $value) | 지정된 값이 선택된 경우 에러를 보고합니다. |
표17.2 검증 (Assertions) |
표17.3 "templete 메서드" 는 PHPUnit_Extensions_SeleniumTestCase 의 templete 메서드를 정리한 것입니다.
메서드 | 의미 |
void defaultAssertions() | Test case 안의 모든 테스트가 공유하는 검증을 Override 합니다. 이 메소드는 Selenium Server 에 명령이 송신될 때마다 (송신된 뒤에) 호출됩니다. |
표17.3 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() 메소드를 사용하여) 테스트 대상 어플리케이션에서 로그아웃하거나, 테스트 간에 간섭이 발생하지 않도록 하는 등의 일은 유저가 책임지고 관리해야 합니다.