Come sono stati generati automaticamente i test unitari di Guava?


31

Guava ha generato automaticamente casi di test unitari :

Guava ha un numero sbalorditivo di test unitari: a partire da luglio 2012, il pacchetto guava-test include oltre 286.000 casi di test individuali. La maggior parte di questi sono generati automaticamente , non scritti a mano, ma la copertura dei test di Guava è estremamente approfondita, specialmente per com.google.common.collect.

Come sono stati generati? Quali tecniche e tecnologie sono state utilizzate per progettarle e generarle?


Ricordo di aver visto un discorso di un amico di Google che ha toccato questo argomento. Nessun indizio sul nome, però, il discorso è stato ad una convention di Java credo
Zavior,

3
Il pacchetto com.google.common.collect.testing ha molte classi con "Generatore" nei loro nomi - facendolo sembrare un framework per la generazione di test. Ci sono anche sotto-pacchetti con classi documentate come "scheletri" o "classi base" per i test ...
moscerino

1
@gnat Sì, ero sicuro di averlo visto da qualche parte. com.google.common.collect.testing.features, ad esempio, mostra le caratteristiche / i vincoli che una classe di raccolta dovrebbe soddisfare e un caso di prova ne è una combinazione. In questo modo possono parametrizzare i test
dzieciou


La domanda ha ricevuto molta attenzione dalla comunità, ma finora nessuna risposta ragionevole, quindi ho seguito il suggerimento di Martin e l'ho messo qui: sqa.stackexchange.com/questions/5214/… .
dzieciou,

Risposte:


8

Gran parte di questa massa di test riguarda le implementazioni della raccolta Guava. Hanno scritto test generici che testano in modo esauriente le interfacce di raccolta e questo genera una suite per implementazione. Si veda, ad esempio, le classi chiamate CollectionAddAllTester, ListIndexOfTester.

Tutto questo è supportato da una libreria chiamata testlib, che viene fornita come parte di Guava. Questo è abbastanza generico. Supporta la scrittura di test generici per qualsiasi interfaccia (non solo raccolte). È possibile specificare Features di possibili implementazioni e testarle (ad es. Se il set non è modificabile, ci si aspetta un risultato diverso da set.add()) e quando si eseguono i test si specifica quali funzionalità supporta l'implementazione.

È basato su JUnit 3, non su 4. Normalmente, hai una classe che si estende TestCasepiena di metodi denominati testSomething()e JUnit li esegue in modo riflessivo. La libreria testlib si collega all'esecuzione di questi test in modo che il ciclo di vita sia simile al seguente:

  • Per ogni implementazione che si desidera verificare
  • Per ciascun metodo di prova (applicabile)
  • Crea l' TestCaseistanza
  • Inizializza il TestSubjectGenerator- questa è l'interfaccia testlib che estendi dove crei effettivamente l'oggetto del test
  • Esegui il metodo di prova in modo riflessivo. Durante questo metodo, getSubjectGenerator()consente di accedere all'argomento del test

Il bit chiave è la fase di inizializzazione aggiuntiva che consente loro di iniettare un soggetto di test specifico nel caso di test generico.

Ho scritto un post su come scrivere suite di generazione testlib per le tue interfacce.

(Anche pubblicato sulla stessa domanda sul sito sqa .)


6

Ci sono generatori di unit test. Ad esempio, nel mondo .NET, qualcosa come Microsoft Pex potrebbe farlo.

Ad esempio, Microsoft Pex prova in base all'analisi del codice tutti i possibili valori come argomenti per un metodo. Si prevede che alcuni argomenti consentano al metodo di generare un'eccezione. Tali cose possono testare automaticamente creati per. Valori statici come una stringa vuota che viene restituita in alcuni casi possono anche essere testati automaticamente.


2
Questo è un test casuale utile solo per il test del percorso negativo (eccezioni, input non validi, crash-time, timeout). Credo che abbiano generato test anche per un percorso felice, e ciò richiede più progettazione, non solo il lancio di uno strumento di analisi statica.
dzieciou,

E so che ci sono modi e strumenti per generare test per un percorso felice (ad esempio, vedi questa risposta ), ma sono interessato a come è stato fatto in questo caso particolare di Guava
dzieciou
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.