RSpec e Cucumber ne valgono davvero la pena?

11

So che la maggior parte dei programmatori del RoR sta testando i tossicodipendenti e capisco i vantaggi di una grande suite di test, ma quando comincio a testare non ottengo mai una suite così grande e mi chiedo sempre "Sto testando nel modo giusto? ?". Mi occupo spesso di test di integrazione che verificano solo il comportamento dell'applicazione.

In primo luogo, il test vale davvero la pena? Voglio dire, il tempo dedicato alla scrittura dei test vale davvero la pena?

Quindi, utilizzo RSpec, ho scoperto di recente Cucumber, l'ho usato per un po 'ma non so se scrivere tutti questi passaggi valga davvero la pena? So che posso riutilizzare i passaggi ma non so mai se questi passaggi sono troppo completi o meno: ad esempio, ho usato un Given I am logged in as (.+) ma non so se devo dire nella sua definizione Given there's a user called $1 perché può duplicare l'utente se mai creato ma non vale la pena avere sempre un passo prima di Given I am logged in as (.+) . È un bel po 'di codice che raramente può essere utile. Immagino che non ci siano nuovi bug sulle parti testate ogni giorno ... Quindi Cucumber è davvero utile rispetto a RSpec?

    
posta Cydonia7 29.08.2011 - 18:03
fonte

5 risposte

11

Il mio 'ah-ha!' i momenti di test su Ruby e Rails sono arrivati quando mi sono seduto e ho letto le risorse definitive sull'argomento, il Rspec e Cetriolo libri. Ho condiviso il tuo disprezzo iniziale di Cetriolo, ma poi mi sono reso conto che stavo guardando l'immagine dall'angolo sbagliato.

Fondamentalmente, Cucumber riguarda BDD (sviluppo guidato dal comportamento) - usi Cucumber per pianificare le tue funzionalità, su cosa lavorerai in seguito. Hmm, dopo vuoi che gli utenti siano in grado di promuovere post su un forum o qualcosa del genere (per rubare un esempio;)) Quindi scrivi qualcosa di semplice.

Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.

Si noti che non ci sono riferimenti a qualsiasi cosa relativa al codice in questo campo. Questo viene nei tuoi passi. Quando si effettua il refactoring del codice, potrebbe essere necessario modificare le definizioni dei passaggi, ma il comportamento (la funzionalità) non dovrà mai essere modificato.

Ora, ogni volta che esegui la funzione Cucumber, ti verrà praticamente spiegato come testare la funzione utilizzando TDD (sviluppo basato su test). Questo viene fatto a un livello inferiore usando RSpec.

Prima esecuzione: la mia prima definizione di passo non è definita. Copia il blocco per definirlo in user_steps.rb o anche session_steps.rb perché si riferisce agli utenti e alle loro sessioni. Ora, come si definisce che un utente abbia effettuato l'accesso? Puoi portarli attraverso il processo di accesso.

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Dovrebbe essere tutto felice. Secondo passo.

Given /^I can see the post "(.+)"$/ do |name|
  visit post_path(Post.find_by_name(name))
end

Di nuovo abbastanza facile. Tieni presente che se ripristiniamo completamente la nostra procedura di accesso, o come vengono definiti e mostrati i nostri post, non dobbiamo modificare il comportamento. Terzo passo.

When /^I vote the post up$/ do
  pending 
end 

Ecco dove stai iniziando a parlare di nuove funzionalità, ma non sai ancora come funzionerà. Come vota un post? È possibile fare clic su un'immagine di un +1 o qualcosa, che fa un post ajax su un controller, che restituisce JSON, o qualcosa di simile. Quindi ora puoi passare al puro test Rspec.

  • Verifica la tua vista per assicurarti che l'immagine +1 sia visualizzata,
  • Verifica il controller in modo che si comporti correttamente quando riceve una determinata richiesta Ajax del formato corretto (entrambi i percorsi felici e infelici - cosa succede se viene ricevuto un ID post non valido? Cosa succede se l'utente ha esaurito i suoi 25 upvotes in un giorno? Aumenta correttamente il numero di voti?)
  • Verifica il tuo javascript che risponda correttamente quando viene fornito un blob di JSON nel formato corretto (aggiorna l'immagine +1 per mostrare che è stato usato? (pensando a Google+ qui ...) Mostra il messaggio di ringraziamento ? ecc.)

Tutto ciò non influisce sul comportamento, ma quando hai finito di occuparti del test di livello inferiore, sarà banale compilare la definizione del passo su come votare un post. Potrebbe essere semplice come click_link '+1' . E il resto dei passaggi sta testando i risultati, che dovrebbe essere di nuovo semplice da fare. E quando hai finito, allora sai che la tua funzione è completa e finita. Se il comportamento necessario cambia, puoi modificare la tua funzionalità, altrimenti puoi modificare il codice di implementazione in perfetta sicurezza.

Spero che abbia senso. È stato tutto fuori di testa, ma penso che dimostri la differenza tra BDD e TDD, e perché Cucumber e RSpec soddisfino esigenze diverse.

    
risposta data 27.09.2011 - 13:11
fonte
10

Il test, a mio parere, è un'arte. Fare TDD (usando RSpec o qualsiasi altro framework) inizialmente sembra che stai "sprecando il tuo tempo". Questo è comprensibile perché non stai scrivendo alcun codice di produzione.

Tuttavia, si inizia a vedere il vantaggio di TDD quando è necessario migliorare la base di codice assicurandosi che tutto funzioni ancora. TDD consente di rilevare gli errori di regressione il prima possibile. Questo mi ha permesso di risparmiare giorni di lavoro perché avevo messo a fuoco test che evidenziavano i miei errori.

Inoltre, l'esecuzione di test può essere utile per le revisioni del codice perché il revisore può vedere quali scenari stai testando e come deve essere utilizzato il tuo codice.

Una volta entrati nell'oscillazione di TDD, fare qualsiasi altra cosa sembra sbagliato.

    
risposta data 29.08.2011 - 18:12
fonte
1

La mia opinione è che tu abbia ragione sul fronte di Cucumber. Scrivere tutti quei passaggi è un sacco di problemi, ei benefici non giustificano il dolore. Ho scritto molto sui sei svantaggi dell'utilizzo di Cucumber qui: Perché preoccuparsi Con Cucumber Testing?

Test unitari e test di integrazione regolari, eseguiti con Rspec o Test :: Unit, hanno molto senso, ma fortunatamente questi sono molto più veloci da scrivere rispetto ai test di Cucumber. Per uno puoi usare il puro Ruby invece di dover combattere la sintassi prolissa e gofale di Gherkin.

    
risposta data 27.09.2011 - 11:19
fonte
1

Ciò che personalmente credo è che RSpec testing is a definite must . Supponiamo ad esempio che tu voglia scrivere una nuova funzione e che abbia anche riferimento ad altre funzionalità e che la funzione possa essere referenziata con altri moduli o metodi. Quindi, come puoi assicurarti che ciò che stai scrivendo non stia infrangendo altre parti dell'applicazione?

Supponiamo che tu abbia una grande applicazione e che tu abbia codificato qualcosa di banale rispetto all'intera applicazione, ripeterai l'intera applicazione facendo clic su ogni collegamento nell'applicazione per assicurarti che funzioni ogni volta che cambi una singola riga di codice?

Tuttavia, ritengo che il test sui cetrioli non sia obbligatorio. Penso che i test di integrazione che utilizzano RSpec stesso abbiano più senso fino a quando ea meno di dover verificare i test dal tuo cliente. Quale nella mia esperienza è RARO. Se il tuo team è composto interamente da sviluppatori, penso che dovresti piuttosto sostituire i passaggi Cucumber per il test delle funzionalità di RSpec. E penso che dopo la DSL RSpec 3, i test siano praticamente leggibili.

Es:

Definizione Step cetriolo:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Test di funzionalità RSpec:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

Penso che invece di avere le funzionalità di Cucumber, le funzionalità di RSpec fanno la stessa cosa senza il fastidio in più di scrivere altre definizioni di step.

Oltre a questo, è puramente la tua preferenza.

Spero che questo ti possa aiutare a capire un po '.

    
risposta data 25.07.2014 - 02:37
fonte
0

Secondo me la prima cosa è distinguere tra pratiche e strutture concrete. Cucumber non è BDD, RSpec non è TDD.

Se vuoi testare il tuo sistema RSpec come un buon strumento, puoi fare TDD o BDD con RSpec, infatti TDD e BDD sono la stessa cosa. Qualcuno dice "BDD ha fatto il TDD fatto bene" e sono assolutamente d'accordo con questo, BDD principalmente riguarda le funzionalità di test / comportamenti invece di testare metodi / classi. Di fatto il TDD che Kent Beck descrive sulle sue caratteristiche, ma BDD aiuta molte persone a comprendere questa fondamentale differenza e rappresenta un grande contributo da parte di Dan North alla comunità di sviluppo.

Utilizza Cetriolo se ritieni di aver bisogno di uno strumento migliore per comunicare con gli uomini d'affari, ad esempio se cetriolo consente ai tuoi uomini d'affari o al proprietario del prodotto di aiutare il team a scrivere o modificare gli scenari. Altre persone amano il cetriolo perché questi scenari sono davvero una buona documentazione dal vivo di un sistema, se ritieni di aver bisogno di questo tipo di documentazione prova cetriolo.

In sommario:

  • Se vuoi fare TDD / BDD o team - > prova RSpec
  • Se vuoi un modo migliore per comunicare con la tua attività con la cronologia degli utenti e gli scenari - > prova cetriolo
  • Se desideri una documentazione live delle funzioni del tuo sistema - > prova cetriolo.

Ovviamente gli ultimi due hanno un costo elevato associato, è necessario valutare se ne hai davvero bisogno e vale la pena, questo ovviamente dipende totalmente dal tuo progetto e dal tuo ambiente e dalla decisione che ti spetta.

Ricorda sempre che RSpec e Cucumber sono solo strumenti e gli strumenti risolvono problemi concreti, che problema vuoi risolvere ?, poniti questa domanda e probabilmente sei in una posizione migliore per selezionare lo strumento giusto. Essere un programmatore migliore è prendere queste decisioni non sull'uso di X / Y framework / tool / library / technology.

    
risposta data 25.07.2014 - 03:34
fonte

Leggi altre domande sui tag