2009-12-25 14 views
6

würde Ich mag Unit-Test für eine Funktionsbibliothek Datei ausführen ...Test PHP-Funktionen (nicht Klassen) mit Netbeans und PHPUnit

das heißt, ich habe keine Klasse haben, es ist nur eine Datei mit Hilfsfunktionen darin ...

ich zum Beispiel ein pHP-Projekt bei ~/www erstellt haben/test

und eine Datei ~/www/test/lib/format.php

<?php 

function toUpper($text) { 
    return strtoupper($text); 
} 

function toLower($text) { 
    return strtolower($text); 
} 

function toProper($text) { 
    return toUpper(substr($text, 0, 1)) . toLower(substr($text, 1)); 
} 
?> 

Tools -> PHPUnit Tests erstellen gibt mir die fol Muhen Fehler:

PHPUnit 3.4.5 by Sebastian Bergmann.

Could not find class "format" in "/home/sas/www/test/lib/format.php".

jetzt, wenn ich Code (! von Hand) auf die Datei ~/www/Test/Tests/lib/FormatTest.php

<?php 
require_once 'PHPUnit/Framework.php'; 
require_once dirname(__FILE__).'/../../lib/format.php'; 

class FormatTest extends PHPUnit_Framework_TestCase { 

    protected function setUp() {} 

    protected function tearDown() {} 

    public function testToProper() { 
    $this->assertEquals(
      'Sebastian', 
      toProper('sebastian') 
    ); 
    } 
} 
?> 

es funktioniert gut, kann ich laufen es ...

aber wenn ich Testdatei auswählen aus format.php i

Test file for the selected source file was not found

jede Idee?

saludos

sas

ps: eine andere Frage, ist es eine Möglichkeit, generierten Tests zu aktualisieren, ohne sie manuell löschen zu müssen ???

ps2: mit Netbeans 2.8 dev

+0

Können Sie Dateinamen und Pfade für die beiden Dateien geben – Yacoby

+0

sicher, nur die Frage bearbeitet, um diese Info hinzuzufügen ... – opensas

Antwort

5

Wie Sie Ihre Einheit Testfall geschrieben haben, ist 100% richtig. Das Problem liegt in der gemeinsamen Konvention und darauf, wie PHPUnit und Netbeans sich darauf verlassen.

Best Practice in diesen Tagen ist, Ihren gesamten Code in einer objektorientierten Weise zu schreiben. Anstatt eine PHP-Datei voller Utility-Funktionen wie Sie zu haben, wickeln Sie diese Funktionen in eine Klasse und haben sie als statische Funktionen. Hier ist ein Beispiel des Code oben mit,

<?php 

class Format 
{ 
    public static function toUpper($text) 
    { 
     return strtoupper($text); 
    } 

    public static function toLower($text) 
    { 
     return strtolower($text); 
    } 

    public static function toProper($text) 
    { 
     return self::toUpper(substr($text, 0, 1)) . self::toLower(substr($text, 1)); 
    } 
} 

Sie würden jetzt Ihre Funktionen wie so verwenden,

Format::toProper('something'); 

PHPUnit, und Netbeans, hängt von dieser objektorientierten Philosophie. Wenn Sie versuchen, einen PHPUnit-Testfall automatisch zu generieren, sucht PHPUnit in Ihrer Datei nach einer Klasse. Es erstellt dann einen Testfall, der auf dieser Klasse und seiner öffentlichen API basiert, und ruft sie ClassNameTest auf, wobei ClassName der Name der Klasse ist, die getestet wird.

Auch Neatbeans folgt dieser Konvention und weiß, dass ClassNameTest ein PHPUnit-Testfall für ClassName ist, so schafft eine Verbindung zwischen den beiden in der IDE.

Also, mein Rat ist, immer Klassen zu verwenden, wo Sie können. Wenn Sie Utility-Funktionen haben, die von nichts abhängig sind und global verwendet werden, machen Sie sie zu statischen.

Seitennotiz: Ich würde Ihre beiden Funktionen toUpper() und toLower() loswerden.Es besteht keine Notwendigkeit, integrierte PHP-Funktionen zu integrieren, wenn dies nicht notwendig ist. Es gibt auch keine Notwendigkeit, sie zu testen, da sie gründlich getestet werden.

Website Anmerkung 2: ist es ein bisschen eine in PHP entspricht Ihrer Funktion toProper()ucfirst() genannt gebaut.

+1

Diese Tage sind lange vorbei. Ich möchte mein PHP ohne OOP testen. Natürlich könnte ich das mit der Hand machen. Aber ich würde mich lieber auf die Vorteile eines Test-Frameworks verlassen. Ideen zum Schreiben von Unit Tests mit prozeduraler Programmierung im Jahr 2017? –

Verwandte Themen