Verifica che una proprietà non genera un'eccezione un test unitario valido?

4

Sto scrivendo i test per la seguente classe:

public class Foo : INotifyPropertyChanged
{
  private int _failCount;
  private int _totalCount;
  public double FailRate
  {
     get
     {
        double returnValue = 0.0;
        if (_totalCount > 0)
        {
           returnValue = (double) _failCount / _totalCount * 100;
        }
        return returnValue;
     }
  }

  public int FailCount
  {
     get { return _failCount; }
     set
     {
        if (value != _failCount)
        {
           _failCount = value;
           onNotifyPropertyChanged();
           onNotifyPropertyChanged("FailRate");
        }
     }
  }
  public int TotalCount
  {
     get { return _totalCount; }
     set
     {
        if (value != _totalCount)
        {
           _totalCount = value;
           onNotifyPropertyChanged();
           onNotifyPropertyChanged("FailRate");
        }
     }
  }
  protected virtual void onNotifyPropertyChanged([CallerMemberName]string name = null)
  {
     if (PropertyChanged != null)
     {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
     }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

Stavo scrivendo alcuni test per la proprietà FailRate , e mi è venuto in mente che probabilmente dovrei assicurarmi che ottenere FailRate non generi un'eccezione. Il caso in cui qualcuno (probabilmente io) rimuove il controllo if (_totalCount > 0) , e poi ottiene FailRate genera un DivideBy0Exception .

Quindi ho scritto un test per accertarmi che ottenere FailRate non generi un'eccezione.

[TestMethod]
public void GettingTheFailRateWhenTheTotalCountIsZeroDoesNotThrowAnException()
{
   Defect defect = new Defect();
   defect.FailCount = 0;
   defect.TotalCount = 0;
   double dummy = defect.FailRate;
}

Tuttavia, quel test non ha un controllo esplicito e passerà finché la proprietà non genera un'eccezione.

Sta solo verificando che una proprietà non genera un'eccezione come test "valido"?

    
posta CurtisHx 19.02.2015 - 20:48
fonte

2 risposte

4

Secondo me, sì. Tutta la logica, ovvero tutto il codice condizionale, può essere testata. E anche questo è un caso limite.

A proposito, questo codice non è thread-safe - _totalCount potrebbe cambiare tra la lettura del suo valore in se e in realtà la divisione da esso. Ma la sicurezza del thread potrebbe non essere tra le tue esigenze.

Per quanto riguarda il controllo esplicito o meno, è una questione di gusti. Potresti prendere DivideByZeroException e chiamare Assert.Fail (o come si chiama) nel blocco catch . Più verboso, ma molto chiaro per il lettore. Come collega coder, sarei ok in ogni caso.

E che la routine da testare è così semplice? Mescolando unità imperiali e metriche si è schiantato una sonda spaziale del valore di $ 125 milioni, e questo non sembra un bug molto sofisticato.

Forse qualcuno scriverà un pezzo di codice simile per questo progetto - calcolando il tempo stimato rimasto, ad esempio - e aver visto questo test impedirà un lasso mentale ricordando che ci sono zero in questo mondo e zero non può essere diviso per? Non può far male ...

    
risposta data 19.02.2015 - 22:17
fonte
7

Is just checking that a property doesn't throw an exception a "valid" test?

Sì, può essere. In questo esempio, verificherei esplicitamente che FailRate restituisca 0 per quell'input.

E certamente convaliderò che l'input errato sia gestito correttamente scrivendo il test. Probabilmente scriverei anche un test con un valore negativo per assicurarmi che fosse > 0 piuttosto che == 0 poiché impiega 10 secondi e meglio codifica i requisiti nel test.

    
risposta data 19.02.2015 - 21:03
fonte

Leggi altre domande sui tag