domenica 9 settembre 2012

Come scrivere un test unitario

Quando si scrive un test è molto importante basarsi su delle semplici regole, il test deve essere:
  • semplice;
  • atomico;
  • veloce;
  • consistente;
Semplice: deve essere composto da poche righe, non deve contenere logica.

Atomico: non deve dipendere da altri test, non deve dipendere dall'ordine di esecuzione, deve verificare solo un concetto per volta.

Veloce: il tempo di esecuzione si deve aggirare intorno al secondo, quando la batteria di test inizierà ad avere un numero considerevole di elementi sarà molto importante che i vostri test abbiano un tempo di esecuzione molto breve.

Consistente: tutte le volte che viene eseguito deve restituire lo stesso risultato.

Esempi di test che non rispettano le regole prima citate:

[Test]
public void Test()
{
   if (_sut.DoSomething(DateTime.Now))
   {
      Assert.AreEqual(10, _sut.ReturnResult());
   }
   else
   {
      Assert.AreEqual(9, _sut.ReturnResult());
   }
}

Cosa abbiamo violato:
  • il test contiene logica;
  • il test puó dare risultati diversi;
[Test]
public void Test()
{
   _sut.DoSomething();
   Assert.AreEqual(10, _sut.Filed1);
   Assert.AreEqual(12, _sut.Filed2);
   _sut.DoSomething2();
   Assert.AreEqual(12, _sut.Filed1);
}

Cosa abbiamo violato:
  • il test verifica piú condizioni
  • il test verifica piú comportamenti
[Test]
public void Test1()
{
   _field1 = 10;
   // implementazione del test
}

[Test]
public void Test2()
{
   _sut.DoSomething();
   Assert.AreEqual(_field1, _sut.Filed1);
}

Cosa abbiamo violato:
  • il test2 dipende dal test1;
  • il test può dare risultati diversi;

[Test]
public void Test()
{
   for (int i = 1; i < 10; i++)
   {
      _sut.LoadDataFromDatabase(i);
      Assert.AreEqual(10, _sut.Filed1);
   }
}

Cosa abbiamo violato:
  • il test verifica più condizioni;
  • il test risulterà lento perché si connette ad un database esterno;
  • il test potrebbe fallire se il database non é raggiungibile;
  • il test potrebbe dare risultati diversi se i dati sono stati modificati nel database;