SimpleTest to narzędzie (framework) do tworzenia i wykonywania testów jednostkowych oprogramowania pisanego w języku PHP. SimpleTest bazuje na narzędziu JUnit przeznaczonym dla programów napisanych w języku Java. Pakiet SimpleTest jest dostępny pod adresem http://www.simpletest.sourceforge.net. Zawiera zestaw klas umożliwiających testowanie modułów oraz dodatkowe narzędzia, które potrafią między innymi wypełniać formularze i klikać odnośniki.

Instalacja

edytuj

Instalacja pakietu polega na pobraniu archiwum z Internetu i rozpakowaniu go. Najnowszą wersję pakietu można pobrać ze strony http://www.sourceforge.net/projects/simpletest

Przypadek testowy

edytuj

W celu zaprezentowania działania przypadków testowych przetestowany zostanie prosty kalkulator dodający dwie liczby. Kod kalkulatora wygląda następująco:

<?php
// ==============================================
// calc.php
// ==============================================
// Kalkulator umożliwiajacy dodawanie dwóch liczb
// ==============================================
class Calc
{
  public function add($a, $b)
  {
    return $a + $b;
  }
}
?>

Przypadek testowy tworzony jest poprzez utworzenie klasy dziedziczącej po klasie UnitTestCase(klasa znajduje się w pliku unit_tester.php).

class FirstTestCase extends UnitTestCase
{
  // Konstruktor nadający nazwę klasie nadrzędnej
  public function __construct()
  {
    parent::__construct('Pierwszy przypadek testowy');
  }
}
?>

Aby do tak utworzonej klasy dodać poszczególne testy należy dopisać funkcje, których nazwa rozpoczyna się od słowa test. W momencie uruchomienia testów wykonane zostaną wszystkie takie funkcje. Wewnątrz funkcji testujących wykorzystywane są metody, które umożliwiają sprawdzenie poprawności wykonania poszczególnych działań. Jedna z tych metod to assertEqual. Metoda ta sprawdza czy wartość zwracana przez funkcję wywołaną z określonym zestawem parametrów jest równa danej wartości. Przykład funkcji testującej wykorzystującej metodę assertEqual może wyglądać następująco:

public function testDodawanie()
{
  $calc = new Calc();
  $this->assertEqual($calc->add(2,2),4);
  $this->assertEqual($calc->add(1,4),5);
  $this->assertEqual($calc->add(3,0),3);
  $this->assertEqual($calc->add(0,2),2);
  $this->assertEqual($calc->add(0,0),0);
  // ... itd ...
  // tu powinny znaleźć się kolejne testy, np. testujące działanie dla liczb ujemnych
}

SimpleTest udostępnia wiele innych metod (poza assertEqual), które umożliwiają sprawdzenie poprawności wykonania operacji w różny sposób. Metody te zostaną szczegółowo opisane w dalszej części.

Ostatnia czynność jaką należy wykonać to tworzenie obiektu klasy FirstTestCase oraz wywołanie metody run() rozpoczynającej wykonywanie testów. Jako argument metody run() należy przekazać obiekt klasy HtmlReporter odpowiedzialny za wyświetlenie wyników testów w oknie przeglądarki (innym rozwiązaniem może być przekazanie obiektu klasy TextReporter, która pozwala na zapis wyników testów do pliku).

Kompletny kod znajdujący się w pliku test_case.php wygląda następująco:

<?php
// ==============================================
// test_case.php
// ==============================================
// Przypadek testowy (UnitTestCase)
// ==============================================
 
require_once('calc.php'); 
require_once('simpletest/unit_tester.php'); 
require_once('simpletest/reporter.php'); 
 
class FirstTestCase extends UnitTestCase
{
  // Konstruktor nadający nazwę klasie nadrzędnej
  public function __construct()
  {
    parent::__construct('Pierwszy przypadek testowy');
  }
  
  public function testDodawanie()
  {
    $calc = new Calc();  
    $this->assertEqual($calc->add(2,2),4);
    $this->assertEqual($calc->add(1,4),5);
    $this->assertEqual($calc->add(3,0),3);
    $this->assertEqual($calc->add(0,2),2);
    $this->assertEqual($calc->add(0,0),1);
    // ... itd ...
    // tu powinny znaleźć się kolejne testy, np. testujące działanie dla liczb ujemnych
  } 
}
  
// utworzenie obiektu klasy FirstTestCase
$tc = new FirstTestCase();
// uruchomienie testów
$tc->run(new HtmlReporter()); 
?>

Po uruchomieniu tego pliku w przeglądarce powinien wyświetlić się komunikat informujący o liczbie testów zakończonych sukcesem:

Pierwszy przypadek testowy
1/1 test cases complete: 5 passes, 0 fails and 0 exceptions.

Grupy testów (GroupTest)

edytuj

Poszczególne przypadki testowe mogą zostać połączone w grupy (zestawy) testów za pomocą klasy GroupTest. Umożliwia to szybkie i wygodne wykonanie wielu testów. Kolejne testy dołączane są do grupy za pomocą funkcji addTestCase. Wykonanie testów (podobnie jak poprzednio) rozpoczyna się poprzez wywołanie metody run().

Przykładowy zestaw testów oraz jego wywołanie może wyglądać następująco:

// utworzenie grupy testów
$gt = new GroupTest('Zestaw testow');
// dodanie przypadków testowych do zestawu
$gt->addTestCase(new FirstTestCase());
$gt->addTestCase(new SecondTestCase());
$gt->addTestCase(new AnotherTestCase());
// ... itd ...
// tu mogą się znaleźć kolejne przypadki testowe

//uruchomienie testów
$gt->run(new HtmlReporter());

Metody assert...()

edytuj

Klasa UnitTestCase dostarcza zestaw metod umożliwiających sprawdzenie poprawności wykonania funkcji testujących. Każda z wymienionych poniżej metod, poza wymaganymi parametrami, może przyjmować dodatkowy, opcjonalny parametr. Jest to komunikat, który zostanie wyświetlony jeśli test się nie powiedzie. Jeśli nie zostanie podany, wyświetlony zostanie standardowy komunikat o błędzie.

assertTrue() i assertFalse()

edytuj

Metody sprawdzają, czy wartość logiczna wyrażenia jest równa true lub false, np.

// funkcja sprawdzająca czy przekazana liczba jest dodatnia
function positive($l)
{
  return $l>0;
}

// funkcja testująca wykorzystująca assertTrue() i assertFalse()
public function testPositive()
{
  $this->assertTrue($this->calc->positive(1));
  $this->assertFalse($this->calc->positive(0),"Error 0");
  $this->assertFalse($this->calc->positive(-1));
}

assertNull() i assertNotNull()

edytuj

Metody sprawdzają, czy wyrażenie ma określoną wartość, czy jest ona równa null, np.

$x = null;
// sprawdzenie czy $x jest równe null
$this->assertNull($x);
$x = 0;
// sprawdzenie czy $x posiada określoną wartość (różną od null)
$this->assertNotNull($x);