Artikelformat

PHPUnit – Testklassen automatisch generieren

PHPUnit ist ja ein größeres Thema. Also gibt es jetzt nur einen kleinen Vorgeschmack. Falls sich jemand die Doku angeschaut hat, wird er/sie die Beispiele und die Generierung wiedererkennen und langweilig finden. Ich habe heute diese Funktion aber mal selbst ausprobiert und war ziemlich begeistert, wie toll dies funktioniert.

Eine nervige Arbeit ist immer einen Unittest zu definieren, der eine Methode testet, die mit primitiven Typen umgeht. Man schreibt eigentlich relativ simplen Code und braucht dafür viel Zeit. Das muss aber nicht so sein. PHPUnit kann mir diese Arbeit abnehmen. Ich muss nur ein paar Annotations nutzen, die ich an die entsprechenden Methoden schreibe. Wie passend, dass ich diese im letzten Beitrag bereits erklärt hatte.

Also definiere ich mir erst eine einfache Klasse (Calculations), die eine Methode hat, um 2 Zahlen zu addieren.

1
2
3
4
5
6
class Calculations {
 
    public function add($a, $b) {
        return $a+$b;
    }
}

Nun möchte ich testen, ob diese Methoden auch richtig funktionieren, hierfür ergänze ich die zu prüfende Methode nur um ein paar Assert Infomationen.

1
2
3
4
5
6
7
8
9
10
11
class Calculations {
 
    /**
     * @assert (0, 0) == 0
     * @assert (0, 1) == 1
     * @assert (1, 2) == 3
     */
    public function add($a, $b) {
        return $a+$b;
    }
}

Dann lass ich PHPUnit auf meine Klasse los und erhalte  eine Klasse, die sich CalculationsTest nennt. In dieser Klasse finde ich die einzelnen Tests.

1
$ phpunit --skeleton-test Calculations
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
require_once 'PHPUnit/Framework.php';
require_once 'Calculations.php';
 
/**
 * Test class for Calculations.
 * Generated by PHPUnit on 2010-01-14 at 21:09:11.
 */
class CalculationsTest extends PHPUnit_Framework_TestCase
{
    /**
     * @var Calculations
     */
    protected $object;
 
    /**
     * Sets up the fixture, for example, opens a network connection.
     * This method is called before a test is executed.
     */
    protected function setUp()
    {
        $this->object = new Calculations;
    }
 
    /**
     * Tears down the fixture, for example, closes a network connection.
     * This method is called after a test is executed.
     */
    protected function tearDown()
    {
    }
 
    /**
     * Generated from @assert (0, 0) == 0.
     */
    public function testAdd()
    {
        $this->assertEquals(
          0,
          $this->object->add(0, 0)
        );
    }
 
    /**
     * Generated from @assert (0, 1) == 1.
     */
    public function testAdd2()
    {
        $this->assertEquals(
          1,
          $this->object->add(0, 1)
        );
    }
 
    /**
     * Generated from @assert (1, 2) == 3.
     */
    public function testAdd3()
    {
        $this->assertEquals(
          3,
          $this->object->add(1, 2)
        );
    }
}

Diesen Code kann ich direkt mit PHPUnit ausführen und erhalte ein entsprechendes Testergebnis.

1
2
3
4
5
$ phpunit CalculationsTest.php 
PHPUnit 3.4.1 by Sebastian Bergmann.
...
Time: 0 seconds
OK (3 tests, 3 assertions)

Ich finde diese Lösung sehr schön und muss mich entschuldigen, dass dieser Beitrag so codelastig ist.

5 Kommentare

  1. Jawoll, schöner Beitrag. Ich bin von dieser Funktion auch begeistert.
    Gibt es aber eine Möglichkeit, zuerst Die Testklasse zu schreiben und darauf die effektive Klasse zu generieren so wie mit JUnit?

    Antworten
    • Vielen Dank,

      es geht in der Tat auch aus dem Test eine Klasse generieren zu lassen, hierfür muss man beim phpunit-Aufruf --skeleton-class und die Testklasse nutzen. Es werden hierbei die Klasse und die entsprechenden Methoden angelegt, aber die Parameter muss man selbst hinzufügen. Ich finde die im Beitrag beschriebene Richtung komfortabler.

  2. Guter Beitrag, danke! Das mit den asserts ist sehr praktisch. Ich benutze Netbeans als IDE, die automatische Testklassen-Generierung war ausschlaggebend für diesen Editor. Mit einem Klick auf die entsprechende Klasse wird auch die Testklasse generiert. Die Ausgabe gibts in der IDE. Werd mal testen, obs mit den asserts in Netbeans genauso funktioniert 🙂

    Antworten
    • Ich benutze ebenfalls Netbeans. Die automatische Testgenerierung berücksichtigt bei mir die Asserts nicht. Vielleicht ist das aber auch nur eine Einstellungssache. Mein Test war nur kurz.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.