Domanda

Come diffusa, sostenuto, sviluppato sta testando nel mondo PHP? Alla pari con Java? Lassù con Ruby / Rails? I Googled e ha scoperto che esistono infrastrutture per i test ma mi chiedo se sono ampiamente utilizzati.

Cosa fare il principale IDE PHP sono dotati di prova corridori modo strumenti Java di Eclipse fanno o Ruby / Rails di NetBeans strumenti fanno? Sta testando integrato nel framework MVC di PHP come con Rails?

Lo chiedo perché un gruppo dove lavoro vuole assumere qualcuno per sviluppare un'applicazione PHP per loro. Sono preoccupato per la qualità e la manutenzione, come potrei essere chiamato a sostenere questa cosa.

È stato utile?

Soluzione

Ci sono almeno due maturi, stand-alone, suite di test JUnit stile disponibile, chiamato PHPUnit e < a href = "http://www.simpletest.org/" rel = "noreferrer"> SimpleTest , rispettivamente.

Per quanto riguarda i quadri MVC andare, Symfony ha il suo quadro propri test chiamato calce , codeigniter ha un unit_test biblioteca e CakePHP si basa sulla SimpleTest citata.

So che Zend Studio ha un supporto incorporato per i test PHPUnit, ed entrambi PHPUnit e SimpleTest ha corridori della riga di comando in modo integrazione in qualsiasi flusso di lavoro è possibile.

Gli strumenti ci sono nel mondo PHP se uno sviluppatore vuole approfittare di loro, e negozi eleganti fanno approfittare di loro.

Gli avvertimenti sono la par per le lamentele corso PHP. Ci sono due comunità PHP; PHP come una piattaforma per la creazione di software, e PHP come un modo di interagire con un server web, browser web, e il database di produrre cose di applicazioni simili sul web. E 'meno una cosa in bianco e nero e più un continuum; Tra quelli più sul software developer unit testing lato e TDD è sostenuto e usato tanto quanto lo è in qualsiasi altra piattaforma. Tra i "mettere insieme un mucchio di roba che non capisco, ma ancora ottenere risultati popolo", è inaudito.

C'è un sacco di non-framework / custom-framework PHP codice legacy in giro che è difficile ottenere un utile test harness intorno. PHP si presta facilmente a modelli che si basano sull'esistenza di un ambiente browser per funzionare. Non ho alcuna prova a sostegno di questo diverso mie osservazioni, ma un sacco di negozi di PHP che si occupano di test finire basandosi su test di accettazione (cioè selenio) come sostituto del reale unit test, test-primo, ecc . sviluppo.

Nella tua situazione specifica, intervista l'inferno fuori dello sviluppatore vostro gruppo sta per assumere.

  1. Chiedi loro che cosa quadro unit testing usano

  2. Chiedete loro di descrivere, in termini generali, un esempio reale mondo di un tempo hanno sviluppato una nuova funzionalità e le sue prove di supporto

  3. Chiedete loro di descrivere, in termini generali, un esempio reale di un tempo loro test fallito e quello che hanno fatto per risolvere la situazione

Sei meno interessati alla specifica situazione che stanno andando a descrivere e più interessati a quanto è comodo stanno discutendo la loro conoscenza di test del codice in generale.

Altri suggerimenti

Ogni volta che TDD un progetto con gli strumenti di stile xUnit, ho difficoltà a ottenere la mia testa nel posto giusto. Trovo che l'utilizzo di strumenti progettati per Behavior Driven Development o " Specifica l'esempio " rende più facile per me < a href = "http://gojko.net/2010/12/02/the-principle-of-symmetric-change/" rel = "noreferrer"> fare TDD destra - vale a dire attenzione al design, esponendo intento e descrivere il comportamento in contesti specifici . non di test.

Detto questo, vorrei introdurre pettorali nella conversazione. Dal readme sul sito del progetto.

  

Pecs è una piccola libreria di behavior-driven development per PHP 5.3, alla RSpec o JSpec.

Se hai utilizzato JSpec o, meglio ancora, Jasmine-BDD (per JavaScript) lo stile pettorali di descrivere il comportamento dovrebbe essere molto familiare. Trovo che questo grande stile per le specifiche a livello di componente. Se siete alla ricerca di un attrezzo di PHP per le specifiche di livello caratteristica (storie o prove di accettazione degli utenti) in considerazione Behat .

Tornando ai pettorali, ecco un esempio abbattuti dal sito pettorali del progetto:

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);
  });
});

Sì che è una specifica PHP. Guardando attraverso la fonte pettorali, sembra che l'autore è in grado di tirare fuori questo sfruttando il nuovo piccante in PHP 5.3+, lambda e chiusure. Quindi credo che questo significa che non è possibile utilizzare pettorali in qualsiasi progetto basato su PHP <5.3 (appena cronaca).

Inoltre, pettorali non è così maturo come PHPUnit o SimpleTest. Tuttavia, credo che i fautori di BDD nella comunità PHP dovrebbero sostenere la crescita di strumenti come pettorali che incoraggiano "Specifiche per esempio" o BDD senza la confusione causata dalla necessità di utilizzare strumenti di test legacy xUnit.

In questi giorni ho lavorare più in Python di PHP. Tuttavia, la prossima volta che prendo in mano un progetto PHP, sarò estremamente felice se ho una comunità sostenuta strumento maturo, come pettorali alle imbarcazioni alle specifiche per il software.

Ho avuto un'esperienza straordinaria con Behat / visone http://behat.org

Sono d'accordo con gli altri PHP come una piattaforma di test di unità non è un divertimento o esperienza BDD è il modo migliore per andare se si utilizza qualsiasi framework PHP

confezionamento mia testa intorno compositore come uno strumento di pronti contro termine di costruzione era il più grande ostacolo, ma siamo stati in grado di utilizzare Behat Mink Selenio WebDriver vaso server autonomo come un incredibile strumento di progettazione e test di regressione. Abbiamo utilizzato per eseguire la nostra suite di regressione contro la nostra applicazione CakePHP su un server di Jenkins, ma si è rivelato essere non molto "fail fast" abbastanza

Ora il nostro flusso di lavoro va in questo modo: Crea storia in cetriolino raffinare storia scrivere funzione e spegnere eventuali nuovi defs passo iniziare la codifica soluzione PHP per testare Poi alla fine abbiamo una funzione o bug fix di lavoro con un test di BDD coprendolo

configurazione Abbiamo un Ubuntu VM con un lavoro Behat configurazione e copiato per ogni postazione di lavoro. Abbiamo cotto che nel nostro processo. Abbiamo appena tiriamo giù i cambiamenti vengono eseguiti i test poi iniziare la codifica novità.

Abbiamo scritto uno script di shell per l'esecuzione automatica mysql discariche e caricarli prima di ogni caratteristica che ha fatto il refactoring del codice un gioco da ragazzi.

La classe visone WebAssert ti dà tutte le asserzioni necessarie per validare il comportamento Le classi di sessione / CommonContext regolari sono grande per l'utilizzo CSS o XPath.

Ho usato Capybara / WebDriver con Java e Rails progetti prima e trovato l'overhead setup / curva di apprendimento è troppo alta rispetto al Behat.

Oltre alle biblioteche / quadri che Alan ha già accennato, è possibile fare uso di di mod_perl Apache :: test, che quello che io uso come una cintura. Mi permette di integrare in modo molto semplice test nel mio processo di rilascio. L'imbracatura utilizza TAP uscita (Test Anything Protocol) per determinare se i test passano o falliscono , utilizzando librerie come test :: semplice o test :: Più ( Perl e < a href = "http://shiflett.org/code/test-more.php" rel = "nofollow noreferrer"> PHP ).

Fuori dalla scatola Apache :: Test supporta la scrittura dei test sia in Perl e PHP. Nei miei progetti, c'è voluto un po ' di inganno e un sacco di a leggere per davvero farlo funzionare, ma l'implementazione di test :: More in PHP è built-in per il cablaggio. Esecuzione di tutte le prove scritte sia in PHP e Perl viene effettuata attraverso un unico comando e qualsiasi guasto lungo il modo in cui viene catturato Apache :: Test, notando come meglio può cosa è andato storto.

La parte impressionante di tutto questo è che si può anche utilizzare PHPUnit, o semplice-Test accanto alle due precedenti framework di test. Con l'esecuzione di test in ogni rispettivo libreria, è possibile utilizzare l'applicazione PHP di Test :: More (o anche Perl dal test stdout) e sputare indietro TAP per il cablaggio da interpretare.

Assicurarsi di leggere il Apache :: documentazione di prova e il guida mod_perl di eseguire Apache :: test . Inoltre, ho trovato l'articolo qui di grande aiuto.

Come esempio veloce, si potrebbe configurare un test in Perl in pochissime righe di codice che verrà eseguito attraverso tutte le pagine del tuo sito (che dispongono di collegamenti) e verificare tutte le risultato nelle risposte '200 OK' e non hanno eventuali errori di analisi:

#!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 un progetto passato, ho usato il PHPUnit, e mi ha lasciato che vogliono. PHPUnit + Comando linea che delle prove, fatto in modo che troppo tempo è stato speso codifica i test, non era abbastanza veloce, e sembrava davvero limitare lo stile del codice in un modo che non mi è piaciuto (oggetti erano più facili da provare, così sembrava un pò favorire gli oggetti).

Il selenio è una soluzione di cui abbiamo parlato, ma non è mai riuscito ad entrare in gioco, e credo che ci sarebbe davvero hanno beneficiato di questo tipo di test-livello di uscita.

In questo ultimo progetto, il programmatore capo ha adottato un approccio di programmazione più funzionale come abbiamo stato revisione del software. Quando ho detto che mi piacerebbe codice tramite TDD, ha montata su una soluzione personalizzata in un giorno o meno che ritengo di essere stato il più efficace per me da usare come PHPUnit. Inoltre, ha davvero aperto gli occhi sulla questione della Object Oriented vs. programmazione funzionale.

Il primo progetto, iniziato da zero, in al piano terra, Object Oriented codifica, grande Unit Testing Framework, è diventata monolitica e impantanati in fretta. Secondo progetto, il software CMS ben definito con una storia di 5 anni e vecchio codice, ma un paradigma di programmazione funzionale e un framework di test semplice (in realtà abbiamo spesso fatto uso di PHP assert) ha reso ottenere più semplice, invece di crescere in complessità.

Il secondo progetto, anche, mai arrivato al punto di attuare selenio (e io continuo a pensare che sarebbe utile), ma l'approccio di programmazione funzionale reso più facile trattare con test in-codice.

Ho appena trovato questa domanda e, mentre io sono ancora in "fase di ricerca" a capire cosa sta succedendo. Ho appena scoperto qualcosa per Ruby on Rails chiamato "Cetriolo" http://cukes.info/

E 'essenzialmente 'una storia di sviluppo guidato' per Ruby e molto probabilmente un gold standard nel regno di collaudo funzionale, almeno per quanto ho visto nei miei viaggi. (Ho messo questo lassù pubblicamente, così gli esperti mi può correggere se sbaglio)

Come esempio della lingua nella Cetriolo, hai qualcosa che assomiglia molto da vicino SQL. MA sembra essere ancora più leggibile. Dalla prima pagina cukes loro lingua assomiglia a questo:

 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

È possibile che questo verrà compilare ed eseguire come un test.

Ora che è tutto preambolo al punto di rispondere le tue domande su PHP -. BDD TDD &

In facendo eco alle osservazioni di cui sopra, PHPUnit consentirà unità di test e in base a questo post blog: http://sebastian-bergmann.de/archives/738-Support-for-BDD-and-Stories-in-PHPUnit-3.3.html anche sostiene "stile storia" test di BDD.

Per espandere sulla risposta di cui sopra rispetto a "SimpleTest" di cui sopra, il sistema ST è dotato di un browser classe di oggetti per l'automazione del browser, mentre PHPUnit ha un'estensione per l'automazione del browser SELENIUM http://seleniumhq.com (il vantaggio di selenio vs SimpleTest è che Selinium verrà eseguito alcun javascript on-page, mentre SimpleTest non sarà).

Spero che queste informazioni utili in quanto è il risultato di un certo numero di mesi di prova di ricerca e hands-on personali e di errore con le tecnologie di cui sopra. Se ci sono esperti là fuori che può chiarire e migliorare la mia comprensione di quanto sopra esposto, accolgo con favore le valutazioni.

  • Alex.

confronto di Michael Booth delle funzioni di test BDD in entrambe le lingue:

http://mechanicalrobotfish.com / messaggi / 117-ruby-vs-php-BDD-beauty-contest-no-contest

conclude che gli strumenti e la cultura PHP BDD è sottosviluppato a questo punto.

Di certo non c'è nulla di paragonabile a ciò che è disponibile ad un programmatore Ruby, sia in termini di conoscenza (libri, video, articoli, post del blog) o strumenti (RSpec, Shoulda, Factory Girl, Mocha, cetriolo).

Si potrebbe voler controllare PhpStorm . Mi piacciono i corridori di test che utilizzano PHPUnit dall'interno dell'IDE.

Ora sto sviluppando quadro "Spectrum" per la prova di BDD: https://github.com/m -haritonov / spettro

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top