Forse il problema non è il modo migliore per scrivere le didascalie del test, ma come scrivere i test stessi? Eseguire i test di refactoring in modo tale che la loro autodocumentazione possa fare molta strada e la docstring non si esaurirà quando il codice cambia.
Ci sono alcune cose che puoi fare per rendere i test più chiaro:
- chiare & nomi dei metodi di test descrittivi (già citato)
- corpo di prova dovrebbe essere chiaro e conciso (auto documentazione)
- astratto complicato setup/teardown ecc. nei metodi
- altro?
Ad esempio, se si dispone di un test come questo:
def test_widget_run_returns_0():
widget = Widget(param1, param2, "another param")
widget.set_option(true)
widget.set_temp_dir("/tmp/widget_tmp")
widget.destination_ip = "10.10.10.99"
return_value = widget.run()
assert return_value == 0
assert widget.response == "My expected response"
assert widget.errors == None
Si potrebbe sostituire le dichiarazioni di impostazione con una chiamata di metodo:
def test_widget_run_returns_0():
widget = create_basic_widget()
return_value = widget.run()
assert return_value == 0
assert_basic_widget(widget)
def create_basic_widget():
widget = Widget(param1, param2, "another param")
widget.set_option(true)
widget.set_temp_dir("/tmp/widget_tmp")
widget.destination_ip = "10.10.10.99"
return widget
def assert_basic_widget():
assert widget.response == "My expected response"
assert widget.errors == None
Nota che il metodo di prova è ora composto di una serie di chiamate di metodo con nomi che rivelano l'intenzione, una sorta di DSL specifico per i tuoi test. Un test del genere ha ancora bisogno di documentazione?
Un'altra cosa da notare è che il metodo di test è principalmente a un livello di astrazione. Qualcuno leggendo il metodo di prova vedrà l'algoritmo è:
- la creazione di un widget
- chiamando corsa sul widget
- affermando il codice ha fatto quello che ci aspettiamo
La loro comprensione del metodo di prova non è confuso dai dettagli della configurazione del widget, che è un livello di astrazione inferiore al metodo di test.
La prima versione del metodo di prova segue il modello Inline Setup. La seconda versione segue i modelli Creation Method e Delegated Setup.
Generalmente sono contrario ai commenti, tranne dove spiegano il "perché" del codice. Leggere lo zio Bob Martin Clean Code mi ha convinto di questo. C'è un capitolo sui commenti, e c'è un capitolo sui test. Lo consiglio.
Per ulteriori informazioni sulle best practice per i test automatici, consultare xUnit Patterns.
Che succede con i nomi delle tue funzioni?Suppongo che tu chiami i tuoi test "testFunctionName" e va bene, ma hai seriamente una funzione chiamata InitializeSetsUpChessBoardCorrectly? Penso che "setUpChessboard" farebbe bene. –
No, il nome del metodo spiega esattamente cosa sta testando - quel test case verifica che initalize() imposta correttamente la scacchiera. Boom, documentazione automatica. –
Haha sì, il "test" all'inizio è solo dai vecchi tempi di JUnit, su cui il mio cervello è ancora bloccato. Potrei chiamarlo initalizeSetsUpChessBoardCorrectly() e usare un'annotazione @Test. –