Ankündigung

Einklappen
Keine Ankündigung bisher.

Test und Präsentation für PHP

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Test und Präsentation für PHP

    Hallo,
    ich arbeite schon seit einiger Zeit für Unittests mit einer eigenen kleinen Umgebung auf Basis einer einzigen kleinen PHP-Klasse.
    Nun werden sich viele fragen, warum macht der das, wenn es doch schon gute Frameworks wie PHPUnit gibt?

    Die Schwerpunkte liegen bei mir nicht allein beim Test in der Enwicklungsumgebung.
    Ein Ziel ist es, einen Test mit einer Präsentation von Beispielen zu verbinden.
    Das Testergebnis bzw. die Präsentation wird dafür in einer übersichtlichen Tabelle im Browser dargestellt.
    Der Code für den Test selbst wird dafür mit in der Tabelle gezeigt und dient als Beispiel.

    Die Testklasse fordert nur eine PHP-Version > 5.3.
    Es sind daher für eine Nutzung keine Installationen, Erweiterungen oder sonst was notwendig.
    Der Test bzw. die Präsentation läuft daher auf allen möglichen Plattformen, angefangen bei irgendwelchen Billighostern
    bis hin zu Minicontrollern wie den Rasberry Pi.
    Ein spezieller Test kann so in Sekunden aus der Entwicklungsumgebung auf eine Zielumgebung geschoben werden und dort gestartet werden.

    Als Beispiel hab ich einen aktuellen Test für eine DateTime-Erweiterungsklasse mal auf eine Zielplattform kopiert.

    Bin wie immer an Feedback jeder Art interessiert, sei es Kritik am Konzept oder auch Ideen für Verbesserungen.

    LG jspit

  • #2
    Hi,
    ich nutze einfach mal diesen alten Beitrag um ein wenig Werbung für die Klasse phpcheck zu machen, indem ich einen Test für die Funktion aus diesem Beitrag zeige.
    PHP-Code:
    <?php
    error_reporting
    (-1);
    ini_set('display_errors'1);
    header('Content-Type: text/html; charset=UTF-8');

    require 
    __DIR__ '/../class/phpcheck.php';

    $t = new PHPcheck;

    //Tests
    $t->start('show function');
    function 
    ceilPrecision($value$precision 0) {
       
    $value += 0.5 pow(10,-$precision);
       return 
    round($value ,$precisionPHP_ROUND_HALF_DOWN);
    }  
    $t->checkEqual(function_exists("ceilPrecision"), true);

    $checkData = array(
      
    //array(par1, par2, expected)
      
    array(0.1120.11),
      array(
    0.0120.01),
      array(
    0.00120.01),
      array(
    0.000120.01),
      array(
    0.9920.99),
      array(
    0.99921.),
      array(
    1.21.),
      array(
    0.0110.1),
      array(
    8., -110.),
      array(
    372., -1380.),
    );
    $t->start('functions checks');
    $t->checkMultiple("ceilPrecision",$checkData);

    //Ausgabe 
    echo $t->getHtml();
    Der Test liefert folgende Ausgabe im Browser:

    phpcheck.function.png
    Welche Vorteile bietet dieses Vorgehen gegenüber einem "normalen" eigenen Test's bzw. anderen Testsystemen ?
    1. Das Testobjekt selbst (hier die Funktion ceilPrecision) kann falls nicht zu umfangreich als PHP-Quellcode angezeigt werden.
    2. Alle Test's mit der Funktion werden kompakt per Array $checkData vorgegeben.
    3. Die Ausgabe der Test's erfolgt so, als wären einzelne Aufrufe der Funktion vorgenommen worden. Der Code dient somit auch als Beispiel für einen Funktionsaufruf.
    4. Das Resultat des Test's wird übersichtlich dargestellt, inklusive der benötigten Zeit in Millisekunden.
    5. Für einen Test auf einer anderen Plattform ist neben dem Test selbst nur zusätzlich 1 Datei ( = die Klasse phpcheck.php) auf das Zielsystem zu bringen.
    6. Die Ausgabe des Test's erfolgt grundsätzlich im Browser. Damit ist ein solcher Test auch auf einfachen Host-Systemen , die z.B. nur per FTP gespeist werden können, oder Minisystemen wie dem RasPi verfügbar
    7. Die Rahmenbedingungen des Test's wie PHP-Version etc. werden angezeigt.
    Ich hoffe mit dem Beitrag ein wenig das Interesse an einer Testgetriebenen Entwicklung geweckt zu haben, für die nicht immer ein kompliziertes Framework notwendig ist.

    LG jspit

    Kommentar


    • #3
      Gefällt mir ziemlich gut. Aber macht es nicht Sinn, das vielleicht mit vorhandenen Frameworks zu verbinden um z. B. Mocks zu generieren? Ein kleines Problem, das ich sehe, ist, dass der Quasi-Standard ja PHPUnit ist. Aber vielleicht lässt sich das ja integrieren, so dass man Deine Tests, die dann auf PHPUnit aufbauen, die Resultate ausgeben.

      Kommentar


      • #4
        Sieht interessant aus, was mich jedoch dabei etwas stört:

        - Wenn das Projekt wächst, wie setzt du dies ein? Die Beispiele sehen sehr prozedural aus.
        - Für CI/CD benötige ich ein Testlog im log4j-Format oder ähnlichem, damit dies z.B. mit Teamcity verarbeitet werden kann (Build Failure Conditions, z.B. Anzahl Tests, keine Failures); das ist hier nicht möglich
        - PHPUnit besitzt einen TestRunner, das ist insbesondere bei grösseren Suiten sehr wichtig (also ein kurzer Befehl, alle gefundenen Tests werden ausgeführt); das fehlt hier

        Nicht falsch verstehen, sieht vielversprechend aus und mit einem neuen Projekt kannst du viel besser machen, wo z.B. PHPUnit Schwächen hat. Allerdings muss das ja auch skalieren und nicht nur für kleine Projekte einsetzbar sein, sondern auch in grossen.
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Vielen Dank für das Feedback.
          Ich muß eingestehen die jetzt schon 2 Jahre alten Formulierungen im Startbeitrag in Bezug auf PHPUnit heute etwas anders zu sehen.

          Die kleine Testklasse PHPcheck ist nicht wirklich mit einen Testframework wie PHPunit vergleichbar. Eine solch einfache Testklasse kann und wird nie eine Alternative zu PHPunit sein und sich auch nicht bei PHPunit bedienen.
          PHPcheck verfolgt andere Ziele.

          PHPUnit ist dafür gedacht in der Entwicklungsumgebung zu laufen. Die Tests mit PHPUnit laufen im einfachsten Fall über die Konsole oder vollintegriert in der Entwicklungsumgebung.

          PHPcheck dagegen soll unabhängig von jeglichen Entwicklungsumgebungen, Frameworks und Tools (wie z.B. XDebug, Composer) laufen.
          Voraussetzung für die Nutzung von PHPcheck ist allein ein lauffähiges PHP, ein Webserver und ein Browser welcher die Ergebnisse präsentiert.
          PHPcheck ist auch dafür gedacht Tests auf Produktiv-Servern in einer realen Laufzeitumgebung auszuführen.
          Genau das ist aber nicht Sinn und Zweck von PHPUnit, das wie der Name schon sagt Mudultests unterstüzt, die möglichst isoliert von der Laufzeitumgebung laufen.

          PHPcheck ist dafür gedacht eine große Breite von allen denkbaren Tests (Interaktionstest, Systemtests) zu unterstützen.
          So läuft der Test einer Datenbankklasse in der Regel in Verbindung mit einer realen Datenbank und der Test einer Socketclass mit realen (emulierten) Verbindungen.
          Die Testklasse wurde dafür in den letzten Jahren entsprechend eigener Anforderungen stetig erweitert. So existiert für 95% aller selbst erstellten Klassen ein Test mit PHPcheck.
          Für den Test von Klassen, die HTMLFragmente generieren wie Tabellen und Formularelemente, steht eine spezielle Testmethode zu Verfügung.
          Das generierte HTML wird validiert und das Ergebnis im Browser als HTML ausgegeben, so das eine visuelle Kontrolle des Resultates möglich ist.
          Beispiel Test Tabellenerstellung

          Tests für die Erstellung von Formularelenten werden nicht nur real dargestellt, sondern können vom Tester auch aktiv bedient werden, um das Resultat bei diversen Eingaben überprüfen zu können.
          Beispiel Test Input Select

          Ein Mocken von Objekten wird von der Klasse PHPcheck nicht gesondert unterstützt und muss wo es angebracht ist im Test selbst realisiert werden.
          So hat sich für den Test einer Autoloaderklasse als zweckmäßig erwiesen das Dateisystem durch ein Arraykonstruckt zu simulieren um umfassend testen zu können.
          Beispiel Test Autoloader

          Nicht zuletzt dient PHPcheck auch als Demo für das Verhalten des Testobjektes (Funktion/Klasse) beim Nutzer oder als Präsentation auf einer Webseite.

          Die Zielgruppe der Nutzer für PHPcheck tendiert m.E. auch mehr in Richtung Einsteiger als zu professionellen Programmierern.
          Und richtig erkannt, die Programmierung der Tests mit PHPcheck erfolgt überwiegend prozedural.
          Über die Vorschläge wie Testlogs im log4j-Format bereitzustellen oder eine Gruppe von Tests in einen Rutsch ausführen zu lassen werde ich mal nachdenken.
          Ich selbst bin jedoch noch nicht an den Punkt angelangt wo ich dafür einen Bedarf sehe.

          LG jspit

          Kommentar


          • #6
            Zitat von ChristianK Beitrag anzeigen
            - PHPUnit besitzt einen TestRunner, das ist insbesondere bei grösseren Suiten sehr wichtig (also ein kurzer Befehl, alle gefundenen Tests werden ausgeführt); das fehlt hier
            Das ist m.E. sehr einfach zu machen. phpcheck hat schon eine Methode getTotalInfo(), welche die Zusammenfassung erzeugt. In den Test's ist die letzte Zeile wie folgt zu ändern:
            PHP-Code:
            echo (empty($_GET) ? $t->gethtml() : $t->getTotalInfo()); 
            Dann können mit so einen kleinen Skript alle Test's ausgeführt werden:
            PHP-Code:
            <?php
            //phpcheckall.php
            header('Content-Type: text/html; charset=UTF-8');
            echo 
            "<h2>PHPcheckAll ".date("Y-m-d H:i")."</h2>";
            $files glob("phpcheck.*.php");
            $webPath "http://localhost" dirname($_SERVER["SCRIPT_NAME"]) . "/";
            foreach(
            $files as $check) {
              
            readfile($webPath.$check."?small"); 
            }
            echo 
            "<br>End";
            Ausgabe beispielhaft:
            PHPcheckAll 2018.04.04 11:34

            phpcheck.autoload.abspath.php Total: 16 Tests, 0 Errors
            PHPCheck V1.3.20, OS: Linux, PHP-Version: 5.6.23 (32 Bit), Time: 0.02 s, Memory: 0.2M (64M)
            phpcheck.autoload.php Total: 24 Tests, 0 Errors
            PHPCheck V1.3.20, OS: Linux, PHP-Version: 5.6.23 (32 Bit), Time: 0.04 s, Memory: 0.2M (64M)
            phpcheck.class.arraylib.php Total: 21 Tests, 0 Errors
            PHPCheck V1.3.20, OS: Linux, PHP-Version: 5.6.23 (32 Bit), Time: 0.02 s, Memory: 0.2M (64M)
            phpcheck.class.debug.php Total: 45 Tests, 0 Errors
            PHPCheck V1.3.20, OS: Linux, PHP-Version: 5.6.23 (32 Bit), Time: 0.13 s, Memory: 0.5M (64M)
            phpcheck.class.dt.php Total: 191 Tests, 0 Errors
            PHPCheck V1.3.20, OS: Linux, PHP-Version: 5.6.23 (32 Bit), Time: 1.32 s, Memory: 0.8M (64M)

            End


            Kann noch ausgebaut werden. Dies funktioniert aber erstmal ohne die Klasse erweitern zu müssen.

            Kommentar

            Lädt...
            X