Come evitare il circolo vizioso dei test tramite il cliente

4

Recentemente ho chiesto a questa domanda e questo commento e mi ha fatto riflettere tutto il processo di rilascio di un aggiornamento ai clienti. Il prossimo aggiornamento per il nostro software è pianificato e la volta precedente è andato terribilmente storto a causa di regressione, test errati, ecc ...

Questa volta vogliamo impedire lo scenario che testiamo tramite il nostro cliente e fatto alcuni test unitari e altri piccoli miglioramenti. Tuttavia, non c'è abbastanza tempo per fare test unitari per tutte le funzionalità che mancano test unitari o le caratteristiche che devono ancora essere costruite. Quindi la risposta a questa domanda "Fai più test di unità" non è adatta a causa della mancanza di tempo, infrastruttura ecc ...

Tutti i bug e le funzionalità saranno testati / revisionati da uno sviluppatore diverso, ma ciò non sarà fatto perfettamente, naturalmente (siamo ancora umani:)).

La mia domanda è: una volta rilasciato l'aggiornamento, come impedire il circolo vizioso dei test tramite i clienti senza poter aggiungere ulteriori test unitari?

La volta precedente abbiamo fatto del nostro meglio per testare il software prima e dopo il rilascio. Dopo la scadenza stavamo ancora cercando e risolvendo bug, ma il cliente avrebbe trovato anche alcuni di questi. Quindi pubblichiamo un aggiornamento non appena eravamo sicuri che la patch stava aumentando la qualità. Siamo stati così occupati a trovare bug e a correggerli che non stavamo spendendo un po 'di tempo per creare test unitari.

Questa volta non abbiamo ancora un piano solido, quindi la domanda. Come detto prima abbiamo aggiunto alcuni test unitari, ma sicuramente non abbastanza. Stiamo anche cercando nuovi colleghi, ma non sono facili da trovare e la direzione ha standard piuttosto elevati. Abbiamo un bel po 'di candidati e sembra che avremo almeno un nuovo collega molto presto, ma ci vuole ancora del tempo per farlo funzionare. La prima cosa su cui metteremo il nuovo collega sarà la creazione di test unitari. Quindi le dipendenze ci sono esperienza, abilità e il tempo in cui lui / lei può unirsi al tempo.

Un altro problema che viene alla luce con la mancanza di sviluppatori è che siamo così concentrati su come correggere bug e funzionalità che non abbiamo molto tempo da dedicare a pensare a "come possiamo migliorare il processo di aggiornamento". (Chiedo queste domande nel mio tempo libero).

Riepilogo dei passaggi che proverò a fare:

  • Cerca di ottenere un tester prima che il rilascio sia completato
  • Aggiungi test unit durante la creazione delle funzioni, se non c'è abbastanza tempo, pianificale per dopo il rilascio.
  • Dopo il rilascio, se c'è una regressione, crea dei test unitari quando correggi i bug.
  • Rilasciare più spesso in blocchi più piccoli dopo il rilascio, rendendo più semplice rilasciare funzionalità e riparare bug con una priorità minore.
posta Mixxiphoid 13.03.2014 - 19:43
fonte

6 risposte

15

C'è molto altro da provare rispetto al test unitario. È necessario testare le nuove funzionalità e correzioni di bug che sono state create manualmente in un ambiente di test che rispecchia l'installazione del mondo reale nel miglior modo possibile. La modifica di una delle altre recensioni degli sviluppatori è non un livello appropriato di test per due motivi. In primo luogo, ciò implica che gli daranno una rapida occhiata e poi diranno "certo, funziona". Due, gli sviluppatori usano il software in modo diverso dagli utenti finali - in particolare il software che hanno scritto - in modo che non possano rilevare problemi che un utente finale vedrà immediatamente. Idealmente, è necessario che qualcuno che non è uno sviluppatore esegua una lista di controllo per verificare che il cambiamento funzioni correttamente prima che un cliente riesca a metterci le mani sopra. Sospetto che se stavi testando accuratamente in questo modo, non avresti mai ricevuto 3 patch alla settimana.

Espandendoti un po 'in base alla tua altra domanda ...

Devi anche entrare in un programma di rilascio. Le versioni multiple a settimana sono troppo alte per darti il tempo necessario per testare a fondo una release. Questo è particolarmente vero se stai vedendo un problema delle tue patch che introducono nuovi bug. Se sei preoccupato che un cliente venga trattenuto in attesa di una correzione se viene introdotto un bug in una patch, è meglio dargli un modo semplice per tornare alla versione precedente e attendere che la prossima data di rilascio pianificata ti non stanno affrettando le cose fuori dalla porta. Il mio consiglio è di provare un programma di rilascio di 1 mese all'inizio. La gestione aziendale può resistere a questo perché vogliono apparire "reattivi" ai clienti. Avendo visto quell'atteggiamento nelle aziende per le quali ho lavorato, ti assicuro che non stai facendo al cliente alcun favore dando loro aggiornamenti impropriamente testati. Molti decisori non tecnici respingeranno questo perché non riesaminano il problema. Sfortunatamente tutto ciò che puoi fare è portare un cavallo all'acqua ... non puoi farlo bere. È tua responsabilità professionale dirgli la saggia condotta dell'azione, e non la tua se non la seguiranno.

    
risposta data 13.03.2014 - 20:13
fonte
5

La risposta è più test. Sfortunatamente, questa non è la risposta che vuoi sentire, ma è davvero l'unica soluzione. Come hai notato, l'ultimo roll-out è andato disastrosamente, il che è molto dannoso per la soddisfazione del cliente. Sarebbe meglio costruire un prodotto solido con meno nuove funzionalità rispetto a costruire un sacco di funzionalità buggy su una base infestata. "Questa è una grande novità, ma purtroppo ha cancellato tutti i miei dati!"

Per le caratteristiche ancora non scritte, scrivere senz'altro test (e la mia opinione sarebbe di fare almeno la programmazione prima del test se non il TDD completo). Questi sono greenfields, quindi puoi fare gli sforzi per renderli buoni fin dall'inizio. Dare priorità alle nuove funzionalità e fare prima le più importanti. Meno funzioni importanti saranno meno perse per un rilascio se funzionano bene.

Per le funzioni già scritte, dai la priorità a quelle in una lista e fatti strada attraverso quella. Ovviamente i tuoi progressi dipenderanno dall'importanza di ciascuna funzionalità e dall'importanza dello sviluppo di nuove funzionalità, ma avrai il tempo di lavorare su questo elenco come puoi.

Per i bug, specialmente per i bug, scrivi i test quando li correggi . Il test può essere solo una guardia contro ciò che hai fissato per iniziare, ma almeno sai che non farai più quell'errore.

Ho esperienza personale con questo tipo di flusso di lavoro e posso dire che ho avuto risultati positivi. Può essere una vera e propria baraonda, ma funziona meglio.

    
risposta data 13.03.2014 - 20:30
fonte
3

Concentrati solo su un buon lavoro con i tuoi compiti.

Lavorare per diventare uno sviluppatore migliore. Risolvi le tue imperfezioni prima di preoccuparti di quello dell'azienda.

Crea una reputazione in azienda come persona che può essere considerata attendibile con un incarico. Metti alla prova il tuo lavoro. Scrivi test unitari per le tue modifiche. Dimostrare il comportamento di uno sviluppatore professionista che crea software di qualità.

Quando arriva il momento ti chiedono "Come fai? Tutti gli altri sono molto meno efficaci" .

Una volta che hai il loro orecchio. Saranno disposti ad ascoltare, ma prima devi dimostrare che la qualità è possibile.

Il primo passo per introdurre cambiamenti nelle persone intorno a te. È prima di cambiare te stesso. Il software di qualità inizia prima con l'individuo.

Il vantaggio nel cambiare il modo di lavorare è che attrarrà persone affini. Un vantaggio è che spesso attrae persone esterne all'azienda. Mentre il tuo attuale datore di lavoro potrebbe non abbracciare il nuovo tu e adottare un atteggiamento di controllo della qualità. Ci sono altre aziende che ti apriranno le porte. Scoprirai di avere più cose in comune con i loro obiettivi, quindi gli obiettivi del tuo attuale datore di lavoro.

    
risposta data 13.03.2014 - 21:24
fonte
1

Devi testare in modo intelligente. Per ora, crea un albero di dipendenza dei file / caratteristiche / componenti nel sistema. Segna quelli che hanno lavorato su di loro, prova quelli e altri file / caratteristiche / componenti che dipendono da loro.

Ciò che ti permette di fare è scrivere, o eseguire, testare chirurgicamente. Hai bisogno di:

Tester

Da quello che sto sentendo, non hai un sacco di codice di test. Hai bisogno di corpi in poltrone, che non siano sviluppatori (idealmente le persone più vicine a ciò che è un cliente, ma con esperienza / abilità di prova). Queste persone dovrebbero martellare le funzionalità, che hai identificato necessitano di test, con tutti i tipi di casi ben testati. La progettazione / selezione del caso di prova è un compito rigoroso di per sé (tutte le volte che ho visto test ridondanti nei piani di test).

Codice di prova

Anche in questo caso, i test unitari possono essere utili, ma sono spesso troppo granulari per la situazione in cui ti trovi. Sono necessari test di integrazione. Scrivi rigorosi test case per gli input / output per i tuoi clienti / componenti. Otterrai una copertura dei test migliore in un breve lasso di tempo con test di integrazione mirati e ripetibili. A breve termine, cerca di non sovrapporre il codice di test di integrazione con i casi di test eseguiti dai tester a meno che non sia un componente critico.

    
risposta data 13.03.2014 - 22:16
fonte
1

C'è molto di più da testare di test unitari, test di regressione o test esplorativi. Il testing delle unità ha un valore così alto, i test di scrittura che il programmatore sa che passeranno ora, è utile solo per popolare una suite di regressione o per guidarti prima che il codice venga scritto come in Test Driven Development.

C'è un ottimo diagramma sul sito di Lisa Crispin che parla di i "quadranti di prova agili". Parla di quattro quadranti divisi tra

Faccia a faccia rispetto alla tecnologia

(Functional Test ecc.) / (Scenari ecc.)

Supporting the Team vs Critiquing the Product

(Test unitari ecc.) / (test di ilimitazione, ad es. scalabilità, usabilità ecc.)

C'è un buon libro, Agile Testing che parla molto di tutti gli altri tipi di test a parte i test unitari. Non è facile farlo, soprattutto sotto la pressione del tempo ed è difficile per tutti i programmatori, e molto difficile per alcuni, pensare nel modo analitico necessario per testare questo approccio, ma è il modo migliore che ho trovato finora.

Analizzando ogni nuova funzionalità considerando almeno ogni quadrante, puoi decidere rapidamente cosa deve essere fatto e cosa può essere lasciato fuori o differito.

Per poter decidere cosa deve essere fatto, hai davvero bisogno di una buona idea dello stato del tuo prodotto. Quali aree sono una preoccupazione? Quali caratteristiche conosci non sono affidabili come il resto del prodotto? Hai anche bisogno di un modo per acquisire sicurezza in un candidato per il rilascio. Quanto tempo ci vuole tra la scrittura di una nuova funzione e lo sviluppatore che è in grado di vedere se ha infranto qualcos'altro? Quanto tempo ci vuole per essere in grado di ottenere una build up e in esecuzione e vedere se il prodotto funziona come previsto, non solo vedendo che la funzione restituisce il valore 'corretto', ma interagendo con il sistema come lo farà l'utente e vedendo se esso agisce come mi aspetto?

L'altra parte non testante del test è che quando si prendono in considerazione altri tipi di test (non test di unità), si stanno convalidando i risultati rispetto a ciò che l'utente si aspetta? Stai facendo test di usabilità in sala (ottenendo qualcuno che non è nel tuo team, chi non conosce il codice o che cosa si suppone debba fare per provare a interagire con il sistema per vedere se ha senso)? Le tue User Story (o serie di compiti di alto livello da completare) parlano dell'utilizzatore finale e di cosa si aspettano di accadere e del motivo per cui stanno usando il prodotto in questo modo, cosa stanno cercando di ottenere, a cosa si preoccupano? Stai verificando che ciò che stai costruendo è ciò di cui l'utente ha bisogno o solo un'approssimazione ingegnerizzata di un set di funzionalità che assomiglia a ciò che hanno chiesto?

Se un'organizzazione pensa che il test (il dipartimento / team / individui / o gli sviluppatori che lo stanno facendo questa settimana) stia facendo un lavoro così scarso che è diventato un problema per il business (a volte è opportuno mettere fuori bacato software, agli sviluppatori di software professionali non piace, sembra come se qualcuno grattasse una lavagna, ma ciò non significa che sia sbagliato), quindi direi che la maggior parte delle volte non è un problema che può essere risolto da qualsiasi test, strategia di test o pratiche "agili", ma sono le pratiche di sviluppo che hanno bisogno di guardare, gli atteggiamenti o la burocrazia e il processo attorno ai requisiti e allo sviluppo e le persone che non realizzano le conseguenze delle loro attuali pratiche.

    
risposta data 13.03.2014 - 23:19
fonte
1

Riduzione del dolore

Un approccio che può funzionare e non è stato ancora menzionato qui è quello di ridurre il costo del fallimento. Un fattore che contribuisce all'entità del disastro della tua ultima versione è il dolore causato al cliente. Se rendi banale il rollback di una versione - speriamo in modo self-serving in modo che i clienti siano minimamente disturbati, allora puoi rilasciare con più sicurezza che la tua versione del software non rovinerà il giorno di nessuno.

Ora, questo ovviamente aggiunge più complessità al tuo prodotto, costando la sua quantità di tempo e budget per implementare e introdurre un altro canale per i bug. Soprattutto se la tua app è responsabile della gestione di grandi quantità di dati dei clienti, questo potrebbe essere più problematico di quanto valga. (Come dire? Se ti affidi a un archivio di file system senza ganci di sorveglianza o auto-caricamento, probabilmente sei al sicuro. Se installi un database sul computer di un cliente, devi essere molto cauto.)

Tuttavia, se hai una semplice applicazione desktop, ci sono molti modi per rendere indolore lo scambio delle versioni. Potresti anche prendere la precauzione di forzare i clienti a fare il backup dei loro dati prima di aggiornarli. Oppure se una parte delle nuove funzionalità include un nuovo formato di file, è possibile convertire automaticamente i file al primo caricamento e impedire all'utente di sovrascrivere i file delle versioni precedenti.

Questo approccio è ancora più pratico se si ospita la tua applicazione sul web. In tal caso, un browser essenzialmente scarica e re-installa il tuo software ogni volta che il cliente carica una pagina.

Priorità test

L'altro modo per costruire rapidamente la tua suite di test con test ad alta priorità è richiedere che ogni bug risolti includa un test che fallisce se il bug non viene corretto e passa quando lo fa. Cbojar ha menzionato questo nella loro risposta, ma ho voluto spiegare i molti motivi per cui questa è una buona idea.

Questo approccio è spesso popolare con la gestione, perché non richiede un blocco iniziale della scrittura del test e risolve i problemi dei tuoi clienti in tempo reale. Quindi, quando un cliente si imbatte in un bug e si lamenta ad alta voce, puoi dire "Sì, abbiamo corretto quel bug per te. E siamo fiduciosi che non accadrà mai più." E questo è un ulteriore incentivo per scrivere il test e scriverlo accuratamente e bene, perché sai che un cliente dipende da questo.

    
risposta data 14.03.2014 - 14:43
fonte

Leggi altre domande sui tag