사용자 도구

사이트 도구


wordpress:unit_testing

워드프레스 플러그인 유닛 테스팅

설치 과정

PHPUnit

Ubuntu 패키지로 PHP를 설치하면 PhpUnit 또한 패키지 매니저로 설치하는 것이 편리하다. 참고로 아래 코드는 vagrantwrapper provision 스크립트에 포함되었다.

참고로 아래 WP-CLI에서 요구하는 PHPUnit은 4.8.X 버전을 요구하므로(출처?) 패키지 매니저를 통해 PHPUnit을 설치하는 것은 이 문서를 작성하는 2016년 1월 현재에는 적당하지 않다. 아래 스크립트처럼 직접 PHPUnit 을 받는 것이 적절하다.

wget https://phar.phpunit.de/phpunit-old.phar -O /usr/local/bin/phpunit
chmod +x /usr/local/bin/phpunit

WP-CLI

WP CLI는 앞으로 익혀 두는 것도 좋을 것 같다. 마찬가지로 아래 스크립트 또한 vagrantwrapper에 포함시켰다.

wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -O /usr/local/bin/wp
chmod +x /usr/local/bin/wp

위 과정을 거치면 필요한 패키지는 설치가 완료된다.

다음 내가 평소 사용하는 워드프레스 환경에 맞춰서 WP-CLI가 동작을 하게 하려면 약간의 커스터마이징이 필요하다. 다음 포인트를 꼭 맞추고, WP-CLI config 문서를 참고하도록 한다.

  • CLI에서는 wp-config.php 에서 $_SERVER, $_SERVER['SERVER_NAME'] 항목은 사용할 수 없으므로 이 변수가 없을 경우를 대비한다.
  • 항상 wp-config.php 파일 내부에서 ABSPATH를 define 한다. 정확한 워드프레스 코어 파일을 지정하라.
  • require_once(ABSPATH . 'wp-settings.php'); 구문은 반드시 wp-config.php 에 위치시킨다. WP-CLI는 wp-config.php 파일 내부에서 이 라인을 직접 읽어 처리한다. 이 구문을 찾지 못하면 WP-CLI는 에러를 출력한다. https://github.com/wp-cli/wp-cli/wiki/FAQ 링크의 'PHP Fatal error: Cannot redeclare wp_unregister_GLOBALS()' 부분을 참고.

아래는 ~/.wp-cli/config.yml 의 예제이다.

path: /home/vagrant/shared/php/wordpress/wp-core
url: http://wordpress.vagrant:8080
user: changwoo
disabled_commands:
  - db drop

아래는 wp-config.php 의 예제이다.

<?php
 
if( !isset( $_SERVER ) || !isset( $_SERVER['SERVER_NAME'] ) ) {
	require( __DIR__ . "/wp-settings/wordpress.vagrant-config.php" );
} else {
	$domain = $_SERVER['SERVER_NAME'];
	require( __DIR__ . "/wp-settings/{$domain}-config.php" );
}
 
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/wp-core/');
 
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

기타

나중에 실행될 install-wp-tests.sh는 SVN, cURL을 요구한다.

sudo apt-get install subversion curl

테스트 환경 만들기

WP-CLI를 이용하면 매우 간결하게 테스트 환경을 구비할 수 있다. 아래 명령을 통해 플러그인의 테스트 환경을 시작할 수 있다.

wp scaffold plugin-tests <plugin-name>

플러그인 디렉토리에 가 보면 다음과 같은 디렉토리가 부가적으로 생성된 것을 확인할 수 있다.

  • bin/
    • install-wp-test.sh
  • tests/
    • bootstrap.php
    • test-sample.php
  • phpunit.xml
  • .travis.yml

테스트 환경을 만드는 쉘 스크립트가 bin/install-wp-test.sh로 만들어진 것을 확인할 수 있다. 이 스크립트는 워드프레스 개발 버전 관리 시스템 서버, SVN에서 testing 관련된 소스들을 가져 온다. 예전에는 이것을 수동으로 해 줬었는데 WP-CLI가 지원을 하는 것으로 보인다.

테스트를 위한 DB를 세팅, 설정하는 과정이 필요하다. 다음 명령으로 실행한다.

./install-wp-tests.sh <db-name> <db-user> <db-pass> [db-host] [wp-version]

이 스크립트는 새로운 DB를 생성하기 때문에, db-name은 기존에 사용 중인 데이터베이스를 쓰면 안 된다. 그리고 DB를 생성해야 하므로 db-user, db-pass 항목은 DB를 생성할 권한이 있는 사용자여야 하는 점을 주의한다.

테스트는 플러그인 디렉토리에서 phpunit 명령으로 실행 가능하다. 이 때 플러그인의 메인 파일 이름은 tests/bootstrap.php에서 수정 가능하다.

function _manually_load_plugin() {
	require dirname( dirname( __FILE__ ) ) . '/pluginTestSample.php';
}

워드프레스의 팩토리

워드프레스 플러그인의 테스트는 WP_UnitTestCase 클래스를 확장하여 이뤄진다. 이 클래스는 팩토리 클래스를 제공한다. 이 팩토리 클래스를 이용하면, 워드프레스에서 관리하는 여러 오브젝트를 매우 편리하게 만들 수 있다.

가령 포스트를 만드려면, 다음과 같이 코드를 작성한다.

$post_id = $this->factory->post->create( array( 'post_title' => 'Test Post' );

여러 레코드를 생성하는 것도 가능하다

$post_ids = $this->factory->post->create_many( 10 );

기본적으로 제공하는 팩토리는 다음과 같다.

$this->post = new WP_UnitTest_Factory_For_Post( $this );
$this->attachment = new WP_UnitTest_Factory_For_Attachment( $this );
$this->comment = new WP_UnitTest_Factory_For_Comment( $this );
$this->user = new WP_UnitTest_Factory_For_User( $this );
$this->term = new WP_UnitTest_Factory_For_Term( $this );
$this->category = new WP_UnitTest_Factory_For_Term( $this, 'category' );
$this->tag = new WP_UnitTest_Factory_For_Term( $this, 'post_tag' );
if ( is_multisite() ) {
	$this->blog = new WP_UnitTest_Factory_For_Blog( $this );
	$this->network = new WP_UnitTest_Factory_For_Network( $this );
}

참고 자료

wordpress/unit_testing.txt · 마지막으로 수정됨: 2016/01/28 14:37 저자 changwoo

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki