Complexity Theory of Randomised Testing
Questo articolo stabilisce le prime fondamenta della teoria della complessità per il testing randomizzato modellando i generatori come trasduttori di Turing per caratterizzare i limiti della generazione di input efficiente e con vincoli di spazio, rivelando distinzioni fondamentali tra la complessità di generazione e quella di decisione e dimostrando che la generazione efficiente richiede schemi di certificazione specifici e non può essere derivata compositivamente da predicati logici generali.
Articolo originale sotto licenza CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Questa è una spiegazione generata dall'IA dell'articolo qui sotto. Non è stata scritta né approvata dagli autori. Per precisione tecnica, consulta l'articolo originale. Leggi il disclaimer completo
Immagina di essere uno sviluppatore di videogiochi che vuole testare un nuovo mondo, enorme. Vuoi assicurarti che il tuo gioco non vada in crash, quindi hai bisogno di un robot capace di sputare fuori milioni di livelli, personaggi e oggetti casuali per vedere se qualcosa si rompe. Questo robot si chiama generatore. Per anni, gli sviluppatori hanno costruito questi robot a mano, perfezionandoli finché non funzionavano abbastanza bene. Ma nessuno conosceva davvero i limiti teorici di ciò che questi robot potevano effettivamente fare. Potevano generare qualsiasi livello possibile? Potevano farlo abbastanza velocemente da essere utili?
Un team di ricercatori dell'Imperial College London e della Kaihong ha deciso di mettere questi robot sotto un microscopio usando la Teoria della Complessità — la matematica che studia quanto siano difficili i problemi da risolvere. Non si sono limitati a guardare il codice; hanno modellato i robot come "macchine di Turing" (i computer teorici definiti) che mangiano bit di dati casuali e sputano fuori livelli di gioco. Ecco cosa hanno scoperto.
La lista del "Cosa può essere fatto"
Per prima cosa, si sono chiesti: Qual è il limite assoluto di ciò che un generatore può produrre?
Hanno scoperto che, se si fornisce a un generatore tempo e memoria illimitati, esso può produrre esattamente lo stesso insieme di cose che un computer standard può riconoscere. Nel mondo della matematica, questo è chiamato linguaggi Ricorsivamente Enumerabili (RE).
- La buona notizia: Se un insieme di input (come "tutti i programmi C validi") può essere riconosciuto da un computer, un generatore può teoricamente produrli.
- La cattiva notizia: Se un insieme di input è troppo strano per essere riconosciuto da un computer (come "tutti i programmi che non si fermeranno mai"), nessun generatore potrà mai produrli. Non è un bug nel tuo codice; è una legge fondamentale dell'universo. Non puoi costruire un robot che sputi fuori ogni possibile ciclo infinito, perché la matematica dice che è impossibile elencarli tutti.
Il problema del "Dosso"
Successivamente, si sono chiesti: E se avessimo bisogno che il generatore sia veloce? Nel mondo reale, non puoi aspettare un milione di anni per un caso di test. Hai bisogno di risultati in pochi secondi.
I ricercatori hanno scoperto un colpo di scena sorprendente: Essere in grado di controllare se qualcosa è valido non è la stessa cosa che essere in grado di creare qualcosa di valido.
- L'esempio del SAT Solver: Immagina un puzzle in cui devi trovare una specifica combinazione di interruttori per accendere una luce. Controllare se una combinazione funziona è difficile (è "NP-completo"). Ma i ricercatori hanno dimostrato che puoi costruire un robot veloce che genera queste combinazioni funzionanti. Funziona "piantando un testimone": il robot sceglie segretamente una combinazione vincente per prima, poi costruisce il puzzle attorno ad essa.
- La trappola delle collisioni di Hash: Tuttavia, hanno anche dimostrato che per alcuni problemi, anche se controllare la risposta è facile, creare la risposta potrebbe essere impossibile da fare velocemente. Hanno esaminato le "collisioni di hash" (trovare due diversi input che producono la stessa impronta digitale). Controllare se due impronte corrispondono è velocissimo. Ma trovare una coppia che corrisponda? Se potessi costruire un robot veloce per fare questo, distruggeresti la sicurezza di quasi tutta la crittografia moderna.
- Il verdetto: A meno che il mondo della crittografia non venga violato, esistono problemi in cui controllare è facile, ma generare è difficile. Non puoi semplicemente desiderare un generatore veloce; a volte, la matematica semplicemente non lo permette.
Il vincolo della "Memoria" (Fuzzing e Feedback)
Molti strumenti di testing moderni, come i "fuzzer", non si limitano a sputare dati casuali; ricordano ciò che hanno provato prima. Se un test fa crashare il programma, il fuzzer lo ricorda e prova a modificare l'input per farlo crashare di nuovo. È come un detective che impara da ogni indizio.
I ricercatori hanno modellato questo processo come un generatore con una quantità limitata di memoria (spazio). Hanno scoperto che anche con questa "memoria" e un ciclo di feedback, il generatore è comunque limitato.
- Il limite: Se il generatore ha una quantità polinomiale di memoria (che copre quasi tutti gli strumenti pratici), può generare solo cose che appartengono a una classe chiamata PSPACE.
- Il controllo della realtà: Questo significa che anche i più intelligenti e affamati di memoria strumenti di fuzzing non possono generare input per problemi che sono "EXPTIME-completi" (problemi che richiedono un tempo esponenziale per essere risolti). Se un problema è troppo complesso per essere risolto da una macchina PSPACE, nessun amount di feedback o memoria aiuterà un generatore a creare casi di test per esso.
Il mito della "Componibilità"
Infine, hanno affrontato un sogno degli ingegneri del software: Possiamo costruire un "set Lego" di generatori?
Immagina di avere uno strumento in cui dici: "Voglio un generatore per A E B", oppure "Voglio un generatore per NON A", e lo strumento combina automaticamente questi elementi in un nuovo generatore veloce.
Il documento fornisce un duro NO a questo sogno, secondo le assunzioni standard.
- La regola: Non puoi combinare automaticamente i generatori usando "E" (congiunzione) o "NON" (negazione) e garantire che saranno ancora veloci.
- Perché? Se potessi farlo, risolveresti problemi che si ritiene siano attualmente impossibili da risolvere rapidamente.
- L'eccezione: Puoi farlo per tipi di logica molto semplici e ristretti (come "Datalog lineare" o problemi "NL"), ma non appena aggiungi "E" o "NON" complessi, la magia si rompe. Se vuoi combinare regole complesse, devi rinunciare alle garanzie di velocità o accettare che il tuo generatore potrebbe semplicemente "provare e fallire" (rejection sampling) finché non ha fortuna.
Il quadro generale
Il documento conclude che generare dati è una sfida distinta e spesso più difficile rispetto al decidere se un dato è valido.
- Cosa è stato dimostrato: Hanno dimostrato che l'insieme di tutte le cose generabili è esattamente l'insieme delle cose ricorsivamente enumerabili. Hanno dimostrato che esistono generatori veloci per certi problemi difficili (come il SAT) ma non per altri (come le collisioni di hash, assumendo che la crittografia sia sicura). Hanno dimostrato che gli strumenti basati sul feedback sono limitati da PSPACE.
- Cosa è stato escluso: Hanno escluso la possibilità di una libreria universale, veloce e compositiva che possa gestire qualsiasi combinazione logica di regole. Hanno escluso l'idea che "facile da controllare" significhi sempre "facile da generare".
In breve, se stai costruendo un robot di testing, non puoi solo desiderare che sia veloce e intelligente. La matematica ha tracciato una linea nella sabbia: alcune cose sono impossibili da generare, alcune sono impossibili da generare velocemente, e alcune non puoi mescolare e abbinare senza rompere la velocità. Ma ora sappiamo esattamente dove si trovano quelle linee.
Sommerso dagli articoli nel tuo campo?
Ricevi digest giornalieri degli articoli più recenti corrispondenti alle tue parole chiave di ricerca — con riassunti tecnici, nella tua lingua.