Comprensione dei test delle unità per condizioni che cambiano dinamicamente

1

Stavo cercando di capire come scrivere i test unitari per alcuni giorni. Sono confuso con i seguenti scenari nel codice esistente.

Nella prima funzione il valore massimo cambia a seconda dell'oggetto creato in fase di esecuzione ma nel secondo caso è una costante.

NOTA: le seguenti funzioni non sono correlate. Questi sono due diversi scenari.

SomeFunction1(arg1,....)
{
  if(arg1 > someObject.MaxAllowedValue)
  {
     throw exception;
  }
}
SomeFunction2(arg1,....)
{
  if(arg1 > maxAllowedValue)
  {
     throw exception;
  }
}

Sto provando a verificare se la funzione genera un'eccezione quando viene superato il valore massimo.

Il test dell'unità rimane lo stesso in entrambi i casi o è diverso?

    
posta mssrivatsa 30.08.2013 - 15:51
fonte

2 risposte

1

Ciò dipende in qualche modo da dove proviene someObject e da come cambia il suo valore di proprietà. Ma supponendo che someObject.MaxAllowedValue e maxAllowedValue abbiano lo stesso valore, il test rimarrà lo stesso. Ricorda che stai testando il comportamento di SomeFunctionX , non i dettagli di implementazione.

    
risposta data 30.08.2013 - 15:57
fonte
1

TL; DR: 1) refactoring del codice 2) mock someObject

Rifatta il tuo codice

Congraz, sei solo un test unitario da alcuni giorni e hai imparato uno degli aspetti più importanti dei test unitari (specialmente se fatto all'inizio del processo di sviluppo):

The act of writing a unit test is more an act of design 
than of verification.  

(Uncle Bob, Agile Software Development, Principles, Patterns, and Practices)

Quindi se SomeFunction1 e SomeFunction2 hanno funzionalità e preoccupazioni strettamente correlate, li rifattori in un unico metodo. In caso contrario, è necessario scrivere anche test di unità diversi in quanto coprono diverse funzionalità / problemi.

Mock

Se il tuo codice contiene ancora

if(arg1 > someObject.MaxAllowedValue)

pensa se il tuo attuale test unitario dovrebbe anche testare someObjects (probabilmente no). In caso contrario, dovresti prenderlo in giro, ad es. con EasyMock ( questo cheat sheet è utile per junit e EasyMock ).

Aggiornamento: poiché stai testando un'altra classe, non quella di someObject, non importa che alcune modifiche di Object in fase di esecuzione. Tutto quello che devi fare è coprire tutti i possibili comportamenti della tua implementazione sotto test con i tuoi test, ad es.

  • arg1 == someObject.MaxAllowedValue
  • arg1 == someObject.MaxAllowedValue + 1
risposta data 30.08.2013 - 16:33
fonte

Leggi altre domande sui tag