2010-12-20 20 views
8

Si tratta di una pratica comune per precedere i nomi dei metodi prove in JUnit con "test". Ma negli ultimi anni, alcune persone hanno cambiato questo al prefisso "dovrebbe".Prefisso per metodi di prova in Unità: "test" vs "dovrebbe"

Se voglio testare la creazione del cliente in un database, normalmente chiamerei il metodo "testCustomerCreation". Tuttavia, alcune persone chiamerebbero "shouldCreateCustomer".

Questo è un sacco di gusto personale quando io sono l'unica persona nel progetto o quando tutti gli altri nel progetto d'accordo con me. Ma quando/dove questo non è il caso, cominciano a comparire alcune divergenze o mix incoerenti.

Ho letto da qualche parte un articolo di un ragazzo che ha chiamato i suoi metodi come "testShouldCreateCustomer", e per questo motivo ha deciso di lasciare il prefisso "test". Ma in realtà non stava prefiggendo il "test", stava usando "testShould" e cambiato in "dovrebbe". Ovviamente, questo non mi ha convinto.

Personalmente sono fortemente incline ad attenermi al prefisso "test" perché i nomi dei metodi normalmente iniziano con i verbi in forma infinita ("get", "set", "add", "remove", "clear", " invia "," ricevi "," apri "," chiudi "," leggi "," scrivi "," crea "," elenco "," pop "," stampa ", ecc. quindi è" test "). Quindi, il prefisso di un nome di metodo con "dovrebbe" rende il suono davvero molto strano per me, sembra sbagliato.

Quindi, qual è la vera buona ragione per usare "dovrebbe" invece di "prova"? Quali sono i grandi vantaggi e svantaggi?

+7

Passerei meno tempo a preoccuparmi dei prefissi sciocchi e più tempo a preoccuparmi che il resto del nome del test sia descrittivo. – cdhowie

risposta

18

La convenzione 'dovrebbe' è allineato con lo stile behaviour driven development di test.

Io personalmente davvero preferisco scrivere i test in questo stile, come ti incoraggia a scrivere i test che leggono specifiche, e sono più allineati con la comportamento della classe o del sistema che si sta verificando.

Ove possibile, a volte fare un passo avanti e dare la classe di test ancora più contesto usando il suo nome:

class ANewlyCreatedAccount { 
    shouldHaveAZeroBalance() {} 
    shouldCalculateItsOwnInterest() {} 
} 

Nominando le vostre classi e pensare a loro in questo stile specifica, questo può dare un sacco di guida su i test da scrivere, e in quale ordine si dovrebbe scrivere i test e renderli verde.

Sì, 'should' vs 'test' è solo un prefisso ed è importante essere coerenti, ma questa domanda riguarda anche lo stile e la mentalità di come testare il codice e scegliere quali test scrivere. BDD ha un sacco di valore, quindi suggerisco di leggere oltre e fare un tentativo.

+2

+1 per aver menzionato che si tratta di comportamento piuttosto che metodi di test – tddmonkey

+0

Ok, mi stai convincendo. Ma questo significa che tutte le persone che nominano semplicemente metodi di test che non hanno nemmeno l'aspetto delle specifiche di qualcosa (come "shouldSaveUserToDatabaseWhenPasswordIsChanged"), sono persone che semplicemente non sanno cosa stanno facendo? Se il metodo di prova in particolare non ha nulla a che fare con BDD (come un test che protegge da un bug che si è verificato in una combinazione di condizioni molto particolare), dovrebbe comunque essere preceduto da "dovrebbe"? –

3

La coerenza è più importante dell'essere corretti sui problemi di denominazione. Se c'è qualche domanda su un progetto, il membro tecnico responsabile del progetto dovrebbe delineare formalmente le pratiche di codifica in modo che problemi come questo non uccidano il tempo prezioso del progetto.

+2

"La coerenza è più importante dell'essere corretti" - la storia del software ERP da 1,5 milioni di linee della mia azienda in una frase. – corsiKa

+1

su problemi _naming_. Ci sono alcune cose che vale la pena dedicare del tempo a discutere e trovare le migliori pratiche. Discutere su posizionamento di parentesi graffe, schema di capitalizzazione e prefissi di test non rientrano in quel gruppo. Una consulenza eccessivamente generalizzata e scarsamente applicata potrebbe essere più un problema del tuo software. – codelark

3

Nel JUnit originale, metodi di prova doveva cominciare test. Un sacco di quadri per altre lingue ha copiato questa convenzione. Anche se non è più il caso in JUnit, e anche se altri framework potrebbero essere diversi, penso che la maggior parte dei programmatori abbia ancora familiarità con i metodi chiamati per es. testX come test unitari, quindi penso che sia opportuno attenersi alla convenzione test per questo motivo.

5

Direi che il prefisso 'test' è semplicemente un passivo dai giorni precedenti all'annotazione quando era necessario. Ti suggerirei di utilizzare semplicemente nomi significativi per i tuoi casi di test (e ciò potrebbe significare con o senza 'test').

Preferisco denominare il metodo di prova in modo che sia chiaro cosa viene testato. cioè

checkNullParameter() 
runSimpleQuery() 
runQueryWithBadParam() 

Tutti i casi di test si trovano in una directory di prova comunque e tutti i test reali sono annotati, quindi il prefisso 'test' è piuttosto ridondante.

+2

runQueryWithBadParam() - Non stai dicendo quello che ti aspetti qui. Personalmente preferirei vedere shouldThrowBadParamExceptionOnBadParam(). Dovrebbe anche incoraggiarti a descrivere le tue aspettative ...... –

+1

L'annotazione (prevista = BadParamException) dovrebbe essere abbastanza chiara per il caso semplice. In altri casi, lascia che il codice mostri ciò che mi aspetto, in quanto potrebbero esserci diverse affermazioni relative a più parametri non validi. Ad esempio null, o un valore fuori intervallo potrebbe essere contenuto nello stesso testcase (param male). Le asserzioni stesse dicono quello che mi aspetto e dovrebbero essere chiare a chiunque legga il codice. – Robin

+0

@Benjamin: che dire di testQueryWithBadParam()? @Robin: Sono parzialmente d'accordo. A volte "check" o "verify" è meglio di "test", ma "runSimpleQuery" non è esattamente quello che fai. Non lo esegui semplicemente, corri e asserisci che funziona correttamente, quindi sarebbe come "testSimpleQueryRun". Ugualmente avremmo "testQueryWithBadParam". So che in questo modo è molto probabile che ogni metodo abbia il test del prefisso, ma non sarebbe semplicemente un prefisso, ma farà parte della descrizione di ciò che fa il metodo. –

2

Preferisco il suffisso test. È possibile che tu abbia un metodo con un prefisso di should nel tuo progetto, ad es. shouldBuy e il test verrà quindi chiamato testShouldBuy perché shouldShouldBuy sembrerebbe davvero molto strano.

Uso anche il MoreUnit Eclipse plugin che crea automaticamente un metodo di prova prefisso test quando si preme Ctrl+U o passare al metodo di prova quando si preme Ctrl+J. (Sebbene sia possibile configurare il prefisso utilizzato.) Se non si è coerenti con la denominazione, strumenti automatici come MoreUnit non saranno in grado di aiutarti con i test.

+5

Dare un nome a un metodo di prova secondo il metodo testato dovrebbe essere evitato dopo tutto, dal momento che questo ha comportato l'inferno di refactoring, quindi questo argomento non è veramente valido. –