Automatizzare la creazione di unit test


11

Quali sono alcune strategie che potrebbero essere utilizzate per automatizzare la creazione di casi di unit test? Quali aspetti avresti bisogno di esaminare in ogni classe per essere in grado di generare almeno uno scheletro decente per i test?

Mi rendo conto che una soluzione automatica completa non è pratica, ma mi piacerebbe accelerare un po 'la creazione del test creando almeno uno scheletro. Non sto cercando esempi di codice, forse solo alcuni suggerimenti su dove iniziare o esempi su dove è stato fatto qualcosa del genere in modo che io possa vedere come si sono avvicinati e cosa potrebbe essere possibile.

Sono particolarmente interessato ai metodi per la creazione di scheletri di unit test in PHP, che non fornisce tutti gli strumenti offerti da altre lingue, come ad esempio il suggerimento completo sul tipo .


Visual Studio più recente è tutto ciò che serve ...
Lavoro

Risposte:


5

La tua strategia e il tuo scheletro dipendono, in modo non banale, dal tipo di test che stai cercando di generare, dal tipo di copertura che stai cercando e dal linguaggio / ambiente in cui stai lavorando.

È abbastanza semplice scrivere un generatore di test che, per linguaggi come C o Java, legge le firme di classe e genera automaticamente test per casi d'angolo standard (passando 0, 2 valori casuali, MAX_INT, MIN_INT, a un argomento intero, null per nullables , eccetera...). È quindi possibile eseguire i test generati, registrare i risultati per ciascun test e filtrarli manualmente per rimuovere quelli irrilevanti, approvare i risultati accettabili per i test che superano (in modo che possano passare automaticamente da quel momento in poi) e contrassegnarli come non validi che falliscono .

Puoi aumentarlo con tag / commentare / refactoring delle classi per aiutare il tuo generatore con suggerimenti extra. È possibile che sia presente un tag che elenca tutte le possibili eccezioni che è possibile generare una chiamata al metodo o che fornisce un intervallo ridotto di numeri interi validi per un argomento intero. Guarda questi come una scorciatoia per dover scrivere tu stesso i test.

Quindi, ecco alcuni componenti che vorrai guardare:

  • Un componente per analizzare automaticamente il codice sorgente / le firme delle funzioni / le annotazioni manuali, producendo casi di test standard o contorni / firme per i casi di test che attendono il completamento dell'input.
  • Un linguaggio in continua crescita / modifica di tag / annotazioni / commenti che può andare a qualsiasi livello di granularità (metodo / classe / firma / mentre cicli / ecc ...) che rappresentano suggerimenti per il generatore di test automatizzato. Idealmente, dovresti essere in grado di giocare con questa lingua senza dover ricodificare il tuo framework o blocchi in esso
  • Runner di test automatizzato, con la possibilità di identificare nuovi / vecchi test e registrare / test con risposte "accettabili" per ogni test. Idealmente, questo corridore costruirà un database di esecuzioni di test, risultati accettati / rifiutati e risultati correnti accettabili per ciascun test.
  • "Costruttore di oggetti" automatizzato che, dato un nome di classe e una mappa di nomi-> valori, può generare un oggetto che imita la classe, restituendo dati personalizzabili per chiamate di funzione, accessori, slot di dati pubblici, ecc ...

Esistono molti framework di test che includono già blocchi di questa funzionalità per varie lingue e piattaforme. Mentre è abbastanza facile iniziare a fare questo lavoro da soli e far crescere questo tipo di framework organicamente internamente, è anche un progetto a lungo termine senza fine che probabilmente duplicherà il lavoro esistente. Ti consiglierei di dedicare un po 'di tempo a esaminare prima cosa è disponibile e poi decidere se vale la pena tuffarsi.


5

Non ho ancora avuto la possibilità di usarlo su un'applicazione di dimensioni o complessità significative, ma ci sono strumenti, tra cui CodePro AnalytiX di Google , che automatizzano la generazione di unit test per applicazioni Java . Ho anche trovato un prodotto commerciale, il test C ++ di Parasoft , che sembra consentire la generazione di test unitari C ++

Queste applicazioni hanno utilizzato l'euristica per generare casi di test. Non sono sicuro che esista un singolo framework che puoi usare per produrre uno scheletro, ma ci sono costrutti che puoi cercare. Tendo a concentrarmi su loop, istruzioni condizionali ( ifblocchi, switch/ caseistruzioni) ed eccezioni e creare casi di test che impongono l'esecuzione di percorsi di esecuzione diversi.

Non mi concentrerei sull'accelerazione della scrittura dei test cercando di creare uno scheletro o modello, ma piuttosto migliorando l'analisi delle specifiche e / o l'implementazione e scrivendo test di alta qualità. Essere in grado di identificare quali test aggiungono più valore in anticipo, scrivere quelli e poi riempire i buchi in seguito avrebbe un impatto maggiore sulla produttività e sulla qualità.


Solo per fornire un po 'più di pubblicità, Falcon ha provato CodePro su un progetto e ha scritto un po' di confusione sulle sue esperienze .


CodePro Analytix di Google sembra interessante. Ma "Quis custodiet ipsos custodes?" Chi mette alla prova le prove? Questo può essere usato solo per eseguire il backup di un progetto esistente mediante test unitari e probabilmente non rileverà guasti, piuttosto supporrà che i difetti siano corretti.
Falcon,

@Falcon Non puoi fidarti ciecamente di alcuno strumento, perché ciò causerà solo più mal di testa. Penso che il consiglio del programmatore pragmatico "cura del tuo mestiere" si applichi qui. CodePro contiene un editor di test per rendere banale vedere quali valori vengono passati e quale sia il risultato atteso, quindi apportare modifiche ad esso (e quindi aggiornare il codice di test generato per riflettere tali modifiche).
Thomas Owens

Mi chiedo solo cosa sia più affidabile in questo caso, umano o macchina. Penso che quei test generati causeranno più mal di testa rispetto ai test scritti manualmente. Idealmente il test dovrebbe essere scritto prima comunque. Ma ci proverò sicuramente. Mi piacerebbe vedere uno strumento in grado di generare test basati su requisiti formali e alcuni collanti di metadati per interfacciare il sistema un giorno.
Falcon,

@Falcon Sì, idealmente alcuni test dovrebbero essere scritti per primi, ma fino a quando non si dispone di un'implementazione e si può fare il test in white box, non si vede necessariamente tutti i diversi casi limite che si possono vedere una volta implementata. Se hai la possibilità di giocare con le funzionalità di generazione di test di CodePro, potresti pubblicare i tuoi pensieri da qualche parte e in qualche modo procurarmi un link? Sono interessato a vedere come funziona e l'esperienza degli altri con esso.
Thomas Owens

Lo proverò la prossima settimana con un'applicazione J2EE di medie dimensioni (120 kloc) che incorpora alcune regole aziendali davvero difficili e ti racconterà delle mie esperienze qui.
Falcon,

1

Ho scritto un generatore per accelerare i test unitari per un progetto .NET qualche anno fa. C'era una base di codice di grandi dimensioni senza test unitari e mirava ad aumentare rapidamente la copertura di base. Ecco alcune note che potrebbero essere di aiuto:

  • La mia possibilità era che il framework di base sul quale era stato sviluppato il progetto fornisse operazioni standard e denominazione delle classi. Se stai pensando di scrivere il tuo, una struttura standard come questa ti aiuterà molto.
  • L'uso data-driven testingaiuta molto, se il tuo codebase lo consente. Il framework di test ha creato una tabella di database per ogni unit test per archiviare i dati di test, in modo che ogni riga in quella tabella fosse un test separato e non fosse richiesto alcun codice aggiuntivo ( regola di rappresentazione ). Da questo punto in poi, i test effettivi potrebbero essere facilmente creati automaticamente o inseriti manualmente.
  • I test unitari risultanti erano semplici ma smoke testalmeno servivano come s. Per le aree a rischio più elevato, sono stati scritti test manuali aggiuntivi.

Riassumendo, concordo sul fatto che una soluzione generica sarebbe poco pratica (se possibile). Credo che le possibilità siano migliori se la base di codice è adatta per la generazione di test e il framework di test può trarre vantaggio dalla sua struttura.

(Come nota a margine, c'è Pex , ma è per .NET)

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.