Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Środowisko testowe PEAR::PHPUnit()

Tutorial

Krótkie wprowadzenie do schematu testu

PHPUnit oferuje Ci nieskomplikowany schemat do tworzenia aplikacji testowej pozwalającej zautomatyzować proces testowania funkcji i klas. PHPUnit zainspirowany został przez JUnit. Kent Beck i Erich Gamma stworzyli JUnit jako narzędzie dla eXtreme Programming (XP). Jedną z części XP jest testowanie małych fragmentów oprogramowania tak często i w tak wczesnym stadium projektowania, jak tylko jest to możliwe, dlatego, aby uniknąć konieczności usuwania błędów w API podczas instalowania i testowania całej aplikacji. Nie musisz przełączać się na XP, by czerpać z dobrodziejstw PHPUnit. Jest to świetne narzędzie do testowania klas i grup funkcji i pomoże Ci ono uniknąć niekończących się sesji debugowania.

Procedura pracy

Normalnie napisałbyś klasę, zrobił kilka niesystematycznych testów używając echo() lub var_dump(). Następnie używasz w swojej aplikacji daną klasę i masz nadzieję, że wszystko będzie OK. Aby odnieść korzyści z używania PHPUnit powinieneś przemyśleć algorytm pracy.

Najlepiej zrobisz, wykonując te czynności:

  1. Zaprojektuj swoją klasę / API
  2. Stwórz ciąg testów
  3. Zaimplementuj klasę / API
  4. Uruchom testy
  5. Wprowadź poprawki i usuń błędy i wróć do punktu 4

Może się wydawać, że wymaga to mnóstwa czasu, ale to mylne wrażenie. Na stworzenie ciągu testów przy użyciu PHPUnit potrzebujesz tylko kilku minut, a na ich uruchomienie - jedynie sekund.

Projektowanie klasy

Zacznijmy od prostego przykładu: klasa operująca na stringach. Najpierw tworzymy zestaw deklaracji funkcji do operowania na stringach:

<?php
/*
 string.php
*/
class String
{
 //zawiera dane wewnętrzne
 var $data;
 // konstruktor
 function String($data)
 {
 $this->data = $data;
 }
 // tworzy głęboką kopię obiektu
 function copy()
 {
 }
 // dodaje kolejny obiekt string do tej klasy
 function add($string)
 {
 }
 // zwraca sformatuwany string
 function toString($format)
 {
 }
}
?>

Tworzenie ciągu testów

Teraz możemy utworzyć ciąg testów, który sprawdza każdą funkcję Twojej klasy. Ciąg testów jest zwykłą klasą PHP dziedzicząca po PHPUnit_TestCase, zawierającą funkcje testujące, rozpoznane przez początkowe słowo "test" w nazwie funkcji. W funkcji testującej wartość oczekiwana musi być porównana z wynikiem sprawdzanej funkcji. Wynik tego porównania musi zostać przekazany do funkcji z rodziny assert*(), która decyduje, czy funkcja spełnia swoją rolę, czy tez nie.

<?php
/*
 testcase.php
*/

require_once 'string.php';
require_once 'PHPUnit.php';

class StringTest extends PHPUnit_TestCase
{
 // zawiera obiekt obsługujący klasę
 var $abc;

 // konstruktor ciągu testów
 function StringTest($name) {
 $this->PHPUnit_TestCase($name);
 }

 // wywołanie zanim funkcje testujące zostaną wykonane
 // ta funkcja zdefiniowana jest w PHPUnit_TestCase i nadpisana
 // tutaj
 function setUp() {
 // stwórz nowa instancję String z
 // ciągiem znaków 'abc'
 $this->abc = new String("abc");
 }

 // wywołane po wykonaniu funkcji testujących
 // ta funkcja zdefiniowana jest w PHPUnit_TestCase i nadpisana
 // tutaj
 function tearDown() {
 // usuń swoją instancję
 unset($this->abc);
 }

 // przetestuj funkcję toString
 function testToString() {
 $result = $this->abc->toString('contains %s');
 $expected = 'contains abc';
 $this->assertTrue($result == $expected);
 }

 // przetestuj funkcję copy
 function testCopy() {
 $abc2 = $this->abc->copy();
 $this->assertEquals($abc2, $this->abc);
 }

 // przetestuj funkcję add
 function testAdd() {
 $abc2 = new String('123');
 $this->abc->add($abc2);
 $result = $this->abc->toString("%s");
 $expected = "abc123";
 $this->assertTrue($result == $expected);
 }
 }
?>

Pierwsze uruchomienie testu

teraz możemy uruchomić pierwszy test. Wykonaj poniższy program. Upewnij się, ze ścieżki są prawidłowe.

<?php

require_once 'testcase.php';
require_once 'PHPUnit.php';

$suite = new PHPUnit_TestSuite("StringTest");
$result = PHPUnit::run($suite);

echo $result -> toString();
?>

Jeśli uruchamiasz ten skrypt poprzez linię poleceń, otrzymasz ten wynik:

?adna z funkcji nie zdaje testu, ponieważ funkcje nie zwróciły tego, co określiliśmy jako wartość oczekiwaną.

Jeśli chcesz wywołać ten skrypt poprzez przeglądarkę, powinieneś umieścić go w poprawnej stronie html, i wywołać poprzez $result->toHTML() zamiast $result->toString().

Implementacja

OK, zacznijmy pisać naszą klasę:

<?php
/*
 string.php
*/
class String
{
 //zawiera dane wewnętrzne
 var $data;

 // konstruktor
 function String($data) {
 $this->data = $data;
 }

 // tworzy głęboką kopię obiektu
 function copy() {
 $ret = new String($this->data);
 return $ret;
 }

 // dodaje kolejny obiekt string do tej klasy
 function add($string) {
 $this->data = $this->data.$string->toString("%ss");
 }

 // zwraca sformatuwany string
 function toString($format) {
 $ret = sprintf($format, $this->data);
 return $ret;
 }
}
?>

Programowanie zakończone, uruchamiamy ponownie test:

Ups, ostatni test oblany. Zrobiliśmy literówkę. Zmień linię 21 w string.php na:

$this->data = $this->data.$string->toString("%s");

I uruchom test ponownie:

teraz wszystko w porządku :)

Podsumowanie

Hmm, tyle wysiłków dla przetestowania trzech prostych funkcji? Nie zapomnij, że to drobny przykład. Pomyśl o bardziej skomplikowanych API jak np. obsługa bazy danych, koszyk sklepowy itp. PHPUnit to znakomite narzędzie do wykrywania błędów przy implementacji. Być może masz dużą klasę używaną w kilku aplikacjach i chcesz ją ponownie zaimplementować. Przy pomocy ciągu testów z łatwością sprawdzisz i poprawisz nowe funkcjonalności w krótkim czasie.

« API
Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (0)
Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2022 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System