Unit-Tests

Testen in Webprojekten

Auch Webanwendungen müssen getestet werden

  • Automatisierte Tests wichtig für einen systematischen Test
  • Werkzeuge für
    • Unit-Tests
    • Tests der Oberfläche
    • Performance-Analyse und Profiling

Unit-Tests mit PHPUnit

Für PHP gibt es ein Paket für PHP-Unit-Tests
http://www.phpunit.de

  • Entwickeln von Tests
    • sehr ähnlich zu JUnit
    • Zu jeder zu testenden Klasse wird eine Testklasse geschrieben
    • Testklasse erbt vom Framework
    • Methoden der Klasse werden aufgerufen und Ergebnisse über asserts mit den Sollergebnissen verglichen
  • Durchführung der Tests
    • Aufruf der Tests mit phpunit DATEINAME
    • Bei Abweichungen erfolgt eine Ausgabe auf der Konsole

Beispiel: Klasse

class ComplexNumber {

    private $realAnteil;
    private $imaginaerAnteil;

    public function __construct($realAnteil, $imaginaerAnteil) {
        $this->realAnteil = $realAnteil;
        $this->imaginaerAnteil = $imaginaerAnteil;
    }

    public function add($other) {
        return new ComplexNumber($this->realAnteil + $other->realAnteil,
                $this->imaginaerAnteil + $other->imaginaerAnteil);
    }

    ...
    ...
    public function multiply($other) {
        $r = $this->realAnteil * $other->realAnteil
        - $this->imaginaerAnteil * $other->imaginaerAnteil;
        $i = $this->realAnteil * $other->imaginaerAnteil
        - $this->imaginaerAnteil * $other->realAnteil;
        return new ComplexNumber($r, $i);
    }
}

Beispiel: Testklasse

require_once 'ComplexNumber.php';

class ComplexNumberTest extends PHPUnit_Framework_TestCase {

    public function testAddOfTwoComplexNumbers() {
        $a = new ComplexNumber(4, -5);
        $b = new ComplexNumber(2, 11);

        $this->assertEquals(new ComplexNumber(6, 6), $a->add($b));
    }

    public function testMultiplicationOfTwoComplexNumbers() {
        $a = new ComplexNumber(2, -4);
        $b = new ComplexNumber(-3, 5);
        echo $this->readAttribute($a, 'realAnteil');

        $this->assertEquals(new ComplexNumber(14, 22), $a->multiply($b));
    }
}

Beispiel: Testlauf

> phpunit ComplexNumberTest.php
PHPUnit 3.6.11 by Sebastian Bergmann.
Time: 0 seconds, Memory: 2.50Mb

There was 1 failure:
1) ComplexNumberTest::testMultiply
Failed asserting that two objects are equal.
--- Expected
+++ Actual
@@ @@
 ComplexNumber Object (
     'realAnteil' => 14
-    'imaginaerAnteil' => 22
+    'imaginaerAnteil' => -2
 )
src/ComplexNumberTest.php:21

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

Wichtige assert-Methoden

Methode Aktion
assertTrue($condition) Fehler, falls $condition den Wert FALSE hat.
assertFalse($condition) Fehler, falls $condition den Wert TRUE hat.
assertNull($variable) Fehler, falls $variable nicht den Wert NULL hat.
assertNotNull($variable) Fehler, falls $variable den Wert NULL hat.
assertEquals($exp, $act) Fehler, falls $exp und $act nicht identisch sind.
assertNotEquals($exp, $act) Fehler, falls $exp und $act identisch sind.
assertContains($needle, array $haystack) Fehler, falls $needle nicht in $haystack enthalten ist.
assertNotContains($needle, array $haystack) Fehler, falls $needle in $haystack enthalten ist.

PHPUnit: Hilfsfunktionen

Leere Testklasse automatisch anlegen

  • phpunit-skelgen --test Beispiel.php
    liest Beispiel.php ein und erzeugt BeispielTest.php
  • für jede Methode der Klasse wird ein (leerer) Testfall erzeugt

Zugriff auf private Attribute

  • $this->readAttribute($object, 'attributName'); liefert den Wert des Attributs attributName

Dokumentation von Tests

Namen der Testmethoden werden umformatiert

  • Aus testAddOfTwoComplexNumbers() wird
    „Add of two complex numbers“
  • HTML-Ausgabe
    phpunit --testdox-html ergegnis.html test.php
  • Bildschirm-Ausgabe
    phunit --testdox test.php
> phpunit --testdox ComplexNumberTest.php
PHPUnit 3.6.11 by Sebastian Bergmann.

ComplexNumber
 [x] Add of two complex numbers
 [x] Multiplication of two complex numbers

Copyright © 2025 Thomas Smits