PhpUnit with PHP
- gentoo의 php에서 phpUnit을 설치하고 테스트하는방법
관련자료
- phpUnit :: https://github.com/sebastianbergmann/phpunit/
- php :: http://php.net
개요
phpUnit 은 php를 이용해서 진행하는 프로젝트에 대한 Unit test 를 진행할 수 있는 프레임웍이다.
설치::portage
gentoo에서 phpUnit의 portage가 있기는 하지만 이를 사용하면 설치되는 파일이 적기때문에 pear를 사용해도 된다.
file:///etc/make.conf
PHP_TARGETS="php5-4"
아래의 패키지를 설치할때 주의점이 있다. phpunit의 경우는 PHP_TARGETS 를 설정해주어야 한다. gentoo에서 make.conf 파일에 다음과같은 설정을 넣어준다. 물론 사용하는 php 버전에 맞춰주면 된다.
다만 여기서 우리는 gentoo를 사용하는것으로 되어있기때문에 일단은 portage를 이용해서 설치하는 방법으로 진행해보도록 한다. 아래의 패키지들을 설치하도록 한다.
dev-php/Text_Template
dev-php/PHPUnit_MockObject
dev-php/pecl-yaml
dev-php/PHP_CodeCoverage
dev-php/phpunit/phpunit-3.7.19.ebuild
내가 사용하고 있는 php 버전에 맞춘 패키지들을 설치하면 이제 phpunit 을 사용할 준비는 끝난상태로 보면 된다
설치::pear
pear를 사용하기 위해서는 일단 pear를 설치해야한다. 다음의 명령어로 pear를 설치한다. (물론 php는 설치되어 있어야 한다)
$ emerge dev-php/pear
pear는 ruby의 gems 같은 php의 패키지 매니저이다.
pear를 이용해서 phpunit 을 설치하는 방법은 대단히 간단하다.
이 페이지 를 참고하면 간단한 설치법을 발견할 수 있다. 아래와같이 진행하면 된다.
$ pear config-set auto_discover 1
$ pear install pear.phpunit.de/PHPUnit
설치한 phpunit 에 대한 패키지 목록은 다음과같은 명령어로 확인할 수 있다.
$ pear list -a
..........
..........
Installed packages, channel pear.phpunit.de:
============================================
Package Version State
File_Iterator 1.3.3 stable
PHPUnit_MockObject 1.2.3 stable
PHP_CodeCoverage 1.2.9 stable
PHP_Timer 1.0.4 stable
PHP_TokenStream 1.1.5 stable
Text_Template 1.1.4 stable
Installed packages, channel pear.symfony.com:
=============================================
Package Version State
Yaml 2.2.1 stable
..........
..........
pear 를 이용해서 설치한 패키지의 uninstall 은 다음과 같은 과정을 거치면 된다
$ pear uninstall pear.phpunit.de/PHPUnit
위의 예제를 보면 알 수 있듯이 지울때는 channel 이름까지 같이 적어줘야한다.
테스트::gentoo
phpUnit 의 기본적인 테스트방법은 MockObject 를 이용한 테스트를 진행하게 된다. portage를 사용하게되면 다음의 경로에 설치되게 된다.
/usr/share/php/PHPUnit/Framework/MockObject
이를 이용해서 기본 테스트를 진행할 php 코드는 다음과같다.
<?php
require_once '/usr/share/php/PHPUnit/Framework/MockObject/Autoload.php';
class TestTest extends PHPUnit_Framework_TestCase
{
public function testFoobar()
{
}
}
?>
위의 php코드를 파일로 저장하고 console 상에서 다음과 같은 방법으로 테스트를 진행한다
$ phpunit 테스트할 파일이름
테스트를 진행하면 다음과같은 결과를 볼 수 있다.
$ phpunit sample_phpunit.php
PHPUnit 3.7.19 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.25Mb
OK (1 test, 0 assertions)
위와같은 결과를 확인하면 phpunit 이 정상적으로 작동된다고 봐도 된다.
테스트::pear
pear를 사용해서 MockObject 를 설치하는경우는 다음의 경로에 저장되게 된다.
/usr/share/php/PHPUnit
이를 이용해서 기본 테스트를 진행할 php 코드는 다음과같다.
<?php
require_once '/usr/share/php/PHPUnit/Autoload.php';
class TestTest extends PHPUnit_Framework_TestCase
{
public function testFoobar()
{
}
}
?>
위의 php코드를 파일로 저장하고 console 상에서 다음과 같은 방법으로 테스트를 진행한다
$ phpunit 테스트할 파일이름
테스트를 진행하면 다음과같은 결과를 볼 수 있다.
$ phpunit sample_phpunit.php
PHPUnit 3.7.19 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.25Mb
OK (1 test, 0 assertions)
위와같은 결과를 확인하면 phpunit 이 정상적으로 작동된다고 봐도 된다.
PHPUnit 테스트를 위한 bootstrap 작성
PHPUnit 의 test에 있어 보다 많은 부분을 테스트 대상으로 만들기 위해서는 test의 대상이 되는 함수에서 필요한 환경변수나 기본 준비등을 담고있는 파일이 있어야 한다.
그 파일을 bootstrap 이라고 한다.
일단 CodeIgnite 3.0 (beta)버전의 phpunit.xml 파일의 내용을 보도록 하자.
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
bootstrap="./Bootstrap.php"
colors="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false">
<testsuites>
<testsuite name="CodeIgniter Core Test Suite">
<directory suffix="test.php">./codeigniter/core</directory>
<directory suffix="test.php">./codeigniter/helpers</directory>
<directory suffix="test.php">./codeigniter/libraries</directory>
</testsuite>
</testsuites>
<filter>
<blacklist>
<directory suffix=".php">PEAR_INSTALL_DIR</directory>
<directory suffix=".php">PHP_LIBDIR</directory>
<directory suffix=".php">../vendor</directory>
</blacklist>
</filter>
</phpunit>
위의 xml 파일의 내용을 보면 bootstrap="./Bootstrap.php" 이라는 부분이 있다. 그럼 Bootstrap.php 파일의 내용을 가볍게 보도록 하자.
<?php
// Errors on full!
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);
$dir = realpath(dirname(__FILE__));
// Path constants
defined('PROJECT_BASE') OR define('PROJECT_BASE', realpath($dir.'/../').'/');
defined('SYSTEM_PATH') OR define('SYSTEM_PATH', PROJECT_BASE.'system/');
// Get vfsStream either via PEAR or composer
foreach (explode(PATH_SEPARATOR, get_include_path()) as $path)
{
if (file_exists($path.DIRECTORY_SEPARATOR.'vfsStream/vfsStream.php'))
{
require_once 'vfsStream/vfsStream.php';
break;
}
}
if ( ! class_exists('vfsStream') && file_exists(PROJECT_BASE.'vendor/autoload.php'))
{
include_once PROJECT_BASE.'vendor/autoload.php';
class_alias('org\bovigo\vfs\vfsStream', 'vfsStream');
class_alias('org\bovigo\vfs\vfsStreamDirectory', 'vfsStreamDirectory');
class_alias('org\bovigo\vfs\vfsStreamWrapper', 'vfsStreamWrapper');
}
// Define CI path constants to VFS (filesystem setup in CI_TestCase::setUp)
defined('BASEPATH') OR define('BASEPATH', vfsStream::url('system/'));
defined('APPPATH') OR define('APPPATH', vfsStream::url('application/'));
defined('VIEWPATH') OR define('VIEWPATH', APPPATH.'views/');
defined('ENVIRONMENT') OR define('ENVIRONMENT', 'development');
// Set localhost "remote" IP
isset($_SERVER['REMOTE_ADDR']) OR $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
// Prep our test environment
include_once $dir.'/mocks/core/common.php';
include_once SYSTEM_PATH.'core/Common.php';
include_once $dir.'/mocks/autoloader.php';
spl_autoload_register('autoload');
unset($dir);
위와같은 내용이 Bootstrap.php 파일안에 들어있다. 잘보면 개부분이 변수 또는 include 해야하는 내용에 국한되어있다.
bootstrap에서 주의할점은 맨 아래부분이 ?> 기호로 끝나지 않는다는 점에 있다.
bootstrap의 작성에 대한 더 많은 내용은 아래의 주소를 참고하도록 한다.(netbeans와 관련된 얘기기는 하지만.... 어차피 중요한 내용은 그게 아니니)
▶ | http://www.jamesfairhurst.co.uk/posts/view/codeigniter_phpunit_and_netbeans |
참고문서
- PHPUnit 설치 :: http://xinics.tistory.com/entry/PHPUnit-%EC%84%A4%EC%B9%98
- PHPUnit 홈페이지 :: https://github.com/sebastianbergmann/phpunit/
- Selenium 설치 및 사용법 :: http://xinics.tistory.com/entry/Selenium-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95
- Xdebug를 이용한 PHP 디버그 :: http://xinics.tistory.com/72