Frage

Wie verbreitet, unterstützt und entwickelt ist das Testen in der PHP-Welt?Auf Augenhöhe mit Java?Da oben mit Ruby/Rails?Ich habe gegoogelt und festgestellt, dass es Test-Frameworks gibt, frage mich aber, ob sie weit verbreitet sind.

Verfügen die großen PHP-IDEs über integrierte Testläufer, wie es die Java-Tools von Eclipse oder die Ruby/Rails-Tools von NetBeans tun?Sind Tests wie bei Rails in die MVC-Frameworks von PHP integriert?

Ich frage, weil eine Gruppe, in der ich arbeite, jemanden einstellen möchte, der eine PHP-App für sie entwickelt.Ich mache mir Sorgen um Qualität und Wartung, da ich möglicherweise aufgefordert werde, diese Sache zu unterstützen.

War es hilfreich?

Lösung

Es sind mindestens zwei ausgereifte, eigenständige Testsuiten im JUnit-Stil mit dem Namen verfügbar PHPUnit Und SimpleTest, jeweils.

Was die MVC-Frameworks betrifft, verfügt Symfony über ein eigenes Test-Framework mit dem Namen Kalk, Code Igniter hat eine Gerätetest Bibliothek und CakePHP stützt sich auf den oben genannten SimpleTest.

Ich weiß, dass Zend Studio über eine integrierte Unterstützung für PHPUnit-Tests verfügt und sowohl PHPUnit als auch SimpleTest über Befehlszeilen-Runner verfügen, sodass eine Integration in jeden Workflow möglich ist.

Die Tools sind in der PHP-Welt vorhanden, wenn ein Entwickler sie nutzen möchte, und Smart Shops nutzen sie auch.

Die Vorbehalte sind bei PHP-Beschwerden selbstverständlich.Es gibt zwei PHP-Communitys;PHP als Plattform zum Erstellen von Software und PHP als Möglichkeit zur Interaktion mit einem Webserver, einem Webbrowser und einer Datenbank, um anwendungsähnliche Dinge im Web zu erstellen.Es ist weniger eine Schwarz-Weiß-Sache, sondern eher ein Kontinuum;Unter anderem werden Unit-Tests und TDD genauso häufig auf der Seite der Softwareentwickler unterstützt und verwendet wie auf jeder anderen Plattform.Unter den Leuten, die „einen Haufen Zeug zusammenschustern, das ich nicht verstehe, aber trotzdem Ergebnisse bekomme“, ist das noch nie vorgekommen.

Es gibt eine Menge veralteten PHP-Code, der nicht zum Framework bzw. benutzerdefinierten Framework gehört und für den es schwierig ist, eine brauchbare Testumgebung zu erhalten.PHP eignet sich auch leicht für Muster, deren Ausführung auf der Existenz einer Browserumgebung beruht.Ich habe außer meinen eigenen Beobachtungen keine Beweise dafür, aber viele PHP-Shops, denen das Testen am Herzen liegt, verlassen sich am Ende auf Akzeptanztests (d. h.Selenium) als Ersatz für tatsächliche Unit-Tests, Test-First usw.Entwicklung.

Befragen Sie in Ihrer spezifischen Situation den Entwickler, den Ihre Gruppe einstellen möchte, ausgiebig.

  1. Fragen Sie sie, welches Unit-Testing-Framework sie verwenden

  2. Bitten Sie sie, in allgemeinen Worten ein Beispiel aus der Praxis zu beschreiben, in dem sie eine neue Funktion und die dazugehörigen Tests entwickelt haben

  3. Bitten Sie sie, in allgemeinen Worten ein reales Beispiel für einen Fall zu beschreiben, in dem ihre Tests fehlgeschlagen sind, und was sie getan haben, um die Situation zu lösen

Sie sind weniger an der konkreten Situation interessiert, die sie beschreiben werden, als vielmehr daran, wie angenehm es ihnen fällt, ihr Wissen über Codetests im Allgemeinen zu diskutieren.

Andere Tipps

Jedes Mal, wenn ich ein Projekt TDD mit XUnit Stil Tool, ich habe Schwierigkeiten, meinen Kopf an der richtigen Stelle. Ich finde, dass die Verwendung entwickelt Werkzeuge für Behavior Driven Development oder „ Spezifikation mit gutem Beispiel “ macht es einfacher für mich zu < a href = "http://gojko.net/2010/12/02/the-principle-of-symmetric-change/" rel = "noreferrer"> do TDD rechts - dh Fokus auf Design, Belichten Absicht und beschreiben Verhalten in bestimmten Kontexten . nicht Testen.

Das heißt, würde Ich mag Pecs ins Gespräch bringen. Von der Readme-Datei auf der Website des Projektes.

  

Pecs ist eine winzige Verhalten-Driven Development-Bibliothek für PHP 5.3, a la RSpec oder JSpec.

Wenn Sie noch verwendet JSpec oder besser noch, Jasmin-BDD (für JavaScript), um den Pecs Stil Verhalten beschreiben sollte eigentlich vertraut sein. Ich finde diese Art groß für Komponentenebene Spezifikationen. Wenn Sie suchen ein PHP-Tool für Feature-Level-Spezifikationen (Geschichten oder Tests Benutzerakzeptanz) betrachten Behat .

Gehen wir zurück zu Pecs, hier ist ein Beispiel aus dem Pecs Projektstandort gekeult:

describe("Bowling", function() {
  it("should score 0 for a gutter game", function() {
    $bowling = new Bowling();
    for ($i=0; $i < 20; $i++) {
      $bowling->hit(0);
    }
    expect($bowling->score)->to_equal(0);
  });
});

Ja, das ist eine PHP-spec. Blick durch die Pecs Quelle, sieht es aus wie der Autor dieses abziehen in der Lage, durch die neuen Hotness in PHP nutzen 5.3+, Lambdas und Verschlüssen. Also ich denke, das bedeutet, dass Sie nicht Pecs in jedem Projekt auf Basis von PHP verwenden können <5.3 (nur FYI).

Auch Pecs ist nicht so ausgereift wie PHPUnit oder Simple. Aber ich denke, die Befürworter von BDD in der PHP-Community sollte das Wachstum von Tools wie Pecs unterstützen, die „Specification Beispiel vorangehen“ oder BDD ohne die Verwirrung fördern, indem die Verwendung Vermächtnis XUnit Test-Tools gebracht.

In diesen Tagen ich mehr in Python arbeiten als PHP. Allerdings habe ich das nächste Mal ein PHP-Projekt holen, werde ich sehr glücklich sein, wenn ich eine reife, Gemeinschaft unterstützt Tool wie Pecs die Spezifikationen für die Software herstellt.

Ich habe eine erstaunliche Erfahrung mit Behat / Mink http://behat.org

hatte

Ich stimme mit anderen als eine Einheit Testplattform PHP ist kein Spaß oder Erfahrung BDD ist der beste Weg zu gehen, wenn Sie einen PHP-Framework verwenden

Verpackung meinen Kopf um Komponist als Repo-Build-Tool war der größte Stolperstein, aber wir konnten Behat Mink Selen WebDriver Standalone-Server Glas als eine erstaunliche Design und Regressionstests Tool verwenden. Wir nutzten unsere Regressions Suite gegen unsere CakePHP-Anwendung auf einem Jenkins Server laufen, aber es erwies sich als nicht so sehr „schnell fail“ genug

Jetzt ist unser Workflow geht so: Erstellen Sie Geschichte in gherkin verfeinern Geschichte schreiben Feature und Stub alle neuen Schritt defs Codierung PHP-Lösung beginnen zu testen Dann am Ende haben wir ein Arbeits Feature oder Bug-Fix mit einem BDD Test bedeckenden

Wir richten ein Ubuntu VM mit einem Behat Setup arbeiten und kopierte es zu jedem Arbeitsplatz. Wir gebacken es in unserem Prozess. Wir ziehen nur auf Änderungen laufen Tests dann neue Sachen beginnen Codierung.

Wir schrieben Skript eine Shell automatisch ausgeführt mysql-Dumps und laden sie vor jeder Funktion, die eine Brise Refaktorierungscode gemacht hat.

Die Mink WebAssert Klasse gibt Ihnen alle Behauptungen, die Sie Verhalten bestätigen müssen Die regulären Sitzung / CommonContext Klassen sind für CSS oder XPath.

Ich habe Capybara / WebDriver mit Java verwendet und Rails-Projekten vor und fand der Setup-Overhead / Lernkurve zu hoch ist im Vergleich zu Behat.

Neben den Bibliotheken / Frameworks, die a href <= "https://stackoverflow.com/questions/530712/whats-the-state-of-tdd-and-or-bdd-in-php/530886# 530886" > Alan bereits erwähnt, können Sie die Verwendung von mod_perl Apache :: Test machen, die ich, was ich als ein Geschirr verwenden. Es ermöglicht ich sehr einfach Tests in meinen Freigabeprozess zu integrieren. Das Geschirr verwendet TAP Ausgang (Test Anything Protocol), um zu bestimmen, ob die Tests bestanden oder nicht bestanden unter Verwendung von Bibliotheken wie Test :: Einfache oder Test :: Mehr ( Perl und < a href = "http://shiflett.org/code/test-more.php" rel = "nofollow noreferrer"> PHP ).

Aus dem Kasten Apache :: Test unterstützt das Schreiben von Tests sowohl in Perl und PHP. In meinen eigenen Projekten, dauerte es ein wenig bisschen tricksen und viel rel="nofollow von Lesen bekommen es wirklich funktioniert, aber eine Implementierung von Test :: More in PHP ist eingebaut in das Gurtzeug. Läuft alle Tests sowohl in PHP geschrieben und Perl wird durch einen einzigen Befehl und jeder Fehler auf dem Weg getan wird Apache gefangen :: Test, unter Hinweis darauf, wie gut es kann, was falsch gelaufen ist.

Das ehrfürchtige Teil über all dies ist, dass Sie auch PHPUnit nutzen können, oder einfachen Test neben dem beide vorangegangenen Test-Frameworks. Durch die Tests in der jeweiligen Bibliothek ausgeführt wird, können Sie die PHP-Implementierung von Test verwenden :: Mehr (oder sogar Perl durch Tests stdout) und wieder aus TAP für Gurtzeug spucken zu interpretieren.

Seien Sie sicher, dass die Apache lesen :: Test Dokumentation und die mod_perl Anleitung zum laufen Apache :: Test . Außerdem fand ich den Artikel hier eine große Hilfe.

Als schnelles Beispiel könnten Sie Setup einen Test in Perl in sehr wenige Codezeilen, die durch alle Seiten auf Ihrer Website ausgeführt wird (die Links haben), und überprüfen Sie alle Ergebnisse in '200 OK Antworten und nicht haben alle Parsing-Fehler:

#!perl

use strict;
use warnings;

use Apache::Test qw(:withtestmore);
use Apache::TestRequest;
use Test::More;
use Test::WWW::Mechanize;
use WWW::CheckSite::Validator;
use WWW::CheckSite::Spider;

plan 'no_plan';

my $config = Apache::Test::config();
my $host = "http://". Apache::TestRequest::hostport($config) || '';

my $s = WWW::CheckSite::Spider->new(
    uri => $host,
    ua_class => 'Test::WWW::Mechanize',
);
my $m = $s->current_agent;

while (my $page = $s->get_page) {
    is($m->status(), "200", $m->uri() ." retrieved successfully.");
    $m->content_lacks("Parse Error", $m->uri() ." does not contain syntax errors.");
}

In einem letzten Projekt habe ich die PHPUnit verwendet, und es hat mich will verlassen. PHPUnit + Kommandozeile der Tests, machte es so, dass zu viel Zeit Codierung der Tests ausgegeben wurde, nicht schnell genug war, und schien wirklich den Stil des Codes in einer Art und Weise zu beschränken, die Ich mag nicht (Objekte zu testen waren leichter, so schien es irgendwie favorisieren Objekte).

Selen war eine Lösung, die wir darüber gesprochen, aber nie um ins Spiel zu bekommen, und ich glaube, wir würden wirklich von dieser Art von Ausgabe-Level-Tests profitiert haben.

Auf dieser neuesten Projekt hat der leitende Programmierer eine funktionale Programmierung Ansatz, wie wir Software überarbeitet worden sind. Als ich erwähnte, dass ich über TDD codieren möchte, gepeitscht er eine kundenspezifische Lösung in einem Tag oder weniger, dass ich prüfen, wie effektiv für mich gewesen als PHPUnit zu verwenden. Darüber hinaus eröffnet er wirklich meine Augen über die Frage der objektorientierten vs. Functional Programming.

Erstes Projekt von Grunde auf neu begonnen, in im Erdgeschoss, objektorientierte Programmierung, groß Unit Testing Framework wurde es monolithisch und steckte schnell. Zweites Projekt, gut etablierte CMS-Software mit einer 5-jährigen Geschichte und altem Code, noch ein funktionalen Programmierparadigma und einer einfachen Test-Framework (wir tatsächlich oft Verwendung von PHP-Assertion gemacht) machte es einfacher zu bekommen, anstatt in Komplexität wachsen.

Das zweite Projekt auch kam nie zu dem Punkt, Selen der Umsetzung (und ich denke immer noch, wäre es von Vorteil sein), aber der funktionalen Programmierung Ansatz machte es leichter, mit in-Code-Tests befassen.

Ich habe gerade diese Frage, und während ich noch bei der „Erforschung der Bühne“ bin in herauszufinden, was los ist. Ich entdeckte, nur etwas für Ruby on Rails als "Gurke" http://cukes.info/

Es ist im Wesentlichen ‚Story Driven Development‘ für Ruby und möglicherweise ein Goldstandard im Bereich der Funktionsprüfung, zumindest soweit ich auf meiner Reise gesehen habe. (Ich habe dies dort öffentlich, so Experten mich korrigieren, wenn ich falsch bin)

Als Beispiel für die Sprache, in Gurken, Sie habe etwas, das sehr eng SQL ähnelt. ABER scheint noch menschlich lesbar zu sein. Von der cukes Titelseite ihrer Sprache wie folgt aussieht:

 Scenario: Add two numbers
      Given I have entered 50 in the calculator
      And I have entered 70 in the calculator
      When I press add
      Then the result should be 120 on the screen

Das oben kompiliert und als Test ausgeführt werden.

Nun, das ist alles Präambel des Punkt Ihre Frage über PHP zu beantworten -. BDD & TDD

die Kommentare oben in Echo, PHPUnit Unit-Tests ermöglichen und nach diesem Blog-Eintrag: http://sebastian-bergmann.de/archives/738-Support-for-BDD-and-Stories-in-PHPUnit-3.3.html auch unterstützt "Geschichte Stil" BDD-Tests.

auf der obige Antwort in Bezug zu erweitern, um „Simple“ oben erwähnt, hat das ST-System einen in Browser-Objektklasse für die Browser-Automatisierung gebaut, während PHPUnit eine Erweiterung für die SELENIUM Browser Automatisierung hat http://seleniumhq.com (der Vorteil von Selenium vs. Simple ist, dass Selinium Betrieb an Seite Javascript ausgeführt wird, während Simple nicht).

Ich hoffe, Sie finden diese Informationen hilfreich, da sie das Ergebnis einer Reihe von Monaten persönliche Forschung und Hands-on-Versuch und Irrtum mit den oben genannten Technologien sind. Wenn es Experten gibt, die klären kann und mein Verständnis der oben verbessern, begrüße ich das Feedback.

  • Alex.

Michael Booth Vergleich der BDD-Testfunktionen in beiden Sprachen:

http://mechanicalrobotfish.com / Beiträge / 117-ruby-vs-php-BDD-beauty-contest-no-Wettbewerb

kommt zu dem Schluss, dass PHP BDD-Tools und Kultur an diesem Punkt unterentwickelt ist.

Sicherlich gibt es nichts Vergleichbares mit dem, was zu einem Ruby-Programmierer verfügbar ist, entweder in Bezug auf Wissen (Bücher, Videos, Artikel, Blog-Posts) oder Tools (Rspec, Shoulda, Factory Girl, Mokka, Gurke).

Sie können PhpStorm zu sehen. Ich mag den Test Läufer, die PHPUnit aus den IDE verwenden.

Nun bin ich "Spectrum" Rahmen für die BDD-Test zu entwickeln: https://github.com/m -haritonov / Spektrum

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top