Creazione automatica di test unità

11

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

Mi rendo conto che una soluzione automatica completa non è pratica, ma mi piacerebbe velocizzare la creazione del test almeno creando uno scheletro. Non sto cercando esempi di codice, solo forse alcuni suggerimenti su dove iniziare o esempi di dove qualcosa di simile è stato fatto 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 che gli altri linguaggi permettono, come completare suggerimento tipo , ad esempio.

    
posta VirtuosiMedia 18.09.2011 - 03:54
fonte

3 risposte

5

La tua strategia e la tua ossatura dipendono, non banalmente, dal tipo di test che stai cercando di generare, dal tipo di copertura che stai cercando e dalla lingua / ambiente in cui lavori.

È 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 angolari standard (passando in 0, 2 valori casuali, MAX_INT, MIN_INT, a un argomento intero, null per nullable, ecc ...). È quindi possibile eseguire i test generati, registrare i risultati per ciascun test e filtrarli manualmente per rimuovere quelli non pertinenti, approvare i risultati accettabili per i test che passano (in modo che possano passare automaticamente da quel momento) e contrassegnarli come non validi che non riescono .

Puoi aumentare questo con il tagging / commenting / refactoring delle classi per aiutare il tuo generatore con suggerimenti extra. Potresti avere un tag che elenca tutte le possibili eccezioni che una chiamata al metodo può sollevare o che fornisce un intervallo ridotto di numeri interi validi per un argomento intero. Guarda questi come una scorciatoia per dover scrivere i test da soli.

Quindi, ecco alcuni componenti che vorrai vedere:

  • Un componente per analizzare automaticamente il codice sorgente / le firme delle funzioni / annotazioni manuali, producendo casi di test standard o profili / firme per i casi di test che attendono il completamento dell'input.
  • Una lingua perpetuamente crescente / mutevole di tag / annotazioni / commenti che possono raggiungere qualsiasi livello di granularità (metodo / classe / firma / while loops / etc ...) che rappresentano suggerimenti per il builder di test automatizzato. Idealmente dovresti essere in grado di giocare con questa lingua senza dover ricodificare il tuo framework o qualsiasi chunk in esso
  • Test runner automatizzato, con la capacità di identificare nuovi / vecchi test e registrare / test contro risposte "accettabili" per ciascun test. Idealmente questo runner costruirà un database di esecuzioni di test, risultati accettati / rifiutati e risultati accettabili per ogni test.
  • Automatico "object faker" che, dato un nome di classe e una mappa di nomi- e gt; valori, può generare un oggetto che imita la classe, restituendo dati personalizzabili per chiamate di funzioni, accessor, dati pubblici, ecc ...

Esistono molti framework di test che includono già parti di questa funzionalità per vari linguaggi e piattaforme. Mentre è abbastanza facile iniziare a fare questo lavoro tu stesso e far crescere questo tipo di struttura organicamente in-house, è anche un progetto a lungo termine senza fine che probabilmente duplicherà il lavoro esistente. Ti consigliamo di dedicare un po 'di tempo a guardare prima a ciò che è disponibile e poi a decidere se valga la pena di tuffarsi.

    
risposta data 18.09.2011 - 05:20
fonte
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 automatizza la generazione di unità test per le applicazioni Java . Ho anche trovato un prodotto commerciale, Test C ++ di Parasoft , che sembra consentire la generazione di C ++ test unitari

Queste applicazioni utilizzavano l'euristica per generare casi di test. Non sono sicuro che ci sia un singolo framework che puoi usare per produrre uno scheletro, ma ci sono dei costrutti che puoi cercare. Tendo a concentrarmi sui cicli, sulle istruzioni condizionali ( if blocchi, switch / case istruzioni) e sulle eccezioni e creo casi di test che impongono l'esecuzione di diversi percorsi di esecuzione.

Non mi concentrerei sull'accelerare la scrittura dei test cercando di creare uno scheletro o un modello, ma piuttosto migliorando l'analisi delle specifiche e / o dell'implementazione e scrivendo test di alta qualità. Essere in grado di identificare quali test aggiungere il maggior valore in anticipo, scriverli e quindi riempire i buchi in un secondo momento avrebbe un impatto maggiore sulla produttività e sulla qualità.

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

    
risposta data 18.09.2011 - 04:12
fonte
1

Ho scritto un generatore per accelerare i test unitari per un progetto .NET alcuni anni fa. C'era un grande numero di codice senza test di unità e mirava ad aumentare rapidamente la copertura di base. Ecco alcune note che potrebbero essere d'aiuto:

  • La mia possibilità era che il framework principale su cui si basava il progetto sviluppato fornito operazioni standard e denominazione di classe. Se tu sei pensando di scrivere da solo, una struttura standard come questa aiuta molto.
  • L'utilizzo di data-driven testing è di grande aiuto, se consentito dal tuo codebase. Il framework di test ha creato una tabella di database per ogni unit test per memorizzare 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 rappresentanza ). Da questo momento in poi, i test effettivi potrebbero essere facilmente creati automaticamente o inseriti manualmente.
  • I test unitari risultanti erano semplici ma serviti come smoke test s almeno. Per le aree a maggior rischio, sono stati scritti test manuali aggiuntivi.

Per riassumere, sono d'accordo sul fatto che una soluzione generica sarebbe poco pratica (se possibile). Credo che le possibilità siano migliori se il codebase è adatto 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)

    
risposta data 16.10.2011 - 14:17
fonte

Leggi altre domande sui tag