In un progetto in cui vi sono requisiti non funzionali che specificano il tempo massimo di esecuzione per un'azione specifica, il QA deve verificare le prestazioni di questa azione su una macchina dedicata utilizzando hardware preciso con carico preciso, sia l'hardware che il carico sono specificati nei requisiti.
D'altra parte, alcune modifiche errate al codice sorgente possono influire negativamente sulle prestazioni. Notare presto questo impatto negativo , prima che il codice sorgente raggiunga il controllo del codice sorgente e sia verificato dal dipartimento di controllo qualità, potrebbe essere utile in termini di tempo perso dal dipartimento di controllo qualità che segnala il problema e dallo sviluppatore che lo risolve più volte dopo.
Per fare questo, è una buona idea:
Per utilizzare i test unitari per avere un'idea del tempo impiegato per eseguire la stessa azione² n volte,
Per utilizzare il timeout per test tramite l'
[TestMethod, Timeout(200)]
attributo in C #?
Mi aspetto diversi problemi con questo approccio:
Concettualmente , i test unitari non sono proprio per questo: si prevede che testino una piccola parte di un codice, niente di più: né il controllo di un requisito funzionale, né un test di integrazione, né un test delle prestazioni.
Il timeout del test unitario in Visual Studio misura davvero ciò che ci si aspetta venga misurato, tenendo conto del fatto che l'inizializzazione e la pulizia sono inesistenti per tali test o sono troppo brevi per influire sui 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 un prodotto di database è sempre più veloce di un altro. D'altra parte, non mi aspetto che i test unitari siano un risultato definitivo, né qualcosa che viene utilizzato dal dipartimento di controllo qualità . Tali unit test verranno utilizzati solo per dare un'idea generale delle prestazioni previste e essenzialmente per avvisare lo sviluppatore che la sua ultima modifica ha rotto qualcosa, compromettendo gravemente le prestazioni .
Test Driven Development (TDD) è impossibile per questi test. Come avrebbe fallito, in primo luogo, prima di iniziare a implementare il codice?
Troppi test delle prestazioni influenzeranno il tempo necessario per eseguire i test, quindi questo approccio è limitato solo alle azioni brevi.
Tenendo conto di questi problemi, trovo ancora interessante utilizzare tali test unitari se combinati con le metriche delle prestazioni reali del dipartimento di controllo qualità.
Ho sbagliato? Ci sono altri problemi che rendono totalmente inaccettabile l'uso di unit test per questo?
In caso di errore, qual è il modo corretto per avvisare lo sviluppatore che una modifica del codice sorgente ha influito gravemente sulle prestazioni, prima che il codice sorgente raggiunga il controllo del codice sorgente e sia verificato dal dipartimento QA?
¹ In realtà, i test unitari dovrebbero essere eseguiti solo su PC sviluppatori con prestazioni hardware comparabili, 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 riusciranno mai a superarlo.
² Per azione intendo un pezzo di codice piuttosto breve che impiega alcuni millisecondi per essere eseguito.