In un progetto in cui sono presenti requisiti non funzionali che specificano il tempo massimo di esecuzione per un'azione specifica, QA deve verificare le prestazioni di questa azione su una macchina dedicata utilizzando hardware preciso sotto carico preciso, sia l'hardware che il carico sono specificati nei requisiti.
D'altra parte, alcune errate modifiche al codice sorgente potrebbero avere un impatto negativo sulle prestazioni. Notare questo impatto negativo in anticipo , prima il codice sorgente raggiunge il controllo del codice sorgente ed è verificato dal dipartimento QA, potrebbe essere utile in termini di tempo perso dal reparto QA che segnala il problema, e dallo sviluppatore che lo aggiusta più volte più tardi.
Per fare ciò, è una buona idea:
-
Per utilizzare i test unitari per avere un'idea del tempo impiegato per eseguire la stessa azione n volte,
-
Per utilizzare timeout per test tramite l'attributo
[TestMethod, Timeout(200)]
in C #?
Mi aspetto diversi problemi con questo approccio:
-
Concettualmente , i test unitari non sono proprio per questo: ci si aspetta che testino una piccola parte di un codice, nient'altro: né il controllo di un requisito funzionale, né un test di integrazione , né un test delle prestazioni.
-
Il timeout del test dell'unità in Visual Studio misura davvero cosa ci si aspetta che venga misurato, tenendo conto che l'inizializzazione e la pulizia sono inesistenti per quei test o sono troppo brevi per influenzare i risultati?
-
Misurare le prestazioni in questo modo è brutto. Eseguire un benchmark su qualsiasi macchina¹ indipendentemente dall'hardware, dal carico, ecc. È come fare un benchmark che mostri che uno il prodotto del database è sempre più veloce di un altro. D'altra parte, non mi aspetto che questi test unitari siano un risultato definitivo, né qualcosa che viene utilizzato dal dipartimento QA . Questi test unitari saranno usati solo per dare un'idea generale delle prestazioni attese, ed essenzialmente per avvisare lo sviluppatore che la sua ultima modifica ha rotto qualcosa, influenzando gravemente le prestazioni .
-
TDD è impossibile per quei test. Come fallirebbe, in primo luogo, prima di iniziare a implementare il codice?
-
Troppi test delle prestazioni influenzeranno il tempo richiesto per eseguire i test, quindi questo approccio è limitato solo a azioni brevi.
Tenendo conto di questi problemi, trovo ancora interessante utilizzare questi test unitari se combinati con le metriche delle prestazioni reali del dipartimento QA.
Mi sbaglio? Ci sono altri problemi che rendono totalmente inaccettabile l'uso dei test unitari per questo?
Se ho torto, qual è il modo corretto per avvisare lo sviluppatore che un cambiamento nel codice sorgente ha seriamente compromesso le prestazioni, prima che il codice sorgente raggiunga il controllo del codice sorgente e sia verificato dal dipartimento QA?
¹ In realtà, i test unitari dovrebbero funzionare solo su PC per sviluppatori con prestazioni hardware paragonabili, il che riduce il divario tra le macchine più veloci che non saranno mai in grado di fallire il test delle prestazioni e le macchine più lente che non riuscire mai a passarlo.
² Per azione intendo un pezzo di codice piuttosto breve che impiega alcuni millisecondi per essere eseguito.