Limiti di esplorazione
PexSettingsAttributeBase è la classe di base astratta per l'impostazione dei limiti come attributi. Vedere Impostazioni a cascata per una panoramica delle impostazioni di IntelliTest.
È possibile modificare le impostazioni usando le proprietà denominate di questo attributo e i suoi derivati:
[PexClass(MaxRuns = 10)]
public partial class FooTest {...}
- Limiti della risoluzione di vincoli
- MaxConstraintSolverTime: numero di secondi che il risolutore di vincoli ha a disposizione per individuare gli input che fanno sì che venga seguito un nuovo e diverso percorso di esecuzione.
- MaxConstraintSolverMemory: dimensione in megabyte che il risolutore di vincoli può usare per individuare gli input.
- Limiti del percorso di esplorazione
- MaxBranches: numero massimo di diramazioni che si possono includere in un percorso di esecuzione singola.
- MaxCalls: numero massimo di chiamate che si possono effettuare durante un percorso di esecuzione singola.
- MaxStack: dimensione massima dello stack in qualsiasi momento durante un percorso di esecuzione singola, misurata come numero di frame di chiamata attivi.
- MaxConditions: numero massimo di condizioni sugli input che possono essere controllati durante un percorso di esecuzione singola.
- Limiti di esplorazione
- MaxRuns: numero massimo di esecuzioni che verranno tentate durante un'esplorazione.
- MaxRunsWithoutNewTests: numero massimo di esecuzioni consecutive senza che venga generato un nuovo test.
- MaxRunsWithUniquePaths: numero massimo di esecuzioni con percorsi di esecuzione singola che verranno tentate durante un'esplorazione.
- MaxExceptions: numero massimo di eccezioni che si possono trovare per una combinazione di tutti i percorsi di esecuzione individuati.
- Impostazioni di generazione di codice per il gruppo di test
- TestExcludePathBoundsExceeded: se è true, i percorsi di esecuzione che superano uno dei limiti di percorso (MaxCalls, MaxBranches, MaxStack, MaxConditions) vengono ignorati.
- TestEmissionFilter: indica in quali circostanze IntelliTest deve creare i test.
- TestEmissionBranchHits: controlla il numero di test creati da IntelliTest.
MaxConstraintSolverTime
Numero di secondi che il risolutore di vincoli ha a disposizione per calcolare gli input che determinano l'uso di un nuovo e diverso percorso di esecuzione. Si tratta di un'opzione di PexSettingsAttributeBase e i relativi tipi derivati.
Maggiore è la profondità dell'esplorazione di IntelliTest nei percorsi di esecuzione di un programma, più complessi sono i sistemi di vincoli creati da IntelliTest dal flusso di controllo e dal flusso di dati del programma. In base alla limitazione del tempo, è possibile impostare questo valore in modo da consentire a IntelliTest di dedicare più o meno tempo all'individuazione dei nuovi percorsi di esecuzione.
In genere, il timeout è dovuto al fatto che IntelliTest sta tentando di trovare una soluzione per un sistema di vincoli che non ha una soluzione, ma non è in grado di rilevare questo fatto. Poiché questo è il caso più comune di timeout, può non avere senso aumentare il limite.
MaxConstraintSolverMemory
Numero di megabyte che il risolutore di vincoli ha a disposizione per calcolare gli input che determinano l'uso di un nuovo e diverso percorso di esecuzione. Si tratta di un'opzione di PexSettingsAttributeBase* e i relativi tipi derivati.
Maggiore è la profondità dell'esplorazione di IntelliTest nei percorsi di esecuzione di un programma, più complessi sono i sistemi di vincoli creati da IntelliTest dal flusso di controllo e dal flusso di dati del programma. In base alla memoria disponibile nel computer, è possibile impostare questo valore in modo da consentire a IntelliTest di affrontare i sistemi di vincolo più complessi.
In genere, il timeout è dovuto al fatto che IntelliTest sta tentando di trovare una soluzione per un sistema di vincoli che non ha una soluzione, ma non è in grado di rilevare questo fatto. Poiché questa è la causa più comune di una situazione di memoria insufficiente, può non avere senso aumentare il limite.
MaxBranches
Numero massimo di diramazioni che si possono includere in un percorso di esecuzione singola.
La motivazione alla base di questo limite di esplorazione è limitare la lunghezza di qualsiasi percorso di esecuzione che IntelliTest esplora durante la generazione di input. In particolare, evita che IntelliTest smetta di rispondere se il programma entra in un ciclo infinito.
Ogni diramazione condizionale e non condizionale del codice eseguito e monitorato viene conteggiata in base a questo limite, incluse le diramazioni che non dipendono dagli input del test con parametri.
Ad esempio, il codice seguente usa le diramazioni nell'ordine di 100:
for (int i=0; i<100; i++) { }
MaxCalls
Numero massimo di chiamate che si possono effettuare durante un percorso di esecuzione singola.
La motivazione alla base di questo limite di esplorazione è limitare la lunghezza di qualsiasi percorso di esecuzione che IntelliTest esplora durante la generazione di input. In particolare, evita che IntelliTest smetta di rispondere se il programma chiama un metodo in modo ricorsivo un numero infinito di volte, causando un overflow dello stack che IntelliTest può non essere in grado di gestire.
Ogni chiamata (diretta, indiretta, virtuale, collegamento) del codice eseguito e monitorato viene conteggiata in base a questo limite.
MaxStack
Dimensione massima dello stack in qualsiasi momento durante un percorso di esecuzione singola, misurata in base al numero di frame di chiamata attivi.
La motivazione alla base di questo limite di esplorazione è limitare la dimensione dello stack di qualsiasi percorso di esecuzione che IntelliTest esplora durante la generazione di input. In particolare, evita che IntelliTest usi tutto lo spazio disponibile nello stack, causando un overflow dello stack che IntelliTest può non essere in grado di gestire.
MaxConditions
Numero massimo di condizioni sugli input che possono essere controllati durante un singolo percorso di esecuzione.
La motivazione alla base di questo limite di esplorazione è limitare la complessità di qualsiasi percorso di esecuzione che IntelliTest esplora durante la generazione di input. Ogni diramazione condizionale che dipende dagli input del test con parametri viene conteggiata in base a questo limite.
Ad esempio, ogni percorso nel codice seguente usa n + 1 condizioni:
[PexMethod]
void ParameterizedTest(int n)
{
for (int i=0; i<n; i++) { // conditions are "0<n", "1<n", ..., "!(n<n)"
...
}
for (int i=0; i<100; i++) { // irrelevant for MaxConditions, since conditions do not depend on input
...
}
}
MaxRuns
Numero massimo di esecuzioni che IntelliTest proverà durante l'esplorazione di un test.
La motivazione alla base di questo limite di esplorazione è che qualsiasi codice che contiene cicli o ricorsioni potrebbe avere un numero infinito di percorsi di esecuzione, quindi IntelliTest deve essere limitato durante la generazione di input.
Le due impostazioni MaxRuns e MaxRunsWithUniquePaths sono correlate nel modo seguente:
- IntelliTest chiamerà un metodo di test con parametri al massimo MaxRuns volte con input di test diversi.
- Se il codice eseguito è deterministico, IntelliTest userà un percorso di esecuzione diverso ogni volta. Tuttavia, in alcune condizioni il codice eseguito può seguire un percorso di esecuzione già usato in precedenza, con input diversi.
- IntelliTest conta i percorsi di esecuzione univoca che trova: questo numero è limitato dall'opzione MaxRunsWithUniquePaths.
MaxRunsWithoutNewTests
Numero massimo di esecuzioni consecutive senza che venga generato un nuovo test.
Benché IntelliTest spesso sia in grado di individuare rapidamente molti input di test interessanti, dopo un certo tempo non trova più nuovi input di test e non genera altri unit test. Questa opzione di configurazione definisce un limite per il numero di tentativi consecutivi che IntellTtest può effettuare senza creare un nuovo test. Raggiunto il limite, l'esplorazione viene interrotta.
MaxRunsWithUniquePaths
Numero massimo di percorsi univoci che IntelliTest prenderà in considerazione durante un'esplorazione.
La motivazione alla base di questo limite di esplorazione è che qualsiasi codice che contiene cicli o ricorsioni potrebbe avere un numero infinito di percorsi di esecuzione, quindi IntelliTest deve essere limitato durante la generazione di input.
Le due impostazioni MaxRuns e MaxRunsWithUniquePaths sono correlate nel modo seguente:
- IntelliTest chiamerà un metodo di test con parametri al massimo MaxRuns volte con input di test diversi.
- Se il codice eseguito è deterministico, IntelliTest userà un percorso di esecuzione diverso ogni volta. Tuttavia, in alcune condizioni il codice eseguito può seguire un percorso di esecuzione già usato in precedenza, con input diversi.
- IntelliTest conta i percorsi di esecuzione univoca che trova: questo numero è limitato dall'opzione MaxRunsWithUniquePaths.
MaxExceptions
Numero massimo di eccezioni che possono essere rilevate prima che l'esplorazione venga interrotta.
La motivazione alla base di questo limite di esplorazione è interrompere l'esplorazione del codice che contiene molti bug. Se IntelliTest trova troppi errori nel codice, l'esplorazione si arresta.
TestExcludePathBoundsExceeded
I percorsi di esecuzione che superano i limiti di percorso configurati, MaxCalls, MaxBranches, MaxStack e MaxConditions, vengono ignorati.
La motivazione alla base di questo limite di esplorazione è gestire i test potenzialmente non terminati. Quando IntelliTest raggiunge un limite di esplorazione come MaxCalls, MaxBranches, MaxStack o MaxConditions, presuppone che il test non sarà un processo non terminato e non causerà un overflow dello stack in un secondo momento. Questi test case possono causare problemi agli altri framework di test e questo attributo consente di impedire a IntelliTest di generare test case per i processi potenzialmente non terminati oppure test case che causeranno un overflow dello stack.
TestEmissionFilter
Indica i tipi di test che devono essere creati da IntelliTest. I valori possibili sono:
- All: vengono generati test per qualsiasi attività, incluse le violazioni delle assunzioni.
- FailuresAndIncreasedBranchHits (impostazione predefinita): vengono generati test per tutti gli errori univoci e ogni volta che un test case incrementa il code coverage, in base al controllo di TestEmissionBranchHits.
- FailuresAndUniquePaths: vengono generati test per tutti gli errori rilevati da IntelliTest e per ogni input di test che comporta un percorso di esecuzione univoca.
- Failures: vengono generati test solo per gli errori.
TestEmissionBranchHits
In base all'impostazione corrente di TestEmissionFilter, IntelliTest genera nuovi test case quando riguardano una diramazione del programma che non è stata analizzata in precedenza.
L'impostazione TestEmissionBranchHits determina se IntelliTest deve solo considerare se una diramazione è stata analizzata (TestEmissionBranchHits = 1), se un test ha eseguito l'analisi una o due volte (TestEmissionBranchHits = 2) e così via.
TestEmissionBranchHits = 1 produce un gruppo di test molto piccolo che esamina tutte le diramazioni che IntelliTest è in grado di raggiungere. In particolare, questo gruppo di test esamina anche tutti i blocchi di base e le istruzioni che raggiunge.
Il valore predefinito per questa opzione è TestEmissionBranchHits=2, che genera un gruppo di test più espressivo e più adatto per rilevare i futuri errori di regressione.
Vuoi lasciarci dei commenti?
Pubblicare idee e richieste di funzionalità nella community degli sviluppatori.