Come valuta i test automatizzati per un particolare prodotto / progetto?

4

Negli ultimi anni il test automatizzato è stato molto approfondito, con particolare attenzione al TDD a livello di "unità". I vantaggi propagandati includono cose come:

  • Stabilizzazione del codice esistente: le modifiche alla rottura vengono identificate prima della distribuzione
  • Codice di coercizione, in una certa misura, in strutture più piccole e testabili
  • Un codebase che auto-documenta i requisiti
  • Un codebase che auto-documenta l'utilizzo delle sue unità e dei moduli

Gli percepiti svantaggi includono cose come:

  • Maggiore tempo di sviluppo iniziale
  • Aumentate le linee di codice per requisito (codice test + implementazione)
  • I pattern richiesti per determinate funzionalità da testare, in alcuni casi, dicono di aumentare drasticamente la complessità / le linee del codice di implementazione effettivo richiesto per funzionalità
  • Aumentato il requisito delle abilità di sviluppatore
  • Aumento degli strumenti

Ci sono anche alcune semplici limitazioni e impedimenti:

  • I test non possono garantire che il codice sia privo di errori; solo i requisiti specifici, test-codificati
  • I test possono solo convalidare il codice verificabile
  • Alcune interfacce e / o hardware possono essere molto lunghi e proibitivi in termini di tempo per simulare o falsificare
  • Alcuni requisiti non possono [ancora] essere verificati automaticamente (ad es. "sembra buono")

E così, per un dato progetto, sia nuovo che in corso, come dovrebbe un programmatore professionista imparziale pesare queste cose l'una contro l'altra per determinare se una suite di test automatizzata è un guadagno netto?

Oppure, se conoscere in anticipo è troppo confuso da una scienza, aver implementato una suite di test automatizzata, possiamo misurare e / o dimostrare il suo impatto netto?

Ad esempio:

Potremmo concludere "intuitivamente" che un sistema finanziario ampio e ampiamente utilizzato beneficia di una completa suite di test automatizzata. Senza contare alcun numero, il costo dell'aggiunta di molti test significativi "sembra" inferiore alla responsabilità delle transazioni finanziarie che "dimenticano" i conti in cui il denaro è realmente contenuto.

Dall'altra parte, una suite di test di qualsiasi dimensione attorno a un'implementazione PHP del comando echo probabilmente gonfierà il nostro tempo di sviluppo di 10 o 100 volte senza alcun guadagno osservabile.

Ma che dire delle cose tra gli estremi?

    
posta svidgen 28.01.2016 - 23:27
fonte

2 risposte

5

Per me esiste un criterio semplice per decidere se sono necessari test automatici:

Hai intenzione di evolvere e mantenere il progetto? "Sì": dovresti scrivere test.

Ci sono alcuni casi in cui puoi andare senza test, principalmente è "fai una volta e dimentica" il tipo di lavoro, come il piccolo sito web, l'installazione CMS, ecc. Tutto ciò che fai in fretta, verifica se funziona e dimenticalo.

Per qualsiasi cosa siano necessari test più complessi. E non ci sono svantaggi:

Increased initial development time

Questo è un errore molto comune. I test riducono i tempi di sviluppo in qualsiasi fase di sviluppo.

Se non scrivi test il processo di sviluppo è il seguente:

  • Scrivi un nuovo codice, spesso toccando anche un vecchio codice
  • Verifica manualmente se funziona
  • Indovina cos'altro può essere rotto dalle tue modifiche, ricontrollalo anche
  • Se sei fortunato, puoi trovare qualcosa che ha funzionato prima, ma ora è rotto (regressioni)
  • Vai a risolverlo
  • Ripeti il processo di test / correzione

Oltre al tuo obiettivo principale (scrivere il nuovo codice), devi fare un sacco di lavoro noioso e ripetitivo. La quantità di questo lavoro cresce molto rapidamente man mano che il progetto si evolve.

Ciò che è ancora peggio è che devi fare questo noioso lavoro ripetitivo e non puoi ancora garantire che non hai infranto nulla che funzionasse prima. Non puoi garantire di aver ben testato tutti i casi per il nuovo codice.

Bug e regressioni andranno in produzione. Per l'utente è davvero fastidioso vedere gli aggiornamenti quando le nuove funzionalità non funzionano come previsto e le vecchie funzionalità non funzionano. E questi bug mangeranno ancora più tempo - utenti, supporto, manager e sviluppatori, tutti passeranno il tempo a cercare e correggere questi bug.

Confronta questo con lo scenario in cui esegui test e aggiungi test per qualsiasi bug che risolvi:

  • Scrivi un nuovo codice, spesso toccando anche un vecchio codice
  • Aggiungi test per il nuovo codice
  • Esegui la suite di test
  • Correggi errori
  • Ripeti fino a quando non passa

Il test / ciclo di correzione con test automatici sarà molto più rapido rispetto al test manuale e testerà di nuovo tutto ciò che funzionava prima. Non puoi nemmeno sognarlo con un test manuale.

L'unico passaggio aggiuntivo è add tests for the new code . Ci vorrà molto meno tempo di tutti gli sforzi e i problemi aggiuntivi che hai con i test manuali. Inoltre non è noioso né ripetitivo - questo è qualcosa che i programmatori dovrebbero fare e possono fare - scrivere il codice.

Sì, non puoi ancora garantire che non ci siano errori. Ma sei sicuro che tutte le funzionalità esistenti funzionino e che funzioni anche la nuova funzione (almeno in quei casi per cui hai aggiunto nuovi test).

Increased lines of code per requirement (test code + implementation)

Forse, ma le linee di codice non significano nulla quando sappiamo che i test salvano il tempo di sviluppo.

Ad esempio, devi implementare un calendario popup sul tuo sito web:

  • Programmatore A si occupa di linee di codice e scrive il calendario in puro JS in 3000 righe di codice e ci vogliono due settimane
  • Il programmatore B è incauto, ottiene jquery + jquery ui + qualche plugin e aggiunge 50000 righe di codice, ci vogliono 3 ore

Che cosa preferisci?

The patterns required for certain features to be testable is, in some cases, said to drastically increase complexity / lines of actual implementation code required per feature

Ancora, questo è un errore.

Gli stessi schemi richiesti per i test migliorano anche la struttura del codice. Il test ti fa dividere il codice in unità piccole, riutilizzabili e testabili indipendentemente ed è solo una vittoria per la struttura generale del codice.

Increased developer skills requirement

Non esattamente vero. Anche se hai sviluppatori principianti che devono scrivere test unitari, dovranno anche imparare come organizzare il loro codice in modi migliori e miglioreranno come programmatori.

Se non è necessario scrivere test, verrà implementato un intero progetto come un disastro solido, che andrà a pezzi molto rapidamente. L'aggiunta di una nuova funzione genererà 10 nuovi bug e ad un certo punto non sarà possibile aggiungere nuove funzionalità.

Increased tooling

Non sono sicuro di aver capito questo punto.

Vuoi dire che dovrai usare un server di Continuous Integration? Questa è una buona cosa. Ti aiuterà ad abbreviare il ciclo di "sviluppo-rilascio" e non avrai paura di dare agli utenti la nuova versione.

Intendi un'infrastruttura per scrivere ed eseguire test? Ci sono molte opzioni disponibili per ogni linguaggio di programmazione.

Riguardo ai limiti generali dei test unitari che hai menzionato: questi sono reali e ti consigliamo di risolverli una volta che inizi a scrivere test.

Ma non è questo il motivo per cui non ci sono test. Scrivi test dove è possibile, prova manualmente il resto e troverai rapidamente alcuni modi per aggiungere test anche per il resto, solo per evitare questo noioso compito.

    
risposta data 29.01.2016 - 15:23
fonte
0

"Tutta la verità passa attraverso tre fasi: in primo luogo, viene ridicolizzata, in secondo luogo è violentemente opposta, in terzo luogo viene accettata come ovvia". - Schopenhauer

A livello macro l'argomento è stato molto tempo fa con test formali. L'argomento era che i programmatori sono professionisti altamente qualificati che dovrebbero scrivere codice senza difetti. Questo è ovviamente ridicolo (anche se ciò fosse vero) entrano in gioco molti fattori esterni:

  • Requisiti mutevoli / mutevoli
  • Modifica dell'ambiente
  • Tempo limitato per testare
  • Modifiche nei sistemi esterni
  • Diverse aspettative per vari utenti
  • Affaticamento della funzionalità

Il vantaggio che non sembra mai essere discusso con i test automatici delle unità durante lo sviluppo è che un test fallito fallisce presto . È fin troppo facile solo aggiustare il test e procedere allegramente sulla tua strada. Ma considera quanto sarebbe stato costoso il cambiamento se il software fosse stato spedito.

Quindi ... la tua domanda. Risposta semplice - non lo fai. La vera natura del software è che non ci sono due pezzi uguali, quindi non è sempre possibile confrontare come con simili. Questo è qualcosa che il laico medio non capisce. Piangono: "Perché ci sono insetti?" Ma la verità è che ogni nuovo pezzo di software è essenzialmente un prototipo - verruche e tutto.

Qualcosa che puoi misurare, tuttavia, è un errore nelle build del server CI . Se i test vengono superati, lo sviluppatore non ha eseguito i test o si è verificato un problema con la configurazione unione / build. I guasti segnalati qui indicano i guasti che si sarebbero verificati in futuro quando sarebbero stati potenzialmente più costosi da risolvere.

    
risposta data 29.01.2016 - 12:00
fonte

Leggi altre domande sui tag