16 09 10 Testowanie kodu wtyczki Wordpresa z SimpleTest
Nikt nie ma chyba watpliwości co do tego, że testowanie kodu PHP, także w Wordpresie, to kluczowa sprawa dla jego stabilności. W niniejszym wpisie przedstawię jak wykorzystać SimpleTest do testowania klas i funkcji wtyczki Wordpresa w tym systemie zarządzania treścią.
Nieniejszy wpis zakłąda co najmniej podstawową znajomość języka programowania PHP.
Ponieważ większość czasu przeznaczonego na zabawy z językami programowania spędzam na grzebaniu w kodzie napisanym w Ruby, przyzwyczaiłem się do kodowania z wykorzystaniem testów. W przypadku dynamicznych jezyków programowania, jest to nieoceniona pomoc. Z testów korzystam również kodując w PHP. W przypadku frameworków CodeIgniter, Zend Framework czy Yii testowanie można wykonać przy pomocy phpUnit, z systemami zarządzania treścią bywa różnie, co odnosi się niestety także do Wordpresa.
Dziś poświęciłem kilka minut na to aby przyjrzeć się czy i jak można testować kod plugina w Wordpresie. Już na początku dałem sobie spokój z phpUnit skupiając się na SimpleTest. Ten drugi framework jest znacznie mniej skomplikowany a przy tym wyniki testów łatwo można podejrzeć w przeglądarce. Osobiście preferuję linię poleceń, jednakże w przypadku Wordpresa, który bardzo polega na standardowych zmiennych przekazywanych przez serwer, sprawa jest łatwiejsza do przeprowadzenia z użyciem przeglądarki.
Technicznie rzecz biorąc, podłączenie SimpleTest do Wordpresa nie jest specjalnie skomplikowane. Należy ściągnąć frameworka, rozpakować go a następnie wrzucić katalog simpletest do głównego katalogu plugina ( normalnie powinien znaleźć się gdzieś w katalogu z testami, ale aby nie komplikować sprawy zostawiłem go tu gdzie napisałem ). W dalszej części konieczne jest stworzenie katalogu na biblioteki i / lub funkcje wtyczki ( w przykładzie poniżej ma on nazwę lib ) oraz testy ( w moim przypadku nazywa sie on test ) Oba katalogi znajdują się w głównym katalogu wtyczki.
Cały kod wtyczki powinien być umieszczony w katalogu. W głównym katalogu wtyczki powinien znajdować się plik PHP o nazwie jak katalog oraz zawierać typowe dla niego meta dane, które umożliwią jego rozpoznanie przez Wordpresa.
Aby SimpleTest mógł zadziałać pod Wordpresem, konieczna jest minimalna modyfikacja jednege z jego plików źródłowych. Mowa o funkcji initial_file pliku autorun.php, który znajduje się w katalogu simpletest. Zmodyfikowana funkcja powinna wyglądać jak następuje:
function initial_file() {
static $file = false;
if (! $file) {
$file = reset(get_included_files());
}
// return $file;
$plugin_name = str_replace( '/simpletest', '' , dirname( preg_replace('/^.*\/plugins\//','',__FILE__) ) );
return dirname(__FILE__).'/../' .$plugin_name.'.php';
}
W katalogu lib należy umieścić kod, która ma być testowany. W moim przypadku plik z ów kodem ma nazwę sampleClass.php i wygląda jak następuje:
class SampleClass{
function __construct($config){
$this -> db = $config['db'];
}
function count_posts(){
$sql = "select count(*) from {$this -> db -> posts} where post_type = 'post'";
return $this -> db -> get_var($sql);
}
function is_upload_base_dir_writable($wp_upload_dir){
if(!is_dir($wp_upload_dir['baseurl'])){
return false;
}
return is_writeable($upload_dir['baseurl']) ? true : false;
}
}
W klasie powyżej znajduje się kilka przykładowych metod, które zostaną poddane testom.
Testy dla klasy przedstawionej powyżej są zapisane w pliku testSampleClass.php, którego kod wygląda jak nastepuje:
include_once(dirname(__FILE__).'/../lib/sampleClass.php');
class sampleClassTest extends UnitTestCase {
function __construct(){
global $wpdb;
$this -> sc = new SampleClass(array('db' => $wpdb));
}
function test_sanity() {
$this->assertTrue(true);
}
function test_is_page(){
$this -> assertTrue(is_page());
}
function test_count_posts(){
$this -> assertTrue( intval($this -> sc -> count_posts()) > 0);
}
function test_is_upload_dir_writeable(){
$this -> sc -> is_upload_base_dir_writable(wp_upload_dir());
}
}
Generalnie rzecz biorąc, do pliku testów włączyłem plik z klasą, która ma być testowana, utworzyłem jej instację i napisałem kilka przykładowych testów dla SimpleTestu.
Tak przygotowane testy można podłączyć do wtyczki. W moim przypadku kod uruchamiający testy znajduje się w głównym jej pliku ( plik ma nazwę w_tested_plugin.php i znajduje się w katalogu sw_tested_plugin ).
function load_my_tests(){
if(is_page('tests')){
include_once(WP_PLUGIN_DIR.'/sw_tested_plugin/simpletest/autorun.php');
class AllTests extends TestSuite {
function __construct() {
$this->TestSuite('Plugin tests');
$this->addFile(WP_PLUGIN_DIR.'/sw_tested_plugin/test/testSampleClass.php');
}
}
}
}
add_action('load_my_tests','load_my_tests');
Kilka słów objaśnienia. Kod powyżej jest uruchamiany za pomocą akcji load_my_tests na stronie o tytule "tests".
Wszystko dzieje się w funkcji o tej samej nazwie co akcja. Oprócz włączenia pliku simpletest/autorun.php, została dodana nowa nowa grupa testów o nazwie "Plugin tests" oraz określony plik, gdzie znajdują się testy ( nowe pliki z testami dodatej się do grupty przy pomocy metody add_file ).
Technicznie rzecz biorąc, aby uruchomić zestaw testów we frameworku SimpleTest należy rozszerzyć klasę TestSuite, dodać nowy zestaw testów i sprecyzować które pliki mają być testowane.
W tym momencie pozostaje stworzyć stronę o tytule tests, i szablon dla niej. W moim przypadku szablon ma nazwę tester.php i znajduje się w głównym katalogu aktywnego motywu. Kod szblonu wygląda jak następuje:
<?php
/*
Template Name: Tester
*/
?>
<?php do_action('load_my_tests') ?>
Po utworzniu nowej strony i przyporządkowaniu jej szablonu o nazwie Tester w panelu administracyjnym należy jeszcze włączyć testowany plugina w zakładce Pluginów. Teraz można już przejść na właśnie utworzoną stronę i przyjrzeć sie wynikom testów.
Po rozszerzeniu klasy lib/sampleClass.php o nowe funkcje należy dopisać dla nich testy ( w pliku test/testSampleClass.php ).
Nowe wyniki testów powinny być dostępne po odświeżeniu strony w przeglądarce.
Po napisaniu całego kodu wtyczki, akcję uruchamiającą testy można usunąć lub zakomentować ( katalogi simpltest i test można usunąć lub zostawić do testów w środowisku gdzie plugin ma być uruchomiony ).
Podłączenie frameworka SimpleTest w sposób jak przedstawiłem w powyższym przykładzie daje możliwość użycia funkcji oraz klas Wordpresa i testowania kodu pod tym systemem zarządzani treścią w przeglądarce. Jest to tylko przykład, jednkaże rozwiązanie, gdy dopracowane mogłoby stać się użytecznym i chyba dość popularnym pluginem.
Framework SimplTest jest do ściągnięcia z Sourceforge
Dokumntację do i przykłady użycia dla SimpleTest można znaleźć na tej stronie.
Autor wpisu jest blogerem, programistą PHP, administratorem Linux oraz twórcą blogów
RSS Subskrybuj wpisy bloga