In che modo hai reso più divertente il test unitario? [chiuso]


18

Se hai sempre amato i test unitari, buon per te! Ma per gli sfortunati che non sono nati con una simpatia per questo, come sei riuscito a rendere questo compito più piacevole?

Questa non è una domanda "qual è il modo giusto di test unitario". Voglio semplicemente conoscere piccoli trucchi personali che riducono la noia (oserei dire) di scrivere test unitari.


1
Adoro scrivere unit test e altri test in parte perché quasi tutti gli altri lo fanno schifo (a volte fanno schifo anche nel creare strumenti che sto testando). No, non faccio schifo come sviluppatore. Mi piace l'usabilità, il piacere per gli occhi e l'automazione. La MbUnitbiblioteca ha cambiato la mia vita. Il test automatico è importante. Il test automatico consente di risparmiare tempo. Il test automatico consente di risparmiare denaro. I test automatici possono salvare vite umane. Il test automatico è l'unico modo. L'autotest è un'altra rete di sicurezza. Quando sono una delle 50 persone che lavorano su un'architettura enorme, mi sento come l'ennesimo mattone in un muro. Con i test unitari ho il controllo.
Lavoro

La pigrizia e la frustrazione nei test unitari sono una normale reazione al lavoro che il nostro cervello percepisce come inutile. Odio scrivere e mantenere unit test che hanno un ROI scarso o negativo. Tuttavia, scrivere test utili è un compito piacevole, ma è un'abilità a sé stante riconoscere ciò che è utile e ciò che è spazzatura. C'è un ragazzo che sta scrivendo un libro su questo argomento basato sul suo blog, puoi
iniziare a

Risposte:


22

In primo luogo, sono d'accordo con te: se stai scrivendo i tuoi test unitari su un codice già completato o se stai testando manualmente il tuo codice, lo trovo anche noioso.

Trovo che ci siano due modi di test unitari che lo rendono davvero divertente:

  1. Utilizzando Test Driven Development (TDD) - scrivere i test per primi mi permette di pensare al prossimo pezzo di funzionalità o comportamento di cui ho bisogno nel mio codice. Trovo che guidare verso il mio obiettivo finale in piccoli passi e vedere progressi tangibili verso quell'obiettivo ogni pochi minuti sia estremamente gratificante e divertente.
  2. Quando ci sono bug, piuttosto che andare direttamente al debugger, è una sfida divertente capire un modo per scrivere un test unit che fallisce che riproduca il bug. È estremamente soddisfacente capire finalmente le circostanze in cui il codice fallisce, quindi correggerlo e guardare la barra diventare verde per il nuovo test fallito (e rimanere verde per tutti i test esistenti).

12

Superiorità compiaciuta.

Sto solo scherzando. "Guardami, coltivando buone abitudini di programmazione! Questa roba di" unit test "è qualcosa che io da dieci anni fa non avrei mai fatto - che sciocco! E pensa solo a tutti i bug che catturerò come risultato questo lavoro noioso e noioso che sto facendo in questo momento - il mio codice sarà fantastico! Avrò sicuramente un aumento! * "

* - No, non lo farò.

Trovo che sia come allenarsi o mangiare sano; fino a quando i benefici tangibili non arrivano ("Palle sante, sto davvero prendendo una tonnellata di errori di regressione che sarebbero entrati in produzione!"), l'orgoglio morale di sapere che stai facendo La Cosa Giusta può aiutarti a portarti attraverso.


7

Per uno, quasi mai mi siedo lì e scrivo unit test. I test unitari sono un mezzo per raggiungere un fine, non un fine in sé. Sono un modo di rispondere "questo codice fa il compito base che dovrebbe".

Ad esempio, alcune persone scriveranno una funzione, quindi apriranno una sessione interattiva per testarla su alcuni valori e assicurarsi che funzioni:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

Ma ora scopri un bug:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

Quindi lo aggiusti:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

Ma ora dovresti davvero testare per assicurarti che funzioni ancora:

>> fact 10
=> 3628800
>> fact 7
=> 5040

Come puoi vedere, continui a ripetere gli stessi test ... e devi confrontare i risultati visivamente. Il test unitario è un modo per evitare la ripetizione in questo caso; riduce la quantità di lavoro che devi fare. E mentre questo è un piccolo esempio sciocco, nel mondo reale, diventa sempre più importante e sempre più difficile testare manualmente. Ciò significa, ovviamente, che le persone semplicemente non testano i singoli componenti; testano semplicemente l'intero programma. Ma poi spuntano i bug e sono molto più difficili da trovare. O i bug si verificano e sono stati corretti, ma qualcuno introduce nuovamente lo stesso bug, perché nessuno ha aggiunto un caso di test per assicurarsi che ciò non accada. O qualcuno guarda un grosso pezzo di codice e dice "Non ho idea di cosa dovrebbe fare, dal momento che non è documentato e non ha test ... se correggo questo bug, non ho idea se romperò qualcos'altro a seconda di esso; forse lo riscriverò da zero. "

I test unitari riducono tutto il lavoro extra in questi casi. Il modo migliore per renderli divertenti è assicurarsi che le persone comprendano tutto il lavoro che stanno sostituendo e la flessibilità aggiuntiva che deriva dal sapere cosa dovrebbe fare ogni pezzo di codice. In una certa misura, le persone devono avere un po 'più di esperienza con la scrittura e il mantenimento di una grande base di codice per capire quanto può essere importante il test unitario; se tutto il loro codice è qualcosa che scrivono una volta e buttano via, non lo capiranno mai.

E i test unitari non dovrebbero essere scritti dopo il fatto, come ulteriore lavoretto una volta che hai il codice che "sai" già funziona. I test unitari dovrebbero essere scritti per primi, o per lo meno (poiché a volte ti dimentichi di scriverli per primi) subito dopo aver scritto il codice in questione. Questo si chiama sviluppo test-driven e può aiutare a migliorare le tue API; se scrivi i test che eseguono prima le API, imparerai dove le API sono un problema da usare prima ancora di scrivere il codice e puoi riprogettare molto più facilmente che se aggiungi solo i test in seguito.


@Biran, sono d'accordo. Ma tutto ciò lo rende la cosa "giusta". Ma come si fa a renderlo divertente? Anche leggermente?
Preimpostazione

@Preets È divertente perché stai evitando di fare test manuali ripetitivi. È più divertente quando lo fai per primo , al contrario di dopo il fatto, perché diventa parte del processo di progettazione, non un compito dopo il fatto per il codice che già "funziona".
Brian Campbell,

Quindi, passare il tempo a farlo male, così che farlo GIUSTO sia divertente al confronto? ... Potrebbe funzionare, in realtà ....
BlairHippo,

@Biran, sono d'accordo, bisogna farlo "prima" - non solo per eliminare la noia, ma suppongo che sia il modo giusto di farlo al fine di raccogliere i veri benefici del test unitario.
Preimpostazione

@Biran, grazie! Recentemente ho usato TDD su un mio progetto hobby e ha cambiato il modo in cui penso ai test unitari.
Preimpostazioni

5

Non lo so. Ciò che sicuramente rende il test di unità più piacevole per me è il pensiero di tutto il debug frustrante, lungo, noioso e non gratificante che non dovrò affrontare ogni volta che faccio una modifica nel software :)


2
È interessante. Perché personalmente, quando qualcuno trova un bug nel mio codice, seppellisco la testa nella vergogna, ma allo stesso tempo, il processo di debug per me è in realtà abbastanza divertente e molto più divertente di questo test unitario. È come risolvere un puzzle in cui devi catturare quel bug subdolo.
Preimpostazione

@Preets: sono d'accordo, a volte può essere divertente, ma per me il design è molto più interessante dell'implementazione. Quindi non mi piace dedicare molto tempo all'implementazione. Preferisco che sia semplice e prevedibile, soprattutto perché consente di pianificare orari più affidabili. Per quanto mi piaccia il processo di creazione del software, penso che il risultato sia decisivo.
back2dos,

Oh sono completamente d'accordo! Un sistema con bug casuali può causare notti insonni .. la mia scelta è stata semplicemente una preferenza in un mondo irreale in cui non importava altro che divertirsi!
Preimposta l'

3

La compiaciuta superiorità che provi quando esegui il check-in di codice solido, robusto e stabile. E se scrivi test unitari con uno strumento di copertura del codice, puoi vantarti nei commenti di controllo che la copertura del tuo codice è del 90% o superiore.


3

Ovviamente, c'è la soddisfazione dello sviluppo del primo test e la sensazione che provi quando il tuo design e i test si incontrano. Tuttavia, scrivere test per codici preesistenti / legacy può essere paralizzante e frustrante. Quando il nostro progetto era in uno schema di manutenzione, ho scritto dei test per il codice non testato usando il report di copertura come gioco. Puoi creare un po 'di competizione con te stesso e / o gli altri per aumentare i numeri di copertura. Certo, potresti andare troppo lontano e creare alcuni brutti test, ma può essere un buon motivatore.


poiché il codice legacy non è generalmente facilmente testabile, mi trovo a fatica a scrivere buoni test unitari, quindi non solo il processo è doloroso, ma il risultato (test unitari) non è particolarmente utile: - / Trovo che sia più frustrante .. Il gioco di copertura è comunque buono :)
Preets

1

Cerca di entrare nel flusso . Stabilisci obiettivi difficili ma raggiungibili. Quale potrebbe essere un obiettivo nel test unitario? Ad esempio, prova a scrivere più velocemente mantenendo la qualità. I test unitari non richiedono troppo pensiero, quindi è improbabile che si verifichino errori. Concentrati sul tuo obiettivo e controlla spesso per vedere come ti stai avvicinando.


Sì, perché dici che il test unitario non richiede troppo pensiero? Se lavori con TDD, ciò implica molta riflessione. Non è vero?
Preimposta l'

Hai ragione, non ho preso in considerazione TDD.
Tamás Szelei,

0

A volte per motivarmi, scrivo la mia attuale "copertura del codice" all'inizio della giornata. Quindi ogni volta che scrivo un test e lo faccio passare, eseguo la suite e aggiorno il numero di copertura. È divertente e mi aiuta a ricordare perché lo sto facendo. (Ci sono anche altri motivi, ma mi piacciono i numeri. Forse sono solo io!)


0

Non cercando di illudermi di poter indurre la mia mente a pensare che i test unitari possano essere divertenti per qualsiasi periodo di tempo sostenibile.

Accettare la realtà secondo cui il test unitario non è lì per essere apprezzato mi aiuta molto, facendomi capire che sto cercando qualcosa in un posto dove non avrebbe mai dovuto essere.

In queste brevi escursioni mentali quando arrivo al punto di percepire l'unità di prova come ciò che è realmente, cioè un compito crudelmente, insopportabilmente e noiosamente schiacciante per l'anima, mi chiedo se posso permettermi di lasciarle andare, cioè di non avere elevate garanzie di correttezza funzionale.

Invariabilmente, la risposta è un clamoroso "no".

Accettando il mio destino, continuo a spingere questi oggetti quadrati con lettere, numeri e simboli su di loro di fronte a me, che chiamiamo tastiera, sapendo per esperienza di prima mano che con ogni clic della tastiera, la fine del test dell'unità è più vicina di essa è mai stato.


Non tutti i test sono buoni o utili. Questo è qualcosa che i TDD e gli altri testisti evangelisti di solito non menzionano. Scommetto che in alcuni rari momenti ti piacciono i test unitari quando sai che mette alla prova la logica complessa, il test è elegante e non accoppiato all'implementazione, e piuttosto odio quando sei costretto a testare merde banali solo per raggiungere un obiettivo di copertura del codice lunatico richiesto da linee guida del progetto.
KolA,

@KolA Hai ragione sul fatto che ci sono test unitari impegnativi che richiedono creatività, ma scrivere test unitari infiniti può risucchiare la gioia anche di quelli innatamente interessanti.
bugfoot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.